Lucene3.1对QueryParser做了调整

来源:互联网 发布:网络问政 编辑:程序博客网 时间:2024/05/18 21:11
Lucene3.1对QueryParser做了调整,搜索语法树发生了变化。示例效果如下:


示例代码:


public static final String word = "国务院办公厅关于印发2011年食品安全重点工作安排的通知";   /**      * 建索引<br>      *       * @throws CorruptIndexException      * @throws LockObtainFailedException      * @throws IOException      */      private static void build() throws CorruptIndexException, LockObtainFailedException, IOException {          String path = "index";          IndexWriter writer = new IndexWriter(FSDirectory.open(new File(path)), new SmartChineseAnalyzer(Version.LUCENE_35), true, MaxFieldLength.LIMITED);          Document document = new Document();          document.add(new Field("text", word, Store.YES, Index.ANALYZED));          writer.addDocument(document);          writer.optimize();          writer.close();      }          /**      * 搜索      *       * @param keyword      * @throws CorruptIndexException      * @throws IOException      * @throws ParseException      * @throws InvalidTokenOffsetsException      */      private static void search() throws CorruptIndexException, IOException, ParseException {          String keyword = "国务院食品安全";        Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_35);          QueryParser parser = new QueryParser(Version.LUCENE_31, "text", analyzer);          Query query = parser.parse(keyword);          IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("index")));          System.out.println(query);          TopDocs topDocs = searcher.search(query, 10);          ScoreDoc[] scoreDocs = topDocs.scoreDocs;          System.out.println("hits:" + topDocs.totalHits);          for (ScoreDoc scoreDoc : scoreDocs) {              Document doc = searcher.doc(scoreDoc.doc);              String text = doc.get("text");              System.out.println(text);          }      }  






注意其中QueryParser parser = new QueryParser(Version.LUCENE_31, "text", analyzer)的部分,采用Version.LUCENE_31和Version.LUCENE_30(及以前)的搜索结果是不一样的,结果如下:


采用30版本的结果:
text:"国务院 食品 安全"
hits:0
采用31版本的结果:
text:国务院 text:食品 text:安全
hits:1


可以发现,在LUCENE3.0之前的版本中,用"国务院食品安全"做搜索词搜索"国务院办公厅关于印发2011年食品安全重点工作安排的通知"这段话是搜不到的,而用"国务院 食品安全"(中间有一个空格)就可以。3.1之后的版本,两个搜索词就等价了。