Тут две проблемы - некачественная лемматизация и составные сложные слова. russian это очень примитивный анализатор, он с русским языком справиться толком не может, отсюда причуды с лемматизацией. Для русского языка надо использовать что-нибудь помощнее, вроде hunspell или russian_morphology.
Для того, чтобы разбивать составные сложные слова нужен decompounder.
Спасибо Игорь за ваш ответ.
Пересмотрел свою модель, поигрался с настройками. Я почему то думал что russian - это тоже самое что и russian_morphology только встроенное в ES. Оказалось что последний работает гораздо понятнее и лучше.
Но есть вопрос иного плана.
Если я правильно понял то анализатор при индексировании формирует ключевые слова которые он ассоциирует с данной записью.
При поиске он вычленяет ключевые слова из поисковой строки и ищет их в ключевых словах и потом выдаёт как результат набор записей которые ответствуют запросу.
Вопрос следующий: можно как то сделать так что бы поиск по ключевым словам осуществлялся по принципу регулярных выражений?
Например: Мы проиндексировали такой вот текст "Мама мыла раму". С данным текстом у нас теперь ассоциируются следующие ключевые слова "мама", "рама", "мыл". Можно как то сделать так что бы данный текст находился по запросу "ра*"?
Тоесть система ищет среди ключевых слов слово "ра.*" а не в самом тексте как это происходит при regexp query?
Надеюсь понятно описал свой вопрос.
Так, давайте по подробнее.
У нас есть 2 типа поля (предположим)
1 - text
2 - keyword
1 - используется для полнотекстового поиска, тут отрабатывает анализатор и выделяются ключевые слова
2 - берётся текст поля целиком, может быть использовано для сортировки и агригации.
Я думал что мы можем делать поиск regexp только по 2 типу. В таком случае мы ищем по всему полю целиком.
А что будет если мы будем искать по 1 типу с использованием regexp?
Правильно ли я понимаю, что если мы проиндексируем 2 текста
1 - "Нефтяные вышки"
2 - "Производство нефти"
то мы получим следующие ключевые слова для предложений
1 - нефтяной, вышка
2 - производство, нефть
Если мы используем match поиск по слову "нефть" то мы найдём только 2-е предложение
Если match по слову "нефтяной" то только 1-е предложение
А если мы будем использовать regexp поиск по text типу по слову ".*нефт.*" то найдём оба предложения и поиск при этом будет производится именно по ключевым словам?
regex в любом случае ищет по токенам, только в первом случае, токены эти генерируются анализатором и состоят из слов, а во втором случае - токен у вас один - вся строка.
Спасибо за пояснение, но это не суть важно. Главное что в первом случае поиск идёт по отдельным словам сгенерированным анализатором, а во втором случае по всему предложению без изменений.
Для меня очень важно именно то что если мы используем регулярные выражения для поиска по типу text то поиск работает и осуществляется именно по ключевым словам. Это пожалуй то что я и хотел.
Я правильно понимаю что тогда мне для поиска "мама мыла раму" по частям двух слов "ма.*" и "ра.*" придётся разбивать запрос на два regexp query связанных must?
Если бы я использовал match то достаточно было бы одного query как "мама раму". Такой фокус с regexp не пройдёт?
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.