Lucene Индексирование и поиск - PullRequest
0 голосов
/ 15 июля 2010

Я пытаюсь проиндексировать таблицу в базе данных, используя Lucene.Я использую Lucene только для индексации, поля не сохраняются.Упомянутая выше таблица имеет пять столбцов (идентификатор пользователя (PK), описание, номер отчета, тип отчета, отчет).

Я намерен использовать комбинацию ИД пользователя, номера отчета и типа отчета для получения данных из базы данных, если Lucene обнаружит попадание.

Одна запись в таблице может занимать несколько строк, например,

JQ123, SOMEDESCRIPTION, 1, FIN, содержание отчета о плавниках
JQ123, AnotherDescription, 2, MATH, содержание математического отчета
JQ123, YetAnotherDesc, 3, MATH, содержимое другого математического отчета
JD456, MoreDesc, 1, STAT, содержимое отчета о статистике ..so on

Некоторые типы отчетов, например (MATH), имеют высоко структурированное содержимое (XML, хранится в виде строки в последнем столбце) и вВ будущем я, возможно, захочу выделить часть содержимого в качестве поля документа.

До сих пор моя стратегия заключалась в создании документа Lucene для каждой строки и индексации его.Я думал, что это 1. Это легко и кажется логичным (для меня) 2. , если я в итоге извлекаю содержимое из определенных типов документов и превращаю их в поля,все, что потребуется, - это оператор if, который проверяет тип отчета и создает эти новые поля.Вот соответствующий код:

public void createDocument(){
Document luceneDocument=new Document();
luceneDocument.add(new Field("userid", userID, Field.Store.NO, Field.Index.NOT_ANALYZED));
luceneDocument.add(new Field("reportnumber", reportNum, Field.Store.NO, Field.Index.NOT_ANALYZED));
luceneDocument.add(new Field("reporttype", reportType, Field.Store.NO, Field.Index.NOT_ANALYZED));
luceneDocument.add(new Field("description", description, Field.Store.NO, Field.Index.ANALYZED));
luceneDocument.add(new Field("report", report, Field.Store.NO, Field.Index.ANALYZED));

if(reporttype.equalsIgnoreCase("MATH"){
luceneDocument.add(new Field("more fields", field content, Field.Store.NO, Field.Index.ANALYZED));
}
 indexwriter.add(luceneDocument)
 indexwriter.close
}           

1. Влияет ли наличие разных документов для одной и той же записи на эффективность поиска Lucene каким-либо образом?
2. Будет ли при таком подходе существенное дисковое пространство по сравнению с наличием одного документа на запись в Lucene (я не храню любые поля )?

Заранее спасибоза ваш ответ

1 Ответ

0 голосов
/ 15 июля 2010

Во-первых, обратите внимание, как настроен индекс. Индекс каждого термина выглядит так:

[термин] [DocId] [DocId] ...

где [docid] - это идентификаторы документов, которые содержат этот термин. Итак, чтобы ответить на ваши вопросы:

  1. Если, например, MATH и STATS содержат один и тот же термин, они будут перечислены здесь дважды. И поэтому при поиске нужно взглянуть на два документа, тогда как в теории ему нужно будет взглянуть только на один. Но это очень минимальное наказание.
  2. Я предполагаю, что вы должны хранить хотя бы идентификатор для каждого документа, так что вы увидите небольшое увеличение хранилища. Это будет (длина идентификатора) * (количество документов в строке). Опять же, это тривиально.

Более важной проблемой является тот факт, что запросы не могут быть надлежащим образом нормированы. Например, поиск находит строку # 1, которая соответствует в MATH и STATS, и строку # 2, которая соответствует только в MATH. Вам нужно будет вручную ранжировать строку № 1 выше, потому что Lucene не будет знать, что два документа на самом деле являются одной и той же строкой.

Вкратце: если у вас нет абсолютно массивного индекса, я бы не стал сильно беспокоиться о хранении / производительности. Но я бы беспокоился о том, как ты оценишь этот запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...