SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.08.2010 20:58:46

Искандер
Участник
Зарегистрирован: 07.08.2010
Сообщений: 2

Полнотекстовый поиск по выборке из нескольких таблиц

Всем привет!
У меня вопрос по полнотекстовому поиску в 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)

Неактивен

 

#2 08.08.2010 00:18:09

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Полнотекстовый поиск по выборке из нескольких таблиц

UNION, да. MATCH возвращает вполне себе число, по нему можно
сортировать.

Неактивен

 

#3 08.08.2010 00:33:42

Искандер
Участник
Зарегистрирован: 07.08.2010
Сообщений: 2

Re: Полнотекстовый поиск по выборке из нескольких таблиц

Проблема не в том, что число, а в том что она разная для каждой выборки и зависит от кучи параметров.
например если в итоговой выборке и меня два товара то у одного релевантность 10.2 а у другого 5.1, а если товаров ~500 то максимальная релевантность становится 1200, потом 1100, 1000, 500, 400, 20, 5. Соотвественно если в выборке по компаниям и категорям будет результатов мало, а по товарам много - то у них шкала релевантности будет существенно отличаться, и тяжело будет ранжировать.

В данный момент придумал такое решение этой проблемы - просто считать самой релевантной выборкой полученную из товаров, а выборку по категориям - всем записям просто присваивать релевантность 60% от максимальной релевантности выборки по товарам, а выборке по компаниям - 30%.

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

Если все-таки такой способ будет работать не очень хорошо то в голову также пришла идея денормализовать таблицу товаров, добавив в нее три поля, и вести поиск только по ней.

Кстати, юнион же может возвращать одинаковые записи с разной релевантностью, придется делать GROUP BY products.id, надо будет потестить насколько быстро это будет работать.

Отредактированно Искандер (08.08.2010 00:39:17)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson