Общие замечания по выдаче:
- Блоги в данном контексте - синоним авторских колонок (АК). Сюда же включены и рубрики, куда могут публиковаться статьи из разных АК (впрочем, могут быть и статьи, размещенные исключительно в рубриках).
- Запрос поддерживает пагинацию. На одной странице в поиске по названиям статей выдается по 30 результатов, в поиске по содержанию статей - по 10 результатов. Максимально возможное общее количество результатов равно 1000.
- В ответе сервера есть поле attrs, содержащее список полей в выдаче matches. Каждое поле обозначено именем и целочисленным типом. Например, "1" - Int, "7" - String.
- Запрос поиска по содержанию статей очень тяжелый, поскольку в ответ приходят полные тексты. Даже несмотря на ограничение в 10 статей на страницу, размер ответа может достигать нескольких мегабайт, будьте внимательны.
{
attrs: { # список полей в выдаче
{attr}: Int,
...
},
error: String, # текст ошибки, если есть
fields: [ # список полей, по которым осуществляется поиск
...: String,
...
],
matches: [ # список найденных результатов
{
...
},
...
],
time: Float, # длительность поиска в секундах
total: Int, # общее количество результатов
total_found: Int, # общее количество найденных результатов (но получить можно максимум total)
type: String, # категория поиска
warning: String, # предупреждение, если есть
words: {
{word}: {
docs: Int, # количество найденных совпадений по данному слову
hits: Int # количество найденных уникальных совпадений по данному слову
},
...
}
}
Запрос
GET /search-blog.json?q={query}&blogs={blogs}&t={type}&alg={algorithm}&period={period}&sortby={sort}&page={page}&onlymatches={0|1}
Параметры
query - строка поиска. В качестве разделителя используется "+"
blogs - в каких блогах/рубриках искать (необязательный; по-умолчанию во всех). Несколько блогов/рубрик передаются отдельными параметрами: чтобы искать одновременно в рубриках "Издательство «Эксмо»" и "Издательство «Азбука»", надо передать в запросе их id: ...&blogs=971&blogs=976&... Если нужен поиск только по блогам (то есть за исключением рубрик), надо передать ...&blogs=a&... Смешивать эти варианты не рекомендуется
type - где искать (необязательный; по-умолчанию t)
* t - только в названиях статей
* m - по содержанию статьи
algorithm - как искать (необязательный; по-умолчанию 0)
* 0 - поиск по словам запроса
* 1 - поиск фразы целиком (как есть)
period - за какой период (необязательный; по-умолчанию 0)
* 0 - за все время
* любое N > 0 - за последние N суток (предусмотренные значения - 1, 7, 31, 180, 365)
sort - сортировка (необязательный; по-умолчанию rel)
* rel - по релевантности
* dat - по актуальности
page - номер страницы (необязательный; по-умолчанию 1)
onlymatches - выдавать только содержимое массива matches (необязательный; по-умолчанию 0)
Пример
/search-blog.json?q=фантастика&t=t&onlymatches=1 - поиск статей со словом "фантастика" в названии по всем блогам за все время
Ответ (при запросе с параметром onlymatches=1)
[
{
blog_ids: [ # список id блогов/рубрик, в которых размещена данная статья
...: Int,
...
],
blog_is_community: [ # список того, являются вышеуказанные блоги рубриками (на практике совершенно бесполезное поле, если блогов больше одного)
...: Boolean,
...
],
date_of_add: Long, # дата создания статьи (UNIX-таймштамп)
doc: Int, # ?
is_opened: Boolean, # статья опубликована (не черновик)
likes_count: Int, # количество лайков (aka "Спасибо")
message_text: String|null, # текст статьи (поле есть, только если это поиск по содержанию статей)
tags: String, # теги
topic_id: Int, # id статьи
topic_name: String, # название статьи
topic_rating: [
...: Float # рейтинг статьи (нелинейно зависит от количества лайков, количества подписчиков, количества комментариев и того, как давно статья была опубликована; чаще всего 0)
],
views: Int, # количество просмотров (значение некорректно, не стоит его принимать во внимание)
weight: Int # степень релевантности (влияет на порядковый номер в выдаче - чем больше, тем выше)
},
...
]