Elasticsearch разница между ДОЛЖНЫМ и ДОЛЖНЫМ булевым запросом
В чем разница между MUST
а также SHOULD
bool запрос в ES?
Если мне нужны ТОЛЬКО результаты, содержащие мои термины, я должен использовать must
?
У меня есть запрос, который должен содержать только определенные значения, а также нет результатов, которые имеют более низкую дату / время, чем сегодняшние время / дата - СЕЙЧАС
Также
Могу ли я использовать несколько фильтров внутри кода, как показано ниже:
"filtered": {
"filter": {
"bool" : {
"must" : {
"term" : { "type" : 1 }
"term" : { "totals" : 14 }
"term" : { "groupId" : 3 }
"range" : {
"expires" : {
"gte": "now"
}
}
},
3 ответа
must означает: предложение (запрос) должно появляться в соответствующих документах. Эти пункты должны совпадать, как логическое AND.
must означает: как минимум одно из этих предложений должно совпадать, как логическое ИЛИ.
В основном они используются как логические операторы AND и OR. Смотрите это.
Теперь в запросе bool:
must означает: пункты, которые должны соответствовать документу для включения.
следует означает: если эти пункты совпадают, они увеличивают _score
; в противном случае они не имеют никакого эффекта. Они просто используются для уточнения оценки релевантности для каждого документа.
Да, вы можете использовать несколько фильтров внутри must
,
Поскольку это популярный вопрос, я хотел бы добавить, что в Elasticsearch версии 2 все немного изменилось.
Вместо filtered
запрос, нужно использовать bool
запрос на верхнем уровне.
Если вас не волнует оценка must
части, а затем положить эти части в filter
ключ. Отсутствие оценки означает более быстрый поиск. Кроме того, Elasticsearch автоматически определит, следует ли их кэшировать и т. Д. must_not
одинаково действителен для кеширования.
Ссылка: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
Также учтите, что "gte": "now"
не может быть кэширован, из-за детализации в миллисекундах. Используйте два диапазона в must
пункт: один с now/1h
и еще один с now
так что первое может быть кэшировано на некоторое время, а второе для точной фильтрации ускорено при меньшем наборе результатов.
Как сказано в документации:
Должен: пункт (запрос) должен появиться в соответствующих документах.
Следует: пункт (запрос) должен появиться в соответствующем документе. В логическом запросе без предложений must одно или несколько предложений must должны соответствовать документу. Минимальное количество предложений must для сопоставления может быть установлено с помощью параметра minimal_should_match.
Другими словами, результаты должны совпадать по всем запросам, присутствующим в условии must (или соответствовать по крайней мере одному из условий must, если предложение must отсутствует).
Поскольку вы хотите, чтобы ваши результаты удовлетворяли всем запросам, вы должны использовать must.
Вы действительно можете использовать фильтры внутри логического запроса.