我正在为新闻网站实现搜索功能。在该网站上,用户提交包含标题和文本的新闻文章,目前这些文章被直接插入数据库。我听说在包含长..长文本的数据库中进行全文搜索效率不高。
所以我尝试使用 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 是否高效?
最佳答案
你是对的,你不需要将每个文档重新添加到索引中,你只需要添加新的文档,其余的将保留在索引中。
但是你每次都需要创建一个新的 IndexWriter。如果您愿意,可以使用服务或其他使 IndexWriter 保持 Activity 状态的东西,但打开和关闭并不需要太多时间。如果您确实重用 IndexWriter,请确保在每次添加后使用 indexWriter.commit()。
关于java - 创建lucene索引的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11686677/