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.


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

Другие вопросы по тегам