MySQL InnoDB FULLTEXT поисковый рейтинг для поиска по фразе - PullRequest
0 голосов
/ 27 февраля 2020

Я выполняю поиск FULLTEXT по таблице InnoDB, ища фразы, а не отдельные ключевые слова. например. поиск «foo bar» как фразы из двух слов, а не «foo» и «bar» по отдельности.

Вот мои тестовые данные:

+----+-------------------------------------------------------------------------------+
| id | content                                                                       |
+----+-------------------------------------------------------------------------------+
|  1 | example foo text bar                                                          |
|  2 | default value foo foo server                                                  |
|  3 | default value foo foo server bar foo test                                     |
|  4 | process foo bar potato integer text bar bar content foo foo value bar foo foo |
|  5 | foo bar demo string value foo bar music foo bar most foo bar                  |
+----+-------------------------------------------------------------------------------+

А вот мой тестовый запрос:

SELECT *, MATCH(content) AGAINST ('"foo bar"' IN BOOLEAN MODE) AS score
FROM test
WHERE MATCH(content) AGAINST ('"foo bar"' IN BOOLEAN MODE)

Проблема в результатах:

+----+-------------------------------------------------------------------------------+--------------------+
| id | content                                                                       | score              |
+----+-------------------------------------------------------------------------------+--------------------+
|  4 | process foo bar potato integer text bar bar content foo foo value bar foo foo |  0.948742687702179 |
|  5 | foo bar demo string value foo bar music foo bar most foo bar                  | 0.8314893841743469 |
+----+-------------------------------------------------------------------------------+--------------------+

Как видите, строка 5 содержит фразу "foo bar" четыре раза, тогда как строка 4 содержит ее только один раз, но строка 4 оценивается выше 5. Похоже, что рейтинг игнорирует требование фразы.

Кто-нибудь знает, как заставить это работать правильно?

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Я думаю (без какой-либо ссылки на документацию), что рейтинг также зависит от длины всего текста. Есть много вещей, которые можно утверждать, должны быть учтены; постарайтесь не ставить свои ожидания слишком высокими.

Я попробовал 7 версий MySQL / MariaDB и получил 6 различных наборов «баллов». Поэтому я настоятельно рекомендую не принимать всерьез ни один один балл. Они, однако, ранжировали 4 дела "foo bar" в том же порядке. (Я расширил ваш тестовый пример, чтобы изменить длину больше.)

0 голосов
/ 27 февраля 2020

Я подозреваю, что это причуда фраз. Следующая документация входит в число самых противоречивых языков, которые я когда-либо видел:

Фраза, заключенная в символы двойной кавычки ("), соответствует только строкам, которые содержат фразу буквально. , как это было набрано. Полнотекстовый движок разбивает фразу на слова и выполняет поиск по индексу FULLTEXT для слов. Несловарные символы не должны совпадать точно: поиск фразы требует только, чтобы совпадения содержали точно те же слова, что и фраза, и в том же порядке.

Первое предложение напрямую противоречит остальной части объяснения. Я выделил ту часть, которую я считаю важной.

Итак, я буду размышлять. MySQL делает фразу, совпадающую с на уровне слова * 1014. * Таким образом, больше "foo" и "bar" в результате - без "foo bar" добавляет к Есть некоторый дополнительный механизм, который гарантирует, что пара действительно находится в наборе результатов, но это не влияет на счет.

Одна вещь йо u может сделать ваш собственный порядок:

order by length(content) - length(replace(content, 'foo bar', '')) desc

Это явно ищет "foo bar" в содержимом, упорядочивая по этому значению.

...