Хранение данных: слова->документ

banshee(oleg)
На сайте с 12.08.2007
Offline
140
3053

Привет! Делаю свой поиск с русской морфологией и доп.фильтрами для поиска в некоем пуле документов. Документов около миллиона, каждые полчаса часть из них устаревает, взамен добавляются новые. Мне надо,

- чтоб искалось достаточно быстро,

- чтоб сразу после добавления документа можно было включать его в индекс. И, напротив, сразу после устаревания удалять.

После добавления документа я преобразую текст из него с помощью стеммера портера в основы (сейчас пробую заменить его на mystem, чтоб приводить к леммам), от них считаю хеши, которые являются индексами слов. Далее надо просто сохранить данные:

индекс слова->ид документа (это в простешем варианте, а так еще к ид документа+доп.параметры документа(например, id регионов), с учетом которых делается выборка документов).

Так вот, стоит вопрос - как эффективно хранить эти данные? Вариант запихать все записи в одну таблицу базы (word_id, doc_id ..) это даст миллиард+ записей в таблице. Это смущает. Еще вариант - под каждое слово делать таблицу (имя таблицы = hash слова), а ней хранить записи по документу на каждую. Это в итоге даст, предположительно, 200к+ таблиц в базе, в каждой от 1 до десятков тысяч записей..

Как по-уму то люди делають вообще? Прошу пнуть в верном направлении

banshee(oleg)
На сайте с 12.08.2007
Offline
140
#1

Ковыряю Lucene ..

XE
На сайте с 20.02.2010
Offline
21
#2

А че бы не сделать две таблицы:

в первой сделать оглавление - два столбца леммы и номера строк, в которых находятся id документов и доп. параметры (например, id регионов) из второй таблицы. А во второй таблице сортировать по id документов, чтобы удобно было)

Wandex
На сайте с 15.04.2012
Offline
19
#3

слова->документ - это называется инвертированный индекс.

Какой ориентировочный размер базы?

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