Запросы полей с AND в ElasticSearch - PullRequest
0 голосов
/ 27 февраля 2019

В моем индексе документов ElasticSearch у меня есть свойство type наподобие

type= LOCATION | PERSON | TIME

и поле text, представляющее весь документ.

Для поиска типов, подобных LOCATION и конкретный текст, например `Маунтин-Вью ', мне нравится

doc.text:Mountain View AND doc.type:LOCATION

Если я хочу выполнить запрос OR, я бы вместо этого использовал подход query_string, например

"query": {
                        "query_string": {
                            "query": "entity.text: (Mountain View OR Menlo Park) AND entity.type:LOCATION"
                        }
                    }

Это также работает.Для выполнения AND запросов, таких как поиск item.text с обоими «Mountain View» и «Menlo Park» для item.type=LOCATION, это не работает, как

"query": {
                        "query_string": {
                            "query": "entity.text: (California AND Nevada) AND entity.type:LOCATION"
                        }
                    }

Другие попытки были:

Использование bool предложения с should, например:

{
                    "query": {
                      "bool": {
                        "should": [
                          { "match": { "text": "Menlo Park" }},
                          { "match": { "text": "Mountain View" }}
                        ]
                      }
                    }
                  }

Использование cross-fields с multi_match

"query": {
                      "multi_match": {
                        "query": "California Nevada",
                        "type": "cross_fields",
                        "operator": "AND",
                        "fields": [
                          "text"
                        ]
                      }
                    }

Другой подход заключался в использовании must с последним (в данном случае, кстати, опуская type):

{
                    "query": {
                      "bool": {
                        "must": [
                          {
                            "multi_match" : {
                              "query":      "Nevada",
                              "type":       "cross_fields",
                              "fields":     [ "text"],
                            }
                          },
                          {
                            "multi_match" : {
                              "query":      "California",
                              "type":       "cross_fields",
                              "fields":     [ "text" ]
                            }
                          }
                        ]
                      }
                    }
                  }

, но он также не возвращает результатов. Обратите внимание, что в последнем случаеиспользование should вместо must даст запрос OR, который будет работать нормально.

Итак, как выполнить запрос AND для того же поля text для соответствия нескольким значениям, таким как California и Nevada?

1 Ответ

0 голосов
/ 28 февраля 2019

Если бы я правильно понял вопрос, я бы сделал следующее:

{
    "query": {
        "bool" : {
           "must": [
             "match" : {
              "text" : {
                "query" : "California Nevada",
                "operator" : "and"
               }
             }
           ]
        }
    }
}

Документация Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...