Какая разница между match и bool должен соответствовать запросу в Elasticsearch - PullRequest
1 голос
/ 12 марта 2020

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

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

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

enter image description here

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

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

enter image description here

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

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

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

  1. must
  2. must_not
  3. filter
  4. должен

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

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

{
    "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, предоставляющие запрос и контекст фильтра , для подробного понимания аспектов производительности.

2 голосов
/ 12 марта 2020

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

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

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

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

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

...