@gibigate

Как в сфинксе получить морфологические варианты слова?

Приведу пример, чтобы задача была понятнее.

Есть куча строк где используется разные варианты слов:
text run,
text runner,
text running,
text runs
text2 run
text2 runner
text3 running

При запросе по слову run, выходят все вышеприведенные результаты

Вопрос:
Как выбрать один из text run*, один из text2 run* и text3 run. Соответственно один из textN + keyword
ИЛИ:
как получить все формы слова run (то есть результат должен быть типа runner,running и прочее)
Морфология включена.
  • Вопрос задан
  • 432 просмотра
Пригласить эксперта
Ответы на вопрос 3
R0dger
@R0dger
Laravel/Yii/2 AngularJs PHP RESTful API
Посмотрите вот тут - chakrygin.ru/2013/07/sphinx-search.html
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
1)они сразу отсортированы по весу, выбирайте первую из выдачи можно задать там лимит 1 в запросе
2)сфинксом никак, используйте какой нибудь словарь
Ответ написан
@klirichek
Получить производные формы слова никак нельзя; aot изначально работает в прямо противоположном направлении (получает ИЗ производных исходные леммы).
Вот леммы получить можно, но чуть муторно.
Для этого добавляем в конфиге индекс с нужным лемматизатором (индексировать его необязательно, т.е. можно сказать что он rt и тогда демон взлетит с ним и без файлов индекса).
типа:
index fake_rt
{
  ...
  rt_field = fake
  morphology = lemmatize_ru_all, lemmatize_en_all, lemmatize_de_all
}


Затем включаем профайлинг и делаем запрос к этому индексу с нужным словом. После смотрим план запроса.
mysql> set profiling=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from rt_full where match ('стали');
Empty set (0.00 sec)

mysql> show plan;
+------------------+--------------------------------------------------------------------------------------------------------+
| Variable         | Value                                                                                                  |
+------------------+--------------------------------------------------------------------------------------------------------+
| transformed_tree | OR(
  AND(KEYWORD(сталь, querypos=1, morphed)), 
  AND(KEYWORD(стать, querypos=1, morphed)))           |
+------------------+--------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Из крайнего значения плана можно выкусить нужные формы внешними регэкспами
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы