#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"
}
}
}
}
А затем проиндексируйте данные в этом новом индексе