2012-07-27 65 views
1

我正在实现新闻网站的搜索功能。在该网站上,用户提交包含标题和文本的新闻文章,目前这些文章直接插入到数据库中。我听说在包含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?

回答

0

我是否需要在每次提交文章为 时创建新的IndexWriter?

没有

是效率非常频繁地打开和关闭的IndexWriter?

绝对不是!您应该阅读索引here的指导原则。

+0

你绝对不会说,但是当你有用户提交文件时,除非你想存储它们,然后将它们加入一堆,否则你别无选择。 – Rhand 2012-07-27 12:01:53

+0

我对这个问题做出了回应:“是否能够非常频繁地打开和关闭IndexWriter?”这样做不是一个好主意。 – Mikos 2012-07-27 12:18:47

1

你是对的,你不需要读索引的每一个文件,你只需要添加新的文件,其余的将保留在索引中。

但是,你确实需要每次创建一个新的IndexWriter。如果你喜欢,你可以使用服务或者让IndexWriter保持活跃的东西,但是开启和关闭并不需要太多时间。如果您确实重复使用IndexWriter,请确保在每次添加之后使用indexWriter.commit()。