2014-11-24 1 views
5

Возможно ли реализовать надежный поисковый запрос результатов поиска elasticsearch, если несколько документов имеют одинаковые баллы?Пейджинг в поиске Elasticsearch, если результаты имеют одинаковые оценки

Я экспериментирую с обычным скорингом в поиске elastics. Многие из выражаемых множителей выражений, которые я пытаюсь получить, дают наборы результатов, где многие документы имеют одинаковые оценки. Кажется, они приходят в том же порядке каждый раз, когда я пытаюсь, но можно ли это гарантировать?

AFAIU он не может, особенно если не существует более одного осколка в кластере. Документы с равным счетом по. данный запрос elasticsearch возвращается в случайном, недетерминированном порядке, который может меняться между вызовами одного и того же запроса, даже если базовая база данных не изменяется (и, следовательно, пейджинг является ненадежным), если выполнено одно из следующих условий:

  1. Я использую function_score, чтобы гарантировать, что оценка уникальна для каждого документа (например, с помощью уникального поля чисел).
  2. Я использую sort и гарантирую, что сортировка определяет общий порядок (например, используя уникальное поле как резерв, если все остальное равно).

Может ли кто-нибудь подтвердить (и, возможно, указать ссылку)?

Это меняется, если я знаю, что существует только один первичный осколок без каких-либо реплик (см. Другие аналогичные запросы: Inconsistent ordering of results across primary /replica for documents with equivalent score)? Например. если я гарантирую, что есть один осколок. И нет никаких изменений в базе данных между двумя вызовами одного и того же запроса, тогда этот запрос вернет результаты в том же порядке?

Каковы другие альтернативы (если есть)?

ответ

1

В конце концов я использовал дополнительный сорт в случаях, когда вероятны равные баллы - например, поиск по категории продукта. Этот дополнительный вид может быть id, дата создания или аналогичный. Настройка - 2 сервера, 3 осколка и 1 реплика.

+1

Это рекомендуемый способ, чтобы сортировать по '_score' сначала, а затем некоторое вторичное, связанное с ним поле, дополнительно. –

+0

@LeeH как вы добавляете тай-брейк с _id? – Lion789

Смежные вопросы