@leetnigga

Как сделать поиск в Sphinx с учетом кучи аттрибутов?

Здравствуйте.

Есть MySQL база на несколько миллионов строк.

Основная таблица в ней выглядит как:
ID | Text | ... десяток полей-флагов ...

К ней могут (в зависимости от галочек в форме поискового запроса) джоиниться ещё несколько таблиц вида table (ID | Parent_ID | Data).

На сейчас типичный запрос выглядит так:
SELECT * FROM table
JOIN child_table on (table.ID = child_table.Parent_ID)
JOIN child_table2 on (table.ID = child_table2.Parent_ID)
...
WHERE 
table.Flag1 = '...' 
AND table.Flag2 = '...' 
AND child_table.Data = '...' 
AND child_table2.Data = '...'


Иногда кроме этих полей-флагов необходимо искать по полю Text в таблице:
SELECT * FROM table
JOIN child_table on (table.ID = child_table.Parent_ID)
JOIN child_table2 on (table.ID = child_table2.Parent_ID)
...
WHERE 
table.Flag1 = '...' 
AND table.Flag2 = '...' 
AND child_table.Data = '...' 
AND child_table2.Data = '...' 
AND MATCH(table.Text) AGAINST ('....')


Естественно, на таких объемах полнотекстовый поиск от mysql дичайше тормозит. Чтобы избавиться от тормозов, я решил воспользоваться Сфинксом, но столкнулся с проблемой: как в нём правильно выстроить индекс?

То есть:
- должен ли я все эти флаги (в т.ч. из дочерних таблиц) загонять в индекс Сфинкса (через rt_attr_uint, например), и искать все данные именно в нём, или
- я фильтрую в MySQL только по флагам = получаю список айдишников, потом фильтрую в Сфинксе только по тексту = получаю другой список, потом нахожу пересечение этих списков = мой результат, или
- какой-то другой вариант?
  • Вопрос задан
  • 143 просмотра
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
Все загнать в сфинкс
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
402d
@402d
начинал с бейсика на УКНЦ в 1988
В сфинксе есть мульти атрибуты. Но если не понравиться то можно деноомализовать сделав текстовое поле куда их собрать.
Priz99998k Priz33334k.
ПрефиксИдСуфикс пробел и тд
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы