Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сортировка по релевантности
 
 автор: untitled   (14.03.2006 в 21:42)   письмо автору
 
 

Можно ли средствами mysql определить какие ключевые слова из таблицы keywords наиболее релевантны текстовому описанию - отсортировать эти keywords по релевантности соотв-но?

Если да, как будет выглядеть такой запрос?

   
 
 автор: cheops   (14.03.2006 в 22:12)   письмо автору
 
   для: untitled   (14.03.2006 в 21:42)
 

Хм... вам необходим полнотекстовый поиск, причём следует избегать полнотекстового поиска в логическом режиме, так как там сортировки по релевантности не происходит. Возможно вас заинтересуют следующие темы
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=514
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=148
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=807
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=5311
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=3447
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=10526
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=6620
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=4699
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=3696
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=3923

   
 
 автор: Loki   (14.03.2006 в 22:24)   письмо автору
 
   для: cheops   (14.03.2006 в 22:12)
 

Релевантность результата можно запросить отдельным столбцом даже в логическом режиме и отсортировать по нему, так что неправда ваша.

   
 
 автор: cheops   (14.03.2006 в 22:44)   письмо автору
 
   для: Loki   (14.03.2006 в 22:24)
 

Тоже так думал, а тут читаю свежий мануал - нет сортировки по релевантности в логическом режиме, вывожу результаты - для всех результат 2 (а ещё думал это глюк). Судя по всему логика была такая, что если есть элементы < и > программист сам выставляет приоритет. Да вы сами наверное помните недавний поиск по форуму - чёрта с два там по релевантности сортировалось, а там как раз логический режим применялся...

   
 
 автор: cheops   (14.03.2006 в 22:46)   письмо автору
 
   для: Loki   (14.03.2006 в 22:24)
 

Чтобы голословным не быть приведу цитату:

12.7.1. Boolean Full-Text Searches
Boolean full-text searches have these characteristics:

They do not use the 50% threshold.

They do not automatically sort rows in order of decreasing relevance. You can see this from the preceding query result: The row with the highest relevance is the one that contains “MySQL” twice, but it is listed last, not first.

They can work even without a FULLTEXT index, although a search executed in this fashion would be quite slow.

The minimum and maximum word length full-text parameters apply.

The stopword list applies.

   
 
 автор: Loki   (15.03.2006 в 00:05)   письмо автору
 
   для: cheops   (14.03.2006 в 22:46)
 

Мы с разного конца читаем мануал. Мой конец оказался интереснее. Набросал пару примеров (оба рабочие - проверил)
Наглядный пример:

SELECT msg, MATCH(name, msg) AGAINST('сайт') as sort FROM 'boardp' WHERE MATCH(name, msg) AGAINST('сайт*' IN BOOLEAN MODE) ORDER BY sort DESC

А это более короткий, но делает тоже самое:

SELECT msg  FROM 'boardp' WHERE MATCH(name, msg) AGAINST('сайт*' IN BOOLEAN MODE) ORDER BY MATCH(name, msg) AGAINST('сайт') DESC

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

   
 
 автор: cheops   (15.03.2006 в 00:25)   письмо автору
 
   для: Loki   (15.03.2006 в 00:05)
 

Хм... всё-равно коэффициенты более примитивные получаются. В естественном режиме получается чего-то вроде
2.59818860148 
2.5506679303087 
2.5506679303087 
1.916105243405 
1.916105243405 
1.9100009371636 
0.37929384084749 
0.34001389614631 
0.34001389614631 
0.34001389614631 
0.34001389614631 
0.34001389614631 
0.33673688991751 
0.30018858529919 
0.30018858529919 
0.30018858529919 
0.30018858529919 
0.30018858529919 

А в логическом режиме (с учётом приведённых ухищрений)


















Он, собака, конструкцию MATCH(name, msg) AGAINST('сайт') только один раз за запрос вычисляет и на вторую не обращает внимания - т.е. либо сортировка будет по коэффициентам логического режима (т.е. никакая)... либо это будет не логический режим. В логическом режиме больно лихо коэффициент округляются, в результате сортировки в начало могут попадать записи, которые при естественной сортировке были бы в середине выборки.

   
 
 автор: Loki   (15.03.2006 в 09:23)   письмо автору
 
   для: cheops   (15.03.2006 в 00:25)
 

Хм... а что у вас за версия? У меня веса отображаются именно по первому варианту.
Вы ничего не напутали? выборка-то идет в логическом режиме, а вот коэффициенты для сортировки - в естественном.

   
 
 автор: cheops   (15.03.2006 в 12:49)   письмо автору
 
   для: Loki   (15.03.2006 в 09:23)
 

У меня 5.0.3. Кроме того, мне кажется не каждому boolean запросу можно в соответствие поставить естественный - слово сайт не очень удобное, так как полное, попробуйте 'сайту' искать по запросу 'сайт*' - как себя MySQL ведёт, так же? У меня упорно округляет коэффициенты.

   
 
 автор: Loki   (15.03.2006 в 13:44)   письмо автору
 
   для: cheops   (15.03.2006 в 12:49)
 

Мне кажется вы не совсем правильно трактуете значение релевантности:
Релевантностью обладает абсолютно любая запись, даже в том случае, если релевантность нулевая. И чтобы расположить результаты поиска в порядке релевантности, совсем не обязательно производить поиск по релевантности.
То есть вполне нормальна следующая запись:

SELECT msg  FROM 'boardp' WHERE user_id=1 ORDER BY MATCH(name, msg) AGAINST('сайт') DESC 

То есть в условии WHERE вообще не используется полнотекстовый поиск, но тем не менее, результаты сортируются по релевантности, которой, обладают абсолютно все записи.

Слово "сайт" было взято просто для примера, так как тестировал на маленькой базе форума.

   
 
 автор: cheops   (15.03.2006 в 15:31)   письмо автору
 
   для: Loki   (15.03.2006 в 13:44)
 

Да я понял, что вы ходите сказать. Я лишь хочу подчеркнуть, что конструкция MATCH(name, msg) AGAINST('сайт') DESC вычисляется лишь один раз, а при использовании логического режима коэффициенты релевантности оболванены, т.е. использовать релевантность всё равно придётся от естественного поиска.

   
 
 автор: Loki   (15.03.2006 в 15:38)   письмо автору
 
   для: cheops   (15.03.2006 в 15:31)
 

Тестировал на четвертой версии - были вполне адекватные индексы... очень старнно. Может пятая все же сыровата?

   
 
 автор: cheops   (15.03.2006 в 21:46)   письмо автору
 
   для: Loki   (15.03.2006 в 15:38)
 

Вряд ли, так 5 версия уже пару месяцев как объявлена релизом, а 5.1 уже в бета-тестировании (это значит до релиза уже где-то пол года), кроме того у меня и на 4.0 воспроизводится... нужно будет попробовать одно слово использовать, может он когда одно слово коэффициенты нормально выставляет...

   
 
 автор: Loki   (16.03.2006 в 00:03)   письмо автору
 
   для: cheops   (15.03.2006 в 21:46)
 

Версия 4,1,8
попробовал запрос с двумя словами: все равно нормальные коэффициенты...

   
 
 автор: cheops   (16.03.2006 в 01:06)   письмо автору
 
   для: Loki   (16.03.2006 в 00:03)
 

Хм... надо будет подумать в этом направлении, поэкспериментировать на большой базе... в принципе полнотекстовый поиск себя хорошо проявляет на больших объёмах текста...

   
 
 автор: untitled   (15.03.2006 в 02:17)   письмо автору
 
   для: untitled   (14.03.2006 в 21:42)
 

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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования