Как использовать термин против подполя, которое является массивом вasticsearch? - PullRequest
0 голосов
/ 02 января 2019

Я работаю над эластичным поиском и использую термин в поисковом запросе.Пожалуйста, ознакомьтесь с приведенными ниже примерами индексированных данных:

"_source": {
    "type": "ITEM",
    "primaryKey": "3923",
    "displayName": "Lumia 505",
    "attributes": {
        "n26273": "Lumia 505",
        "n26275": "Mobile"
    },
    "mappings": {
        "Primary Hierarchy": [
            "Nokia"
        ]
    }
}

Для поиска данных по любому тексту поиска, который я использую, приведенный ниже запрос работает нормально:

{
   "query":{
      "bool":{
         "must":[
            {
               "query_string":{
                  "query":"----MySearchTextHere----",
                  "default_operator":"AND"
               }
            },
            {
               "term":{
                  "type":"item"
               }
            }
         ]
      }
   },
   "size":10,
   "from":0
}

Запросы:

1. Как добавить термин в запрос для поиска по полю "mappings.Primary Hierarchy" , который является массивом?

2. Как я могу достичь # 1, не упоминаяИмя вложенного поля как имя вложенного поля будет динамическим?только имя поля сопоставления является константой.

1 Ответ

0 голосов
/ 12 января 2019

Нет проблем при ссылке на вложенное поле ("mappings.Primary Hierarchy" в вашем случае) в запросе термина

{
   "query":{
      "bool":{
         "must":[
            {
               "query_string":{
                  "query":"Nokia",
                  "default_operator":"AND"
               }
            },
            {
               "term":{
                  "mappings.Primary Hierarchy":"nokia"
               }
            }
         ]
      }
   },
   "size":10,
   "from":0
}

, это просто успешно отфильтровывает по Nokia .Если вы хотите использовать именно Nokia (не анализируемый термин), вы должны использовать поле "mappings.Primary Hierarchy.keyword". Ключевое слово здесь означает, что содержимое этого поля точно такое же, как оно было передано вами во время индексации.

2-я вещь также возможна, но потребует правильных отображений.Вы должны указать, что ваши отображения имеют вложенный тип (что означает, что в нем могут быть другие поля).

Простой пример в вашем случае может выглядеть примерно так:

{
    "mappings": {
        "_doc" : {
            "properties" : {
                "mappings" : {
                    "type" : "nested"
                }
            }
        }
    }
}

Вам необходимо создать свой индекс с примененными этими настройками.

В этом случае ваш запрос может выглядеть следующим образом:

{
  "query": {
    "nested": {
      "path": "mappings",
      "query": {
        "multi_match": {
          "query": "Nokia"
        }
      }
    }
  }
}

Запрос на несколько совпадений если поля не указаны, по умолчанию используются все поля в отображения объекты

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