Полнотекстовый поиск MySql - релевантность

123
lagif
На сайте с 15.12.2004
Offline
30
#11

Tarry, Ну так, может, у вас это слово встречается, но в другой форме, и потому не находится?

Это тоже пройдет...
Антон Лавеев
На сайте с 31.10.2005
Offline
425
#12
ЗодчийТеней:
выборку и сортировку ты делаешь sql запросом (средствами mysql fulltext, match against in boolean mode) и при этом утверждаешь что ошибка не в нем? приведи пример своего запроса, рабочий пример, и тогда будет что обсудить, покачьто постановка вопроса идет на уровне "у меня ошибка, помогите". Так тебе наврядли что-то объяснят, да и думаю что вопросы по мьускулю не типичны для данного форума.

1

Прочитайте внимательней вопрос. Если вамнечего ответить, не пишите.

Суть проблемы НЕ В ЗАПРОСЕ. А в механизме расчета релевантности в MySQL FULL TEXT.

Пример рабочего запроса, специально для Вас:

$sql ="

SELECT *, MATCH SCONT AGAINST('$stxt')/$devider1
+
MATCH STITLE AGAINST('$stxt*')/$devider2
+
MATCH META_KEYS AGAINST('$stxt*')/$devider3
+
MATCH META_DESC AGAINST('$stxt*')/$devider4
AS Rel
FROM `INDEX_BASE`
WHERE MATCH SCONT AGAINST('$stxt' IN BOOLEAN MODE)
AND
MATCH STITLE AGAINST('$stxt' IN BOOLEAN MODE)
AND
MATCH META_KEYS AGAINST('$stxt' IN BOOLEAN MODE)
AND
MATCH META_DESC AGAINST('$stxt' IN BOOLEAN MODE)
ORDER BY Rel DESC

LIMIT $begin,$lines";

☠️☠️☠️
ЗодчийТеней
На сайте с 13.02.2006
Offline
11
#13
Tarry:
А в механизме расчета релевантности в MySQL FULL TEXT.

если Вы не относите эту часть к запросу, думаю что Вы сами не совсем понимаете свою же проблему. Со совей стороны могу посоветовать лишь одно, избавьтесь в запросе от множества MATCH, сильно тормозит и введите весовые коэффициенты, попробуйте что-то вроде

$query = "SELECT `search`.*, "

." IF (search like '%".$text."%', 3*10, 0) "

." + IF (search LIKE '%".str_replace(" ", "%', 9, 0) + IF (search LIKE '%", $text)."%', 9, 0) AS relev"

." FROM `search` "

." WHERE (`search`.`search` LIKE '%".str_replace(" ", "%' OR `search`.`search` LIKE '%", $text)."%') "

." ORDER BY relev DESC";

Где соответственно $text это Ваш поисковый массив. $n количество поисковых слов. Выборку по нескольким полям довьте сами.

Я, однако, не скажу, что все иллюзии или бред нашего ума нужно называть сумасшествием. Эразм Роттердамский "Похвала глупости".
[Удален]
#14

Tarry, а с какой кодировкой мускуль собран? Какой тип таблиц?Что в error_log?

Кстати, Вам ЗодчийТеней правильно написал... запрос криво составлен. Кроме того, я бы рекомендовал весь текст всех нужных полей слить в отдельную таблицу и добавить индексное поле. Запрос получится короче и работать будет гораздо быстрее.

И крайнее... результат выборки в in boolean mode может не совпадать с выборкой для определения релевантности... в этом случае, мускуль просто не выдаст те строки, которые не смог отсортировать. Попробуйте потестить... посмотрите выдачу по запросу без "in boolean mode" и выдачу по тому же запросу в режиме "in boolean mode"...

Антон Лавеев
На сайте с 31.10.2005
Offline
425
#15
ЗодчийТеней:
...попробуйте что-то вроде
$query = "SELECT `search`.*, "
." IF (search like '%".$text."%', 3*10, 0) "
." + IF (search LIKE '%".str_replace(" ", "%', 9, 0) + IF (search LIKE '%", $text)."%', 9, 0) AS relev"
." FROM `search` "
." WHERE (`search`.`search` LIKE '%".str_replace(" ", "%' OR `search`.`search` LIKE '%", $text)."%') "
." ORDER BY relev DESC";
..

Это все очень хорошо, но причем тут FULLTEXT? Зачем городить кучу LIKE если есть готовый механизм поиска по FULLTEXT INDEX?

MATCH `поле` AGAINST ('запрос') уже выдает мне некое число, оценивающее релевантность. Я просто складываю релевантность всех индексных полей, вычисляя общюю. И ничего не тормозит. Так, что... ладно, всем спасибо огромное, буду дальше разбираться...

Scaramush:
Tarry
И крайнее... результат выборки в in boolean mode может не совпадать с выборкой для определения релевантности... в этом случае, мускуль просто не выдаст те строки, которые не смог отсортировать. Попробуйте потестить... посмотрите выдачу по запросу без "in boolean mode" и выдачу по тому же запросу в режиме "in boolean mode"...

Вот это уже ближе к истине, ибо так оно и есть. Но boolean mode нужен для модификации словосочитаний по +*- итд. Так что без него не куда...

А релевантность boolean mode как раз выдается либо 0 либо 1. Так что приходится комбинировать эти два типа. Засада, короче.

ЗодчийТеней
На сайте с 13.02.2006
Offline
11
#16
Tarry:
Это все очень хорошо, но причем тут FULLTEXT? Зачем городить кучу LIKE если есть готовый механизм поиска по FULLTEXT INDEX?
MATCH `поле` AGAINST ('запрос') уже выдает мне некое число, Вот это уже ближе к истине, ибо так оно и есть. Но boolean mode нужен для модификации словосочитаний по +*- итд. Так что без него не куда...
А релевантность boolean mode как раз выдается либо 0 либо 1. Так что приходится комбинировать эти два типа. Засада, короче.

http://dev.mysql.com/doc/refman/4.0/ru/reference.html Вам поможет, разберитесь для начала с языком запросов, что и как работает, тогда Вы поймете что именно Вам выдает MATCH, что такое "релевантность boolean mode" и почему куча LIKE лучше кучи MATCH`а. Удачи.

Умеющий уши да услышит!

[Удален]
#17
Tarry:
Засада, короче

Я бы отказался от релевантности мускуля и дал возможность пользователям делать уточняющие запросы и использовать все символы для инбулинмод... Но это ИМХО.

pelvis
На сайте с 01.09.2005
Offline
345
#18

Tarry, Мускуль снабжен собственным механизмом определения релевантности. Она для поиска не подходит - проходили полгода назад на своей шкуре.

Продаю вывески. Задарма и задорого (https://www.ledsvetzavod.ru/)
Антон Лавеев
На сайте с 31.10.2005
Offline
425
#19

Такс. Из всего выше изложенного, прихожу к выводу, что FULLTEXT отправляется в печку... Собственно, что же остается? Использовать нечто подобное механизму изложенному уважаемым Зодчим? И вообще, реален ли в таком случае адекватный поиск в MySQL?

lagif
На сайте с 15.12.2004
Offline
30
#20

Смотря какой у вас объем инфы, и как вы собираетесь хранить индекс.

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий