Разность поиска Elasticsearch между MUST и SHOULD bool query

В чем разница между MUST и SHOULD bool query в ES?

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

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

И

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

"filtered": {
"filter": {
"bool" : {
        "must" : {
            "term" : { "type" : 1 }
            "term" : { "totals" : 14 }
            "term" : { "groupId" : 3 }
            "range" : {
                "expires" : {
                    "gte": "now"
                }
            }
        },

Ответ 1

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

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

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

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

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

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


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

Ответ 2

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

Ответ 3

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

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

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

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

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


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