@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 и прочее)
Морфология включена.
  • Вопрос задан
  • 434 просмотра
Пригласить эксперта
Ответы на вопрос 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)

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

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

Похожие вопросы