Elasticsearch: запрос "must" для вложенных полей - PullRequest
0 голосов
/ 18 октября 2019

Как выполнить запрос «должен» «соответствовать» для нескольких полей в одной и той же вложенности? Вот воспроизводимый индекс ES, в котором поле «пользователь» определено как «вложенный» тип.

PUT my_index
{
    "mappings": {
        "properties": {
            "user": {
                "type": "nested",
                "properties": {
                    "firstname": {"type": "text"}
                }
            }
        }
    }
}

А вот 2 документа:

PUT my_index/_doc/1
{
  "user" : [ 
    {
      "firstname" : "John"
    },
    {
      "firstname" : "Alice"
    }
  ]
}

PUT my_index/_doc/2
{
  "user" : [ 
    {
      "firstname" : "Alice"
    }
  ]
}

Для этого индекса Как я могу запросить документы, в которых "Джон" И "Алиса" существуют ? С указанным выше индексом я ожидаю получить Документ 1, но не Документ 2. До сих пор я пробовал следующий код, но он не возвращает совпадений:

GET my_index/_search 
{
    "query": {
        "nested": {
            "path": "user",
            "query": {
                "bool": {
                    "must": [
                        {"match": {"user.firstname": "John"}},
                        {"match": {"user.firstname": "Alice"}}
                    ]
                }
            }
        }
    }
}  

1 Ответ

0 голосов
/ 18 октября 2019

Ниже запрос, что требуется.

POST my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "user",
            "query": {
              "match": {
                "user.firstname": "alice"
              }
            }
          }
        },
        {
          "nested": {
            "path": "user",
            "query": {
              "match": {
                "user.firstname": "john"
              }
            }
          }
        }
      ]
    }
  }
}

Обратите внимание, как я использовал два вложенных запроса в одном предложении must. Это потому, что если вы заметите, что документы, которые у вас есть alice и john, считаются two different documents.

Ваш запрос будет работать, если ваша структура документа будет выглядеть примерно так:

POST my_index/_doc/3
{
  "user" : [    
    {
      "firstname" : ["Alice", "John"]
    }
  ]
}

Попробуйте прочитать this (вложенный тип данных) и this (вложенный запрос) ссылку, чтобы узнать больше о том, как они работают, и по второй ссылке вы можете увидеть ниже информацию:

Вложенный запрос ищет вложенные объекты полей, как если бы они были проиндексированы как отдельные документы.

Надеюсь, это поможет!

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