Не работает эластичный поисковый запрос, если используется field.keyword

У меня есть сопоставление для эластичного поиска

{
   "2021-05-ui":{
      "mappings":{
         "userinfo":{
            "properties":{
               "address":{
                  "type":"text",
                  "fields":{
                     "keyword":{
                        "type":"keyword",
                        "ignore_above":256
                     }
                  }
               },
               "name":{
               "type":"keyword"
            },
            "userId":{
               "type":"keyword"
            }
         }
      }
   }
}

Я хочу использовать запрос термина в поле userId, как показано ниже, он не работает, но когда я удаляю .keyword из нижеприведенного запроса, я хочу, чтобы запрос соответствовал точному значению для поля userId

{
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "userId.keyword": "[email protected]"
                    }
                }
            ]
        }
    }
}

Мне нужен запрос с "userId.keyword" только потому, что в других средах есть сопоставление текста и ключевых слов, не могли бы вы предложить, какой запрос мы можем использовать для получения точного соответствия, я пробовал использовать match, match_phrase, но это не сильно помогло.


person Pandit Biradar    schedule 20.05.2021    source источник


Ответы (1)


Поле userId имеет тип keyword, что означает, что оно использует анализатор ключевых слов вместо стандартного анализатора. В этом случае вы получите результат только при точном совпадении.

Поскольку userId относится к типу keyword и нет поля для userId.keyword, вы должны использовать userId для запроса термина.

{
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "userId": "[email protected]"
                    }
                }
            ]
        }
    }
}

Однако, если вы хотите сохранить поле userId как типа text, так и keyword, вы можете обновите сопоставление индекса, как показано ниже, чтобы использовать несколько полей

PUT /_mapping
{
  "properties": {
    "userId": {
      "type": "keyword",
      "fields": {
        "raw": {
          "type": "text"
        }
      }
    }
  }
}

А затем снова переиндексируйте данные. После этого вы сможете выполнять запросы, используя поле "userId" для типа keyword и "userId.raw" для типа text.

person ESCoder    schedule 20.05.2021