Задавайте вопросы, мы ответим
Вы не зашли.
Всем привет!
У меня вопрос по полнотекстовому поиску в MySQL.
Стоит такая задача:
Есть три таблицы:
products
----
id
id_category
id_company
name
about
companies
----
id
name
categories
----
id
id_parent
name
Необходимо организовать полнотекстовый поиск товаров.
Соответсвенно в таблице товаров создал FULLTEXT INDEX по name и about, делаю MATCH(name, about) AGAINST ("минерал") - товары находятся.
Но теперь надо сделать также чтобы он по запросу минерал находил товары из категории "минерал" (и всех ее подкатегорий) и товаров, которые выпускает компания "Уральский минерал", и сортировал их по релевантности.
Это вообще воможно? Пока в голову приходит только UNION трех запросов - поиск по товарам, по компаниям и по категориям. Но тогда невозможно отсортировать по релевантности.
Какие еще варианты предложите?
Про Sphinx читал, и в курсе что он позволяет организовать поиск по нескольким таблицам, проблема в том, что он возвращает id в этих таблицах (т.е. если он найдет компанию "уральский минерал" то он вернет id этой компании, а мне надо все товары этой компании).
Отредактированно Искандер (07.08.2010 20:59:35)
Неактивен
UNION, да. MATCH возвращает вполне себе число, по нему можно
сортировать.
Неактивен
Проблема не в том, что число, а в том что она разная для каждой выборки и зависит от кучи параметров.
например если в итоговой выборке и меня два товара то у одного релевантность 10.2 а у другого 5.1, а если товаров ~500 то максимальная релевантность становится 1200, потом 1100, 1000, 500, 400, 20, 5. Соотвественно если в выборке по компаниям и категорям будет результатов мало, а по товарам много - то у них шкала релевантности будет существенно отличаться, и тяжело будет ранжировать.
В данный момент придумал такое решение этой проблемы - просто считать самой релевантной выборкой полученную из товаров, а выборку по категориям - всем записям просто присваивать релевантность 60% от максимальной релевантности выборки по товарам, а выборке по компаниям - 30%.
Конкрентные проценты надо будет потестить отдельно на практике, но вроде такой способ во-первых решит задачу, во-вторых даст более-менее адекватную выдачу в поиске в плане соответсвия поисковому запросу - сначала все товары, подходящие под запрос хорошо, потом товары средне подходящие и товары из подходящих категорий, и в конце уже слабо подходящие товары и товары из подходящих компаний
Если все-таки такой способ будет работать не очень хорошо то в голову также пришла идея денормализовать таблицу товаров, добавив в нее три поля, и вести поиск только по ней.
Кстати, юнион же может возвращать одинаковые записи с разной релевантностью, придется делать GROUP BY products.id, надо будет потестить насколько быстро это будет работать.
Отредактированно Искандер (08.08.2010 00:39:17)
Неактивен