|
|
|
| Можно ли средствами mysql определить какие ключевые слова из таблицы keywords наиболее релевантны текстовому описанию - отсортировать эти keywords по релевантности соотв-но?
Если да, как будет выглядеть такой запрос? | |
|
|
|
|
|
|
|
|
для: cheops
(14.03.2006 в 22:12)
| | Релевантность результата можно запросить отдельным столбцом даже в логическом режиме и отсортировать по нему, так что неправда ваша. | |
|
|
|
|
|
|
|
для: Loki
(14.03.2006 в 22:24)
| | Тоже так думал, а тут читаю свежий мануал - нет сортировки по релевантности в логическом режиме, вывожу результаты - для всех результат 2 (а ещё думал это глюк). Судя по всему логика была такая, что если есть элементы < и > программист сам выставляет приоритет. Да вы сами наверное помните недавний поиск по форуму - чёрта с два там по релевантности сортировалось, а там как раз логический режим применялся... | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: 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
|
В обоих используется полнотекстовый поиск в логическом режиме, а результаты сортируются по релевантности. | |
|
|
|
|
|
|
|
для: 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
|
А в логическом режиме (с учётом приведённых ухищрений)
2
2
2
2
2
2
1
1
1
1
1
1
1
1
1
1
1
1
|
Он, собака, конструкцию MATCH(name, msg) AGAINST('сайт') только один раз за запрос вычисляет и на вторую не обращает внимания - т.е. либо сортировка будет по коэффициентам логического режима (т.е. никакая)... либо это будет не логический режим. В логическом режиме больно лихо коэффициент округляются, в результате сортировки в начало могут попадать записи, которые при естественной сортировке были бы в середине выборки. | |
|
|
|
|
|
|
|
для: cheops
(15.03.2006 в 00:25)
| | Хм... а что у вас за версия? У меня веса отображаются именно по первому варианту.
Вы ничего не напутали? выборка-то идет в логическом режиме, а вот коэффициенты для сортировки - в естественном. | |
|
|
|
|
|
|
|
для: Loki
(15.03.2006 в 09:23)
| | У меня 5.0.3. Кроме того, мне кажется не каждому boolean запросу можно в соответствие поставить естественный - слово сайт не очень удобное, так как полное, попробуйте 'сайту' искать по запросу 'сайт*' - как себя MySQL ведёт, так же? У меня упорно округляет коэффициенты. | |
|
|
|
|
|
|
|
для: cheops
(15.03.2006 в 12:49)
| | Мне кажется вы не совсем правильно трактуете значение релевантности:
Релевантностью обладает абсолютно любая запись, даже в том случае, если релевантность нулевая. И чтобы расположить результаты поиска в порядке релевантности, совсем не обязательно производить поиск по релевантности.
То есть вполне нормальна следующая запись:
SELECT msg FROM 'boardp' WHERE user_id=1 ORDER BY MATCH(name, msg) AGAINST('сайт') DESC
|
То есть в условии WHERE вообще не используется полнотекстовый поиск, но тем не менее, результаты сортируются по релевантности, которой, обладают абсолютно все записи.
Слово "сайт" было взято просто для примера, так как тестировал на маленькой базе форума. | |
|
|
|
|
|
|
|
для: Loki
(15.03.2006 в 13:44)
| | Да я понял, что вы ходите сказать. Я лишь хочу подчеркнуть, что конструкция MATCH(name, msg) AGAINST('сайт') DESC вычисляется лишь один раз, а при использовании логического режима коэффициенты релевантности оболванены, т.е. использовать релевантность всё равно придётся от естественного поиска. | |
|
|
|
|
|
|
|
для: cheops
(15.03.2006 в 15:31)
| | Тестировал на четвертой версии - были вполне адекватные индексы... очень старнно. Может пятая все же сыровата? | |
|
|
|
|
|
|
|
для: Loki
(15.03.2006 в 15:38)
| | Вряд ли, так 5 версия уже пару месяцев как объявлена релизом, а 5.1 уже в бета-тестировании (это значит до релиза уже где-то пол года), кроме того у меня и на 4.0 воспроизводится... нужно будет попробовать одно слово использовать, может он когда одно слово коэффициенты нормально выставляет... | |
|
|
|
|
|
|
|
для: cheops
(15.03.2006 в 21:46)
| | Версия 4,1,8
попробовал запрос с двумя словами: все равно нормальные коэффициенты... | |
|
|
|
|
|
|
|
для: Loki
(16.03.2006 в 00:03)
| | Хм... надо будет подумать в этом направлении, поэкспериментировать на большой базе... в принципе полнотекстовый поиск себя хорошо проявляет на больших объёмах текста... | |
|
|
|
|
|
|
|
для: untitled
(14.03.2006 в 21:42)
| | Т.е. задача обратная обычному поиску, обычно требуется найти наиболее релевантные тексты по ключевому слову.
А здесь наоборот нужно найти наиболее релевантные ключевые слова. | |
|
|
|