ニュース Web サイトの検索機能を実装しています。そのウェブサイトでは、ユーザーはタイトルとテキストを含むニュース記事を投稿します。現在、これらの記事はデータベースに直接挿入されています。長い長いテキストを含むデータベース内の全文検索は効率的ではないと聞いています。
そこで、索引付けと検索に lucene を使用してみました。それを使用して完全なデータベースにインデックスを付けることができ、コンテンツを検索することもできます.しかし、最善のアプローチを使用しているかどうかはわかりません.
ここに私のインデクサークラスがあります:
public class LuceneIndexer {
public static void indexNews(Paste p ,IndexWriter indexWriter) throws IOException {
Document doc = new Document();
doc.add(new Field("id", p.getNewsId(), Field.Store.YES, Field.Index.NO));
doc.add(new Field("title", p.getTitle(), Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("text", p.getNewsRawText(), Field.Store.YES, Field.Index.UN_TOKENIZED));
String fullSearchableText = p.getTitle() + " " + p.getNewsRawText();
doc.add(new Field("content", fullSearchableText, Field.Store.NO, Field.Index.TOKENIZED));
indexWriter.addDocument(doc);
}
public static void rebuildIndexes() {
try {
System.out.println("started indexing");
IndexWriter w = getIndexWriter();
ArrayList<News> n = new GetNewsInfo().getLastPosts(0);
for (News news : n) {
indexNews(news,w );
}
closeIndexWriter(w);
System.out.println("indexing done");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static IndexWriter getIndexWriter() throws CorruptIndexException, LockObtainFailedException, IOException {
IndexWriter indexWriter = new IndexWriter(GlobalData.LUCENE_INDEX_STOREAGE, new StandardAnalyzer(), true);
return indexWriter;
}
public static void closeIndexWriter(IndexWriter w) throws CorruptIndexException, IOException {
w.close();
}
上記のコードは効率的ですか?
データベース全体のインデックスを再度作成するのではなく、ユーザーが送信したときにドキュメントをインデックスに追加する必要があると思います。
- 記事が送信されるたびに新しい IndexWriter を作成する必要がありますか?
- IndexWriter を頻繁に開いたり閉じたりするのは効率的ですか?