创建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是否有效

您说得对,不需要将每个文档都读取到索引中,只需要添加新文档,其余文档将保留在索引中。

但是,您每次都需要创建一个新的IndexWriter。如果你愿意,你可以使用一个服务或其他东西来保持IndexWriter的活力,但打开和关闭并不需要太多时间。如果重复使用IndexWriter,请确保每次添加后都使用IndexWriter.commit()。

我需要在每次发布文章时创建新的IndexWriter吗提交?

频繁地打开和关闭IndexWriter是否有效?

绝对不是!您应该阅读此处的索引指南。

最新更新