Поиск по большой базе фраз

Слава Шевцов
На сайте с 23.07.2005
Offline
370
1662

Есть 100М самых разнообразных фраз. Длина фразы до 10 слов, есть куча дополнительных столбцов типа integer. Нужно искать все фразы, содержащие одно, два или три слова. Иногда в запросе будет упоминаться значение одного из полей типа integer. Количество поисков будет очень большим, повторяющиеся запросы редки. Требуется максимизировать скорость выборки данных. Что посоветуете?

P.S. Пока хочу сделать так: загнать всё в Mysql и сделать доп. таблицу слово-номер_фразы. Или загнать в mysql и делать LIKE.

Неизменность точки зрения неизменно порождает иллюзию понимания.
I
На сайте с 26.05.2001
Offline
64
#1

Загнать в MySQL версии не меньше 4.1.16 (не спрашивайте почему, начну ругаться матом) и построить full text индекс. На 100 мб и большом количестве ОЗУ (скажем 512 мб памяти) будет однозначно летать. Не забудьте перед постройкой индекса выставить в my.cnf параметры

ft_min_word_len=1

ft_stopword_file=

Не знаю, насколько адекватно работает full text в mysql 5.x

Слава Шевцов:
Есть 100М самых разнообразных фраз. Длина фразы до 10 слов, есть куча дополнительных столбцов типа integer. Нужно искать все фразы, содержащие одно, два или три слова. Иногда в запросе будет упоминаться значение одного из полей типа integer. Количество поисков будет очень большим, повторяющиеся запросы редки. Требуется максимизировать скорость выборки данных. Что посоветуете?

P.S. Пока хочу сделать так: загнать всё в Mysql и сделать доп. таблицу слово-номер_фразы. Или загнать в mysql и делать LIKE.
Приходите завтра, завтра будет! (http://itman666.livejournal.com)
Слава Шевцов
На сайте с 23.07.2005
Offline
370
#2
itman:
Не знаю, насколько адекватно работает full text в mysql 5.x

У меня отъедает память на треть и кладёт mysql сервер. Mysql 5 и Freebsd 6

A
На сайте с 26.01.2005
Offline
58
#3

сделать инвертированный список?

F
На сайте с 12.03.2007
Offline
85
#4

построить на основе этой базы вторую, в которой 3 поля: слово, его позиция в первой таблице, и поле "типа integer". Делается выборка выриантов с новой базы, а затем их обработка.

Вобще то full_text должен отлично работать, может просто ft_min_word_len=1 здесь не уместно?

Как начать тренироваться (http://max-body.ru/quick_start.html), Бодибилдинг форум (http://fatal-energy.com/). Обменяюсь/куплю ссылками со статей (или статьями) с сайтами бодибилдинг/фитнес тематики.
I
На сайте с 26.05.2001
Offline
64
#5

Да нет, просто там векторная модель, а она тормозит на больших объемах.

fatalenergy:
построить на основе этой базы вторую, в которой 3 поля: слово, его позиция в первой таблице, и поле "типа integer". Делается выборка выриантов с новой базы, а затем их обработка.

Вобще то full_text должен отлично работать, может просто ft_min_word_len=1 здесь не уместно?
P
На сайте с 12.03.2007
Offline
0
#6

как вариант - Postresql + RD-tree индекс на множествах признаков

I
На сайте с 26.05.2001
Offline
64
#7
pitong:
как вариант - Postresql + RD-tree индекс на множествах признаков

Дело в том, что RD-дерево в данном случае - это тоже векторная модель, но вектора проиндексированы. В связи с этим возникает два нюанса, разрешение которых требует для каждого найденного документа считывать текст: false positives и ранжирование. Собственно, это самое большое зло, потому что требует множества random disk accesses. Да и сами объемы чтения могут быть большими.

С инвертированными файлами такой проблемы не возникает: нет false positives, ранжирование осуществляется a priori, то есть до формирования сниппетов, а сниппеты нужно формировать только для небольшого количества документов.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий