Lucene3.1对QueryParser做了调整,搜索语法树发生了变化。示例效果如下:
示例代码:
注意其中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之后的版本,两个搜索词就等价了。
示例代码:
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之后的版本,两个搜索词就等价了。