Задать вопрос
@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 и прочее)
Морфология включена.
  • Вопрос задан
  • 435 просмотров
Подписаться 1 Оценить Комментировать
Ответ пользователя klirichek К ответам на вопрос (3)
@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)

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