соответствие и термин, дающие разные результаты в текстовом полеластиком поиска - PullRequest
0 голосов
/ 06 октября 2019

Я изучаюasticsearch-7.4.0 и работаю с базовыми запросами.

У меня есть индекс product, который имеет поле name со следующим отображением:

"name" : {
  "type" : "text",
  "fields" : {
    "keyword" : {
      "type" : "keyword",
      "ignore_above" : 256
    }
  }
}

Когда я выполняю запрос термина для сопоставления документов с именем "Wine - Ice Wine".

GET /product/_search
{
  "from": 0,
  "size" : 1000,
  "query": {
    "term": {
      "name": {
        "value": "Wine - Ice Wine"
      }
    }
  }
}

Вывод, который я получаю:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

Когда я выполняю запрос на совпадение:

GET /product/_search
{
  "from": 0,
  "size" : 1000,
  "query": {
    "match": {
      "name": "Wine - Ice Wine"
    }
  }
}

Вывод, который я получаю:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 75,
      "relation" : "eq"
    },
    "max_score" : 12.354952,
    "hits" : [
      {
        "_index" : "product",
        "_type" : "doc",
        "_id" : "403",
        "_score" : 12.354952,
        "_source" : {
          "name" : "Wine - Ice Wine",
          "price" : 127,
          "in_stock" : 26,
          "sold" : 334,
          "tags" : [
            "Alcohol",
            "Wine"
          ],
          "description" : "Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh. Quisque id justo sit amet sapien dignissim vestibulum.",
          "is_active" : true,
          "created" : "2010/04/12"
        }
      }
    ]
  }
}

Как уже упоминалось, запросы на уровне терминов ищут точное совпадение.
Итак, я указываювся строка в поисковом запросе.
Оба запроса должны возвращать одинаковые результаты.

1 Ответ

3 голосов
/ 06 октября 2019

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

По приведенной выше ссылке у нас есть ниже для keyword тип данных:

Как правило, они используются для фильтрации (найдите все сообщения в блоге, где публикуется статус), для сортировки и для агрегирования. Поля ключевых слов доступны для поиска только по их точному значению.

Из вашего сопоставления поле name имеет родственное поле name.keyword типа keyword.

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

GET /product/_search
{
  "from": 0,
  "size" : 1000,
  "query": {
    "term": {
      "name.keyword": {                  <---- Note this
        "value": "Wine - Ice Wine"
      }
    }
  }
}

С другой стороны, запрос match, который вы используете в поле text, проходит фазу Анализ .

В основном, когда у вас есть поле текстового типа, и когда вы глотаете документ, он преобразует предложения в токены, преобразует их в строчные буквы и тем самым сохраняет в инвертированном индексе. Это будет индексный анализ времени

То же самое происходит, когда вы используете запрос на совпадение, то есть, что бы вы ни добавляли в часть запроса, он разбивается на отдельные слова или токены и ищет их в инвертированном виде. индекс. Это анализ времени поиска .

Анализ выполняется по концепции, называемой Анализаторы . По умолчанию используется Стандартный анализатор .

Я бы посоветовал вам перейти по ссылкам, чтобы понять больше об этом.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...