Запросить частичное совпадение каждого слова в поисковом запросе в Elasticsearch - PullRequest
1 голос
/ 01 ноября 2019

У меня есть массив тегов, содержащих слова.

tags: ['australianbrownsnake', 'venomoussnake', ...]

Как мне сопоставить эти термины поиска: «коричневая змея», «австралийская змея», «ядовитая», «ядовитая коричневая змея»

Я даже не уверен, чтоэто возможно, так как я новичок в Elasticsearch. Помощь будет оценена. Спасибо.

Редактировать: Я создал анализатор ngram и добавил поле с именем ngram, вот так.

properties": {
    "tags": {
      "type": "text",
      "fields": {
          "ngram": { 
            "type": "text",
            "analyzer": "my_analyzer"
          }
        }
    }

я пробовал следующий запрос, но не повезло

"query": {
        "multi_match": {
          "query": "snake",
          "fields": [
            "tags.ngram"
          ],
          "type": "most_fields"
        }
      }

мое отображение тегов выглядит следующим образом:

        "tags" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            },
            "ngram" : {
              "type" : "text",
              "analyzer" : "my_analyzer"
            }
          }
        },

мои настройки:

{
  "image" : {
    "settings" : {
      "index" : {
        "max_ngram_diff" : "10",
        "number_of_shards" : "1",
        "provided_name" : "image",
        "creation_date" : "1572590562106",
        "analysis" : {
          "analyzer" : {
            "my_analyzer" : {
              "tokenizer" : "my_tokenizer"
            }
          },
          "tokenizer" : {
            "my_tokenizer" : {
              "token_chars" : [
                "letter",
                "digit"
              ],
              "min_gram" : "3",
              "type" : "ngram",
              "max_gram" : "10"
            }
          }
        },
        "number_of_replicas" : "1",
        "uuid" : "pO9F7W43QxuZmI9vmXfKyw",
        "version" : {
          "created" : "7040299"
        }
      }
    }
  }
}

1 Ответ

0 голосов
/ 01 ноября 2019

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

По умолчаниюasticsearch индексирует строки, пропуская их через стандартный анализатор. Вы всегда можете создать свой собственный анализатор для хранения своего поля, как вы хотите. Вы можете создать свой собственный анализатор, который разбивает строки на nGrams. Вы можете указать размер 3-10, в котором ваш тег 'australianbrownsnake' будет храниться примерно так: ['aus', 'aust', ..., 'tra', 'tral', ...]

Затем вы можете изменить свой поисковый запрос, чтобы он соответствовал вашему полю tags.ngram, и вы должны получить желаемые результаты. Поле tags.ngrams можно создать следующим образом:

https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

с помощью токенайзера ngram:

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html

EDIT1: Elastic имеет тенденцию к использованиюанализатор сопоставляемого поля для анализа ключевых слов запроса. Вам может не потребоваться, чтобы пользовательский запрос был токенизирован в nGrams, поскольку в поле тегов должен быть соответствующий nGram. Вы можете указать стандарт search_analyzer в своих отображениях.

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