Я ожидаю, что при поиске у меня найдутся все документы, так как синоним "егрюл" должен поменяться на "единый государственный реестр юридический лицо", но магии не происходит и находится только первый документ. Есть какие-то способы побороть проблему средствами эластика? Или нам делать предобработку синонимов в коде?
Почему это происходит? Потому что мы применили первую строку из синонимов: "выписка из егрюл, выписка егрюл", синонимы рекурсивно не применяются и мы ищем каждый найденный синоним как строку.
Игорь, спасибо, это как раз мне понятно. Нет ли такого подхода, чтобы синонимы, состоящие из нескольких слов, применялись рекурсивно?
До этого мы применяли подход с simple contraction при индексации, но такой подход при индексации заменяет многословные синонимы на 1 слово, что тоже накладывает свои ограничения при поиске. Сейчас кажется, что synonym_graph + search_analyzer - самое оптимальное решение, но могу ошибаться.
Ещё я пробовал подход, когда мы добавляем 2 фильтра синонимов, первый - с "выписка из егрюл, выписка егрюл", второй с "единый государственный реестр юридический лицо, егрюл", тогда в pipeline обработки вроде всё заменяется как надо, но это опять же накладывает на нас обязанность разделять синонимы на 2 группы.
Если нет возможности рекурсивной подстановки синонимов через elasticsearch/lucene, будем делать предобработку рекурсивную наших синонимов на 1-2 уровня вложенности. Спасибо ещё раз.
Есть исторически накопленная база синонимов, которые раньше применялись в поиске на другом движке. Предположим, что первая строчка синонимов это "выписка егрюл, оформить выписка егрюл, запросить егрюл, запросить выписка егрюл", не просто добавляем "из", а чуть сложнее строка. При этом, например, синонимы уровня "выписка, запросить, запросить выписка, оформить" нас могут не устраивать по каким-то причинам, связанным с конкретным набором наших документов и применяться могут в контексте только с "егрюл" (или каким-то другим словом, которое само по себе является аббревиатурой, которая добавлена так же в синонимы).
Это подробное описание того, как ваша система не работает в данный момент и историческая справка. Я теперь понимаю, почему вы добавили первую строку - потому что так было в прошлой системе. Но я, все еще, не очень понимаю, что вы хотите добиться.
Название документа: "выписка единый государственный реестр юридический лицо".
Пользователь ищет: "выписка егрюл" или "запросить егрюл".
При этом данный документ не находится, так как вы уже говорили, срабатывает синоним на "выписка егрюл", но подстановки "егрюл, единый государственный реестр юридический лицо" не происходит.
Эту часть я понимаю, но ее очень просто достичь убрав первую строку из списка синонимов из вашего примера. Мне хотелось бы понять, почему вам такой подход не подходит.
При замене or на and или добавлении minimum_should_match больше 1 получаем 0 результатов. Реальный запрос в разы сложнее, там и minimum_should_match, и match_phrase и так далее.
В любом случае, как я понял, нам нужно именно перерабатывать словарь синонимов, а не искать решение с помощью elasticsearch, верно?
Если вы хотите искать решение с помощью elasticsearch, то нужно более точно определить проблему для которой мы ищем это решение. Например, если у вас в запросе только 2 слова, то minimum_should_match больше 2-х не имеет никакого смысла. То есть, хотелось бы понять, откуда 3 там взялось и хорошее ли значение это для elasticsearch.
Если вы хотите засунуть elasticsearch в прокрустово ложе старой системы, то надо лучше разобраться, как старая система работает, или хотя бы понять, что вы заменяете. По той информации, которая пока появилась, мне кажется, что фильтр synonym вместо synonym_graph будет вести себя более похоже на поведение вашей старой системы.
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant
logo are trademarks of the
Apache Software Foundation
in the United States and/or other countries.