madcat1991
@madcat1991

Проблема с ранжированием и bm25

Возникла следующая проблема. В проекте используется Sphinx. Поиск осуществляется с постфиксной звездочкой. Для увеличения ранга документов с точным соответствием запросу используется паттерн типа:

@title дом* | @title дом


Для ранжирования используется sph04. Было замечено, что на слове «дом», вес фразы «Дом для богатых» оказался выше веса слова «Дом». Результат ранжирования портит метрика bm25, входящая в состав sph04. Если ориентироваться на How Sphinx relevance ranking works, то для bm25 выполняется следующее допущение:

"...for performance reasons we account for all the keywords occurrences in the document, and not just the matched ones. For instance, (@ title “hello world”) query that only matches a single instance of “hello world” phrase in the title will result in the same BM25 with a (hello world) query that matches all the instances of both keywords everywhere in the document.".

Ниже приведены два запроса с метрикой bm25. Оба запроса ищут слово «дом», но один ищет в title_star, а второй в description_star. Несмотря на это, результаты одинаковые:


mysql> SELECT id, weight() FROM catalogue
    -> WHERE MATCH('@(title_star) дом') AND subsite_ids IN (110) AND paid_type_index IN (0) AND id IN (859490, 842300)
    -> LIMIT 0, 20
    -> OPTION index_weights=(catalogue=1), max_matches=10000, ranker=expr('bm25');
+--------+----------+
| id     | weight() |
+--------+----------+
| 842300 |      700 |
| 859490 |      669 |
+--------+----------+
2 rows in set (0.00 sec)


mysql> SELECT id, weight() FROM catalogue
    -> WHERE MATCH('@(description_star) дом') AND subsite_ids IN (110) AND paid_type_index IN (0) AND id IN (859490, 842300)
    -> LIMIT 0, 20
    -> OPTION index_weights=(catalogue=1), max_matches=10000, ranker=expr('bm25');
+--------+----------+
| id     | weight() |
+--------+----------+
| 842300 |      700 |
| 859490 |      669 |
+--------+----------+
2 rows in set (0.01 sec)


Считаем количество слов «дом» в контенте:
  • 84230 (Дом для богатых) == 8
  • 85949 (Дом) == 3


Т.е. поиск происходит по всем полям, по которым доступен полнотекстовый поиск в рамках одного индекса. Значит ли это, что вклад в значения веса для результатов поиска по title добавляют и слова, которые присутствуют в description?

Заметил еще штуку, что несмотря на одинаковые значения, количество результатов различается. Значит ли это, что в случае, когда мы ищем по title во всех результатах должен быть «дом» в title?

P.S. Вопрос задавал на форуме sphinxsearch, но там тишина
  • Вопрос задан
  • 3451 просмотр
Пригласить эксперта
Ответы на вопрос 1
sanchezzzhak
@sanchezzzhak
Ля ля ля...
Привет удалось вам узнать почему так?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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