Elasticsearch: поиск только по формам слова - PullRequest
1 голос
/ 02 марта 2020

У меня есть коллекция документов, и у них есть поле tags, которое является массивом строк. Каждая строка - это слово. Пример:

[{
 "id": 1,
 "tags": [ "man", "boy", "people" ]
}, {
 "id": 2,
 "tags":[ "health", "boys", "people" ]
}, {
 "id": 3,
 "tags":[ "people", "box", "boxer" ]
}]

Теперь мне нужно запросить только документы, содержащие слово «мальчик» и его формы (в моем примере «мальчики»). Мне не нужен эластичный поиск, чтобы вернуть c номер 3, потому что это не форма мальчика.

Если я использую запрос fuzzy, я получу все три документа, а также сделаю c номер 3, который я не требуется. Насколько я понимаю, эластичный поиск использует расстояние Левенштейна, чтобы определить, имеет ли значение c или нет.

Если я использую запрос match, я получу только номер 1, но не оба (1,2).

Интересно, есть ли возможность запрашивать документы путем сопоставления словарных форм. Есть ли способ заставить elasti c соответствовать "герцогу", "герцогине", "герцогу", но не "дамкам", "буке", "байке" и так далее? Это более сложный случай с «герцогом», но мне нужно также поддерживать такой случай.

Возможно, это можно решить, используя некоторые специфические c настройки анализатора?

1 Ответ

0 голосов
/ 02 марта 2020

Я полагаю, что с "соответствием по форме слова" вы имеете в виду совпадение морфологических вариаций одного и того же слова. Это может касаться множественного числа, единственного числа, падежа, времени, спряжения и т. Д. c. Имейте в виду, что правила для вариаций слов определяются языком c

Реализация нечеткости в Elasticsearch основана на расстоянии Дамерау-Левенштейна . Он обрабатывает мутации (изменения, преобразования, транспонирования) независимо от заданного c языка, основываясь только на числе, если редактирует.

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

Предполагая, что все ваши теги находятся в Engli sh, ваше отображение теги могут выглядеть следующим образом:

"tags": {
  "type": "text",
  "analyzer": "english"
}

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

I'm не уверен, что герцог и герцогиня считаются одним и тем же словом (и, следовательно, обращаются к родителю). Если нет, вам необходимо использовать настраиваемый анализатор, который позволяет настраивать синонимы.

См. Также Elasticsearch Reference: Языковые анализаторы

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