Elasticsearch - тот же результат поиска для "и" и "амперсанд" (&) в запросе - PullRequest
0 голосов
/ 02 ноября 2018

" Разработка индекса в Elasticsearch так, чтобы" & "и" и "в запросе возвращали один и тот же результат "

Как мы можем заставить Elasticsearch возвращать те же результаты, независимо от того, был ли поиск выполнен с " и " в качестве строки запроса или с амперсандом " & ".

Например, существует запрос для поиска всех названий фильмов, содержащих в своих именах " и / & ".

  1. г. И миссис Смит
  2. Джек и Джилл
  3. Abc and Def & ghi
  4. Пустышка

Таким образом, в этом случае не должно иметь значения, если поиск выполняется с "и" или "&" в запросе, должен возвращать 1,2,3.

Дамп из моего Kibana Dev Tool

PUT test_index { "settings": {"number_of_replicas": 0, "number_of_shards": 1 }, "отображения": { «Документ»: { "свойства": { "MOVIE_NAME": { "Тип": "текст"} } } } }

PUT / test_index / doc / 1 { "movie_name": "Мистер и миссис Смит" }

PUT / test_index / doc / 2 { "movie_name": "Джек и Джилл" }

PUT / test_index / doc / 3 { "movie_name": "Abc and Def & ghi" }

PUT / test_index / doc / 4 { "movie_name": "Dummy Name" }

Оба приведенных ниже запроса должны возвращать один и тот же результат

  1. GET test_index / _search { «размер»: 20, "запрос": { "матч": { "movie_name": "&" } } }

  2. GET test_index / _search { «размер»: 20, "запрос": { "матч": { "movie_name": "and" } } }

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "mapping",
          "mappings": [
            "+ => plus",
            "& => and"
          ]
        }
      }
    }
  }
}

Вы должны создать для этого фильтр с символами.

При создании индекса с помощью вышеуказанного анализатора

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "&"
}

Выход:

{
  "tokens": [
    {
      "token": "and",
      "start_offset": 0,
      "end_offset": 1,
      "type": "word",
      "position": 0
    }
  ]
}

и если вы запустите приведенный выше анализ без вышеуказанного анализатора char фильтра, вы получите

{
  "tokens": []
}

Причина : В ES - символы удаляются при создании поля с типом текста.

0 голосов
/ 02 ноября 2018

Есть несколько способов сделать это

  1. Используйте анализатор english , который удалит специальные символы из вашего текста, а также стоп-слова, такие как "и", поэтому по сути ваши поиски будут сопоставляться с токенами без & / и следовательно будет то же самое. См. https://www.elastic.co/guide/en/elasticsearch/reference/6.4/analysis-lang-analyzer.html для справки doc

  2. Сохраните ваш стандартный анализатор и добавьте фильтр замены символов, чтобы заменить любое вхождение шаблона "&" на "и", тогда все эти поиски будут выдавать одинаковые токены. См. https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern-replace-charfilter.html для справки doc

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