2011-08-13 81 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/ –