Elasticsearch разница между ДОЛЖНЫМ и ДОЛЖНЫМ булевым запросом

169

В чем разница между MUSTи SHOULDBOOL запрос в ES?

Если я ТОЛЬКО хочу, чтобы результаты, которые содержат мои термины, я должен затем использовать must?

У меня есть запрос, который должен содержать только определенные значения, а также нет результатов, которые имеют более низкую дату / время, чем сегодняшние время / дата - СЕЙЧАС

Также

Могу ли я использовать несколько фильтров внутри кода, как показано ниже:

"filtered": {
"filter": {
"bool" : {
        "must" : {
            "term" : { "type" : 1 }
            "term" : { "totals" : 14 }
            "term" : { "groupId" : 3 }
            "range" : {
                "expires" : {
                    "gte": "now"
                }
            }
        },
user2722667
источник

Ответы:

252

must означает: предложение (запрос) должно появляться в соответствующих документах. Эти пункты должны совпадать, как логическое AND .

должны средства: По крайней мере один из этих пунктов должны соответствовать, как логическим ИЛИ .

В основном они используются как логические операторы AND и OR. Смотрите это .

Теперь в запросе bool :

must означает: пункты, которые должны соответствовать документу для включения.

следует означает: если эти пункты совпадают, они увеличивают _score; в противном случае они не имеют никакого эффекта. Они просто используются для уточнения оценки релевантности для каждого документа.


Да, вы можете использовать несколько фильтров внутри must.

Утсавский Рассвет
источник
Немного опоздал на вечеринку, но как насчет mustкатегорий или цен, а также shouldдля атрибутов, таких как размер и цвет. Теперь, если выбраны размеры L и XL, то между этими двумя нужно выбрать значение, но если выбран также зеленый цвет, он должен быть обязательным для (размеры L ИЛИ XL) И (зеленый цвет). Это возможно?
Сделано
Я считаю, что в этом случае фильтры могут быть лучшим подходом для атрибутов. Они ориентированы на точные совпадения, а не на поиск по релевантности. Смотрите запросы и фильтры в документах для получения дополнительной информации.
Джим К.
6
Я думаю, что вам нужно иметь minimum_number_should_match = 1для того, чтобы реализовать идею, что «хотя бы один из этих пунктов должен соответствовать».
Джим К.
Хороший ответ! Я просто хочу поделиться частью документации, которая была очень полезной для меня, чтобы понять это. astic.co/guide/en/elasticsearch/guide/current/…
ba0708
1
JimK - или не надо оговорять Когда нет условия must, подразумевается Minimum_number_should_match.
ЛизХ
15

Поскольку это популярный вопрос, я хотел бы добавить, что в 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таким, чтобы первый мог кешироваться некоторое время, а второй для точной фильтрации, ускоренной для меньшего набора результатов.

TautrimasPajarskas
источник
8

Как сказано в документации :

Должно: предложение (запрос) должно появляться в соответствующих документах.

Следует: пункт (запрос) должен появиться в соответствующем документе. В логическом запросе без предложений must одно или несколько предложений must должны соответствовать документу. Минимальное количество предложений must для сопоставления может быть установлено с помощью параметра minimal_should_match.

Другими словами, результаты должны быть подкреплены все запросы представить в сусло пункте (или соответствовать по крайней мере один из должны оговорок , если нет обязательно раздел.

Поскольку вы хотите, чтобы ваши результаты удовлетворяли всем запросам, вы должны использовать must .


Вы действительно можете использовать фильтры внутри логического запроса.

Heschoon
источник
10
Я думаю, что вы имеете в виду «вы должны использовать должны», а не «вы должны использовать должны» ;-)
Джармод