2010-07-13 9 views
2

Я хотел бы использовать Lucene для индексирования таблицы в существующей базе данных. Я думал процесс, как:Lucene Indexing

  1. Создать «Поле» для каждого столбца в таблице
  2. магазин все поля
  3. «ПРОАНАЛИЗИРУЙТЕ» все поля для поля с первичным ключом исключением
  4. Храните каждую строку в таблице в виде документа Lucene.

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

Я знаю, что Lucene предоставляет возможность не хранить поле. Я думал о двух решениях:

  1. магазин поле, независимо от размера и, если удар будет найден для поиска, извлечения соответствующего поля из документа
  2. Не храните поле и если хит найдено для поиска, запрос базы данных, чтобы получить соответствующую информацию из

я понимаю, что не может быть один размер подходит всем ответ ...

ответ

2

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

+1

+1 для ответа Паскаля. Вы также можете обозначить большое поле и * не хранить * его. Таким образом, вы можете запрашивать (искать) в поле, получать соответствующий идентификатор документа/записи и извлекать запись из db. – Mikos

+0

Спасибо за ваши ответы. Если я предпочитаю не сохранять какое-либо поле, я также не смогу использовать выделение (Lucene contrib module), чтобы выделить поисковые запросы? –

+0

Это можно сделать без сохранения текста, но это не простой способ. См. Http: //www.lucidimagination.com/search/document/5ea8054ed8348e6f/highlight_arbitrary_text # 60f592f5ff0de0c5 –

1

Я категорически не согласен с ответом Паскаля. Размер индекса может существенно повлиять на производительность поиска. Основными причинами являются:

  • сохраненные поля увеличивают индексный размер. Это может быть проблемой относительно относительно медленной системы ввода-вывода;
  • сохраненные поля загружаются при загрузке документа в память. Это может быть хорошим напряжением для GC
  • сохраненные поля могут повлиять на время повторного открытия считывателя.

Окончательный ответ, конечно, все зависит. Если исходные данные уже хранятся где-то в другом месте, рекомендуется извлечь их из исходного хранилища данных.

+1

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

0

При добавлении строки из базы данных в Lucene вы можете судить, действительно ли нужно писать в инвертированный указатель. Если нет, вы можете использовать Index.NOT, чтобы избежать слишком большого количества данных для инвертированного индекса. Между тем, вы можете судить, где будет запрашиваться столбец по значению ключа. Если нет, вам не нужно использовать Store.YES для хранения данных.