Общий поиск по разнородным данным

virakochi

Устал
Общий поиск по разнородным данным

Возникла такая ситуация: есть база резюме/вакансий. К этим таблицам также привязаны многие служебные таблицы, часто данные в отношении 1 к n. Необходимо вести полнотекстовый поиск по всем объектам, то есть если к резюме привязано семь мест работы, необходимо также искать по всем полям в таблице мест работы, с совпадающим resume_id.

Возможно ли выделить индекс для каждого объекта и хранить его в отдельной таблице?
Или же имеет смысл составлять огромный запрос, где по всем служебным таблицам идет полнотесктовый поиск?
Посоветуйте верное решение. Важно, что данных довольно много, то есть основной упор в скорость работы.
Спасибо.
 

Кром

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

virakochi

Устал
Да. Сейчас займусь тестированием...
Но общая система примерно такова:

резюме -> место работы 1
-> место работы 2
-> место работы 3

-> законченные курсы 1
-> законченные курсы 2
и тд..

искать надо по тексту всех данных, выдавать как результат, естественно, само резюме.
 

Кром

Новичок
Одной схемы маловато. Попоробуй сначала полнотекстовый поиск. Если будет тормозить, потестируй другие варианты.
 

virakochi

Устал
Ок. спасибо..

-~{}~ 15.10.04 14:47:

Полнотекстовый поиск работает, но на мой взгляд медленно. В запросе джойнятся 12 таблиц, по большей части ведется полнотекстовый поиск. На 30 резюме запрос работает от 0.3 до 1 секунды. Так же необходима возможность сортировки по релевантности. Не совсем представляю, как тут поступить. Сейчас суммирую значения по всем таблицам.. Но по-моему это не совсем верная оценка.
Возможен ли все же вариант, чтобы отделить индекс для поиска? И если да, то как это сделать правильно? (все-таки в MySQL не знаток)
 

Yurik

/dev/null
virakochi
не имеет смысла городить много таблиц. Любые данные любой разношерстности всегда помещаются в 2 таблицы:

tblTypes
=====
idtype
type

tblValues
=======
id
idorigin
idtype
value

Если нужно выбрать скажем
SELECT * FROM MyEntity, tblTypes, tblValues WHERE [inner join трёх таблиц] AND ((type='workplace' AND value='some_work_place') OR (type='experience_years' AND value>3))
 

virakochi

Устал
Yurik
возможно и так. Но дело в том, что дополнительные таблицы тоже не с одним и не с двумя полями. Данные в них также разные, разное количество столбцов, и связи с другими таблицами. А кроме того на каждый тип данного заводить новый тип значения также не хочется.. Хотя может я и не прав.
 

clevel

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

virakochi

Устал
clevel
Я именно над этим и ломаю голову.. Пока ничего не приходит на ум.. Дело ведь в том, что данные часто меняются, а значит и таблицу с кешем обновлять надо постоянно..
Насколько хорошим является такой вариант:
в вспомогательной таблице на одно резюме хранится одна запись, а текстовые данные, которые от основной таблицы в отношении 1 к N записаны просто одно за другим. Сответственно вешаем полнотекстовый индекс по всем полям. Будет ли в этом случае оценка релевантности верной? И может ли этот дать ощутимый прирост в скорости?
 
Сверху