Elasticsearch пробелы для разделения слов, кроме имен

Мы создаем поисковую машину с elasticsearch, чтобы использовать стажера в нашей компании. Мы используем одно поле ввода, в которое пользователи могут вводить свои поисковые слова (например, Google). Таким образом, должна быть возможность искать слова одного типа, разделенные пробелами.

Все работает отлично, но у нас есть некоторые проблемы с именами… Если мы ищем «Tim Van De Velde», нет результатов для «Tim vandevelde», и это должно быть возможно. Имейте в виду, что мы хотим сохранить пробелы между словами, чтобы использовать наш оператор и, и что мы не хотим, чтобы многие результаты были неправильными.

Любые мысли или идеи, как мы могли бы сделать это возможным?

Взгляните на наш запрос:

"filtered": {
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "type": "most_fields",
            "query": "Tim Van De Velde",
            "operator": "and",
            "boost": 1,
            "fields": [
              "fullname",
              "alias",
              "name"
            ]
          }
        } ,
        {
          "multi_match": {
            "type": "most_fields",
            "query": "Tim Van De Velde",
            "operator": "and",
            "fields": [
              "fullname",
              "alias",
              "name"
            ],
            "boost": 0.8,
            "fuzziness": 1
          }
        }

person Rein Van Leirsberghe    schedule 22.12.2015    source источник
comment
не могли бы вы опубликовать один образец документа и сопоставление полей?   -  person ChintanShah25    schedule 22.12.2015


Ответы (2)


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

Следующий плагин может обрабатывать составные слова: Analysis Decompound. Работает без словаря. Для подхода на основе словаря используйте Compound Word. Фильтр токенов

Упомянутое вами имя будет разделено на следующие токены при использовании плагина 1:

{
   "tokens": [
      {
         "token": "tim",
      },
      {
         "token": "vandeveld",
      },
      {
         "token": "vand",
      },
      {
         "token": "veld",
      }
   ]
}
person paweloque    schedule 22.12.2015
comment
Спасибо! Я поискал и нашел elastic. co/guide/en/elasticsearch/reference/1.7/. Но по какой-то причине я не могу заставить его работать. Должен ли он работать с каждым словом и языком или только в том случае, если ваш язык установлен на немецкий? - person Rein Van Leirsberghe; 23.12.2015
comment
Это должно работать для всех языков, кстати. плагин не различает, какой язык вы обрабатываете, другие языковые фильтры не влияют на его поведение. Вы использовали правильную версию плагина? Это придирчиво, когда дело доходит до совместимости версии elasticsearch. - person paweloque; 23.12.2015
comment
Dictionary_decompounder уже включен в elasticsearch, поэтому я ожидаю, что версия в порядке :) - person Rein Van Leirsberghe; 23.12.2015

Есть простой способ заархивировать цель: предварительная обработка запроса.

  • Составьте словарь имен людей
  • Получите ввод как «Тим Ван Де Вельде» и верните вывод как [ «Тим Ван Де Велде» или «Тим Ван Де Велде» или «Тим ВанДе Велде» или «Тим Ван ДеВелде» или «Тим ВанДе Велде» или «ТимВан ДеВельде» или « ТимВанДеВельде" или "Тим ВанДеВельде" или "Тим ВанДеВельде" или "ТимВанДеВельде" ]
person Ted Hive    schedule 22.12.2015
comment
Спасибо, я думаю, это должно помочь. Можно ли указать URL-адрес, по которому я могу увидеть, как вы можете создать словарь? Не могу найти много об этом :) - person Rein Van Leirsberghe; 23.12.2015