Как работает сопоставление нескольких полей в 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", потому что он соответствует как запросам соответствия, так и запросам терминов.

Другие вопросы по тегам