2011-08-13 54 views
1

我使用Lucene索引我的数据库,然后在特定字段(字段名称:关键字)上执行词组搜索。 目前我使用下面的代码:Lucene同义词扩展,词干,拼写检查和更多

 String userQuery = request.getParameter("query"); 
     //create standard analyzer object 
     analyzer = new StandardAnalyzer(Version.LUCENE_30); 
        Analyzer analyze=AnalyzerUtil.getPorterStemmerAnalyzer(analyzer); 
     //create File object of our index directory 
     File file = new File(LUCENE_INDEX_DIRECTORY); 
     //create index reader object 
     reader = IndexReader.open(FSDirectory.open(file),true); 
     //create index searcher object 
     searcher = new IndexSearcher(reader); 
     //create topscore document collector 
     collector = TopScoreDocCollector.create(1000, false); 
     //create query parser object 
     parser = new QueryParser(Version.LUCENE_30,"keyword", analyze); 
        parser.setAllowLeadingWildcard(true); 
     //parse the query and get reference to Query object 
     query = parser.parse(userQuery); 
     //********Line 1*********************** 
        //search the query 
     searcher.search(query, collector); 
     hits = collector.topDocs().scoreDocs; 
     //check whether the search returns any result 
     if(hits.length>0){//Code to retrieve hits} 

此代码工作正常进行制止,但现在我也想扩大我的查询做同义词搜索一样,如果我输入“人”,我的Lucene索引有一个条目“男性“,它仍然能够给我这一击。 我试图在第1行添加上面的代码query=SynExpand.expand(userQuery,
searcher, analyze,"keyword",serialVersionUID);
但它没有给我任何结果。 我也想介绍拼写检查,如果我输入“不可信”而不是“难以置信”,它仍然会给我一个结果。

我不知道为什么同义词扩展不适合我,以及如何做拼写检查。请如果有人能指导我,我会非常感激。

谢谢!

回答

3

模糊搜索可以通过查询关键字修饰来完成,即通过增加波浪:

keyword:ubelievable~ 

的更多细节和其他类型的查询,可能是有趣的,你看Lucene Parser Syntax

有两种处理同义词的方法。 查询扩展您正在尝试使用依靠WordNet。正如SynExpand的文档所述,您应该首先调用Syns2Index来使用扩展。这很简单,但只适用于英文单词。

如果您需要添加对多种语言的支持或添加自己的同义词,则可以在索引过程中使用同义词注入。这个想法是编写你自己的分析器,它将自己的字典中的同义词注入到索引文档中。这听起来很难实现,但幸运的是,在Lucene in Action这本书中有很好的例子(源代码免费提供,请参阅lia.analysis.synonym包,但我强烈建议您购买这本好书)。

+0

链接到@ffriend引用的示例http://subversion.assembla.com/svn/LuceneInAction/LuceneInAction/src/lia/analysis/synonym/ –