Elasticsearch: почему не удается найти по запросу «термин», но можно найти по запросу «соответствие»?

#elasticsearch

Вопрос:

Я использую Elasticsearch 11 для текста запроса.

У меня есть запрос ниже, но он не возвращает никакого документа.

 POST/_search
{
  "query": {
    "term":{
      "metric_name" : {"value": "ConsumedReadCapacityUnits","boost": 1.0}
    }
  }
}
 

Затем я изменяю его на text запрос, как показано ниже, который может найти соответствующий документ:

 POST/_search
{
  "query": {
    "match":{
      "metric_name" : "ConsumedReadCapacityUnits"
    }
  }
}
 

Основываясь на документе в term запросе, он соответствует точному термину , но значение ConsumedReadCapacityUnits является точным для metric_name , так почему term запрос ничего не возвращает?

Комментарии:

1. Можете ли вы поделиться типом отображения ConsumedReadCapacityUnits ? Я предполагаю , что это поле имеет тип text , следовательно, анализируется стандартным анализом и индексируется как consumedreadcapacityunits маркер (т. Е. Все строчные буквы).

2. да, вы правы, это text тип для этого поля. Как я могу изменить его, чтобы поддержать запрос термина?

Ответ №1:

Запрос соответствия анализирует поисковый запрос на основе стандартного анализатора (если анализатор не указан), а затем сопоставляет анализируемый термин с терминами, хранящимися в инвертированном индексе. По умолчанию text в поле тип используется стандартный анализатор, если анализатор не указан. Например. Школа проходит анализ в школе

Запрос термина возвращает документы, содержащие точный термин в указанном поле. Если вы не определили какое-либо явное сопоставление индексов, вам необходимо добавить .ключевое слово в поле. При этом используется анализатор ключевых слов вместо стандартного анализатора.

Как упоминалось в комментариях выше , тип сопоставления ConsumedReadCapacityUnits is text , поэтому вы можете выполнить запрос термина ConsumedReadCapacityUnits , обновив сопоставление индекса

Если вы хотите сохранить ConsumedReadCapacityUnits поле как текстового, так и ключевого типа, вы можете обновить сопоставление индексов, как показано ниже, для использования нескольких полей

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

А затем снова переиндексируйте данные. После этого вы сможете выполнить запрос термина, используя поле «ConsumedReadCapacityUnits.keyword» для типа ключевого слова и «ConsumedReadCapacityUnits» для типа текста

ИЛИ другой способ-создать новый индекс с приведенным ниже сопоставлением индексов

 {
  "mappings": {
    "properties": {
      "ConsumedReadCapacityUnits": {
        "type": "keyword"
      }
    }
  }
}
 

А затем проиндексируйте данные в этом новом индексе