Skip to content

Latest commit

 

History

History
100 lines (93 loc) · 7.14 KB

File metadata and controls

100 lines (93 loc) · 7.14 KB

Поиск по блогам

Общие замечания по выдаче:

  1. Блоги в данном контексте - синоним авторских колонок (АК). Сюда же включены и рубрики, куда могут публиковаться статьи из разных АК (впрочем, могут быть и статьи, размещенные исключительно в рубриках).
  2. Запрос поддерживает пагинацию. На одной странице в поиске по названиям статей выдается по 30 результатов, в поиске по содержанию статей - по 10 результатов. Максимально возможное общее количество результатов равно 1000.
  3. В ответе сервера есть поле attrs, содержащее список полей в выдаче matches. Каждое поле обозначено именем и целочисленным типом. Например, "1" - Int, "7" - String.
  4. Запрос поиска по содержанию статей очень тяжелый, поскольку в ответ приходят полные тексты. Даже несмотря на ограничение в 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                   # степень релевантности (влияет на порядковый номер в выдаче - чем больше, тем выше)
    },
    ...
]