我正在实现新闻网站的搜索功能。在该网站上,用户提交包含标题和文本的新闻文章,目前这些文章直接插入到数据库中。我听说在包含long..long文本的数据库中进行全文搜索效率不高。创建lucene索引的方法
所以我尝试使用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?
你绝对不会说,但是当你有用户提交文件时,除非你想存储它们,然后将它们加入一堆,否则你别无选择。 – Rhand 2012-07-27 12:01:53
我对这个问题做出了回应:“是否能够非常频繁地打开和关闭IndexWriter?”这样做不是一个好主意。 – Mikos 2012-07-27 12:18:47