Как работает сопоставление нескольких полей в Elastic Search
Я хочу поддерживать как текстовый поиск (запрос соответствия), так и точное совпадение (запрос термина) в одном поле в моем индексе elasticsearch.
Ниже приведено сопоставление, которое я создал:
PUT multi_mapping_test/_mapping
{
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
Однако термин «запрос» ведет себя не так, как я ожидаю (возможно, его понимание неверно).
Например, вот пара примеров проиндексированных документов:
POST multi_mapping_test/_doc
{
"name": "abc llc"
}
POST multi_mapping_test/_doc
{
"name": "def llc"
}
Следующий запрос термина не дает результатов:
GET multi_mapping_test/_search
{
"query": {
"term": {
"name": {
"value": "abc llc"
}
}
}
}
Я делаю что-то не так или мое понимание точных совпадений с термином запроса неверно?
PS Термин запрос отлично работает, когда я ставлю сопоставление только для типа ключевого слова .
1 ответ
Запрос термина: возвращает документы, содержащие точный термин в указанном поле. При поиске точного соответствия следует использовать типы полей ключевых слов. Как следующее:
GET multi_mapping_test/_search
{
"query": {
"term": {
"name.keyword": {
"value": "abc llc"
}
}
}
}
Кроме того, вы можете использовать логический запрос как для текстового поиска (запрос соответствия), так и для точного соответствия (термин-запрос) в вашем индексе elasticsearch.
GET multi_mapping_test/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "abc llc"
}
},
{
"term": {
"name.keyword": {
"value": "abc llc"
}
}
}
],
"minimum_should_match": 1
}
}
}
Примечание. Вы также можете использовать запрос , если вам нужно автозаполнение функции. Подробности: match_bool_prefixhttps://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-bool-prefix-query.html.
ООО "АБК"_score
будет выше, чем "def llc", потому что он соответствует как запросам соответствия, так и запросам терминов.