@Kokoulin
Php senior developer

Sphinx: Как увеличить вес результата со словами идущими подряд?

Есть запрос:
Как подключить доме (да без буквы Н на конце)

есть результаты:
как подключить домен к сайту
как подключить почту для домена
Как подключить SSL-сертификат для домена

как настроить sphinx так что бы вес результаты в котором слова идут подряд был выше но при этом сохранился вывод всех результатов

сейчас вес этих результатов одинаков
так как во всех результатах есть
как, подключить и домен

текущий запрос к сфинксу

SELECT *, WEIGHT() AS w
FROM answers
WHERE MATCH('(\"как подключить домен*\"^5)|(как^20|как*^10|*как^10|*как*^5)|(подключить^20|подключить*^10|*подключить^10|*подключить*^5)|(домен^20|домен*^10|*домен^10|*домен*^5)')
LIMIT 0,5 
OPTION ranker=wordcount, field_weights = (quest=10, keys=2, answer=1);


в данном контексте поля keys и answers пустые

текущий вывод
{quest: "как подключить почту для домена", category: "2", w: "50"}
{quest: "как подключить домен к сайту", category: "2", w: "50"}
{quest: "Как подключить SSL-сертификат для домена", category: "8", w: "50"}


в целом мне нужно как то учитывать растояние между словами, но я не понимаю как
  • Вопрос задан
  • 875 просмотров
Решения вопроса 2
ManticoreSearch
@ManticoreSearch
Здравствуйте. Должно все работать и по дефолту:
mysql> select *, weight() from idx_min where match('Как подключить доме*');
+------+--------------------------------------------------------------------------+----------+
| id   | body                                                                     | weight() |
+------+--------------------------------------------------------------------------+----------+
|    1 | как подключить домен к сайту                                             |     3319 |
|    2 | как подключить почту для домена                                          |     2319 |
|    3 | Как подключить SSL-сертификат для домена                                 |     2319 |
+------+--------------------------------------------------------------------------+----------+
3 rows in set (0.01 sec)


но в принципе то, что вы ищете называется LCS (Longest Common Subsequence) и используя ranker expr можно вручную регулировать влияние этого фактора. Например так:

mysql> select *, weight() from idx_min where match('Как подключить доме* подключить') option ranker=expr('sum(lcs)');
+------+--------------------------------------------------------------------------+----------+
| id   | body                                                                     | weight() |
+------+--------------------------------------------------------------------------+----------+
|    1 | как подключить домен к сайту                                             |        3 |
|    2 | как подключить почту для домена                                          |        2 |
|    3 | Как подключить SSL-сертификат для домена                                 |        2 |
+------+--------------------------------------------------------------------------+----------+
3 rows in set (0.00 sec)


Если изменить запрос, то у всех вес будет единица, т.к. этот вычисленное значение по единственному фактору lcs у всех равно единице:
mysql> select *, weight() from idx_min where match('Как доме* подключить') option ranker=expr('sum(lcs)');
+------+--------------------------------------------------------------------------+----------+
| id   | body                                                                     | weight() |
+------+--------------------------------------------------------------------------+----------+
|    1 | как подключить домен к сайту                                             |        1 |
|    2 | как подключить почту для домена                                          |        1 |
|    3 | Как подключить SSL-сертификат для домена                                 |        1 |
+------+--------------------------------------------------------------------------+----------+
3 rows in set (0.01 sec)
Ответ написан
Комментировать
zoonman
@zoonman
⋆⋆⋆⋆⋆
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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