В чем разница между match и bool must match query в Elasticsearch

В чем разница между запросом Only match и bool must match в ES?

Во-первых, используйте только соответствующий запрос

{
   "query":{
      "match":{
         "address":"mill"
      }
   }
}

введите здесь описание изображения

Во-вторых, используйте составной запрос

{
  "query": {
    "bool": {
      "must": [
        { "match": { "address": "mill" } }
      ]
     }
   }
}

введите здесь описание изображения

Вы можете мне все рассказать? В чем разница между ними?


person Johnson    schedule 12.03.2020    source источник


Ответы (2)


Когда вы используете только один match внутри предложения bool must, тогда нет никакой разницы, предложение bool полезно, когда вы хотите объединить несколько (логических) критериев, дополнительная информация на официальный документ ES. Он поддерживает следующие критерии.

  1. должен
  2. не должен
  3. фильтр
  4. должен

Позвольте мне показать на небольшом примере из вашего вопроса.

Отображение индекса только с адресом и именем first_name

{
    "mappings": {
        "properties": {
            "address": {
                "type": "text"
            },
            "first_name" :{
                "type" : "text"
            }
        }
    }
}

Индексируйте 3 документа, все они имеют одинаковый адрес mill, но разные first_name

{
   "address" : "mill",
   "first_name" : "Johnson"
}

{
   "address" : "mill",
   "first_name" : "Parker"
}

{
   "address" : "mill",
   "first_name" : "opster"
}

Поисковый запрос для отображения всех адресов mill, но не должен_ содержать first_name как parker

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "address": "mill"
                    }
                },
                {
                    "must_not": {
                        "first_name": "parker"
                    }
                }
            ]
        }
    }
}

Результат только 2 адреса

"hits": [
         {
            "_index": "so-60620921-bool",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.13353139,
            "_source": {
               "address": "mill",
               "first_name": "opster"
            }
         },
         {
            "_index": "so-60620921-bool",
            "_type": "_doc",
            "_id": "3",
            "_score": 0.13353139,
            "_source": {
               "address": "mill",
               "first_name": "Johnson"
            }
         }
      ]

На основе комментариев OP, предоставление контекст запроса и фильтрации, чтобы подробно изучить аспекты производительности.

person user156327    schedule 12.03.2020
comment
Спасибо! Могут ли слова «совпадать» и «нельзя» писать с одинаковой глубиной? - person Johnson; 12.03.2020
comment
Этот must_not запрос для меня совершенно новый ;-) no [query] registered for [must_not] он должен быть на том же уровне, что и must - person Val; 12.03.2020
comment
@Val, извини, был на мобильном телефоне и читал это как must и must_not :), спасибо, что указали на это :) - person user156327; 12.03.2020
comment
@Johnson, Добавлена ​​ссылка на запрос и контекст фильтра, которая поможет понять, как эти запросы работают внутри и влияют на производительность. - person user156327; 12.03.2020
comment
@Johnson, см. @Val комментарий к вашему Can 'match' and 'must not' be written in the same depth запросу. - person user156327; 12.03.2020
comment
@Johnson, я думаю, ваш вопрос решен, если да, не могли бы вы пометить мой ответ как принятый. - person user156327; 12.03.2020

Как написано в вашем вопросе, они выполнят одно и то же действие.

Запрос match - это очень простой полнотекстовый оператор условия.

Запрос bool позволяет вы можете добавить несколько полей и несколько условий, например существует (для проверки наличия определенного поля в документах), should (эквивалент ИЛИ) и must_not (НЕ эквивалент).

Возвращаясь снова к вашему примеру, поскольку запрос bool имеет только одно условие must, match, он вернет только все документы со значением mill, содержащимся в поле address.

Надеюсь, это будет полезно! :)

person Kevin Quinzel    schedule 12.03.2020
comment
Спасибо. Я думаю, что у них есть разница, например, в производительности ... или что-то еще ... - person Johnson; 12.03.2020
comment
@Johnson, для вашего случая нет разницы в производительности, но если вы добавляете filter в предложение bool, тогда это имеет большое значение в производительности, поскольку Elasticsearch сначала выполняет фильтры (что сокращает количество документов для поиска), а затем запускать поиск по оставшимся документам, кроме того, фильтры кешируются, что означает, что в следующий раз тот же запрос будет намного быстрее. - person user156327; 12.03.2020
comment
да. Фильтр на победу :) - person Kevin Quinzel; 12.03.2020