2016-06-10 318 views
0

我在lucene 4.8和代碼中有一個下面的數據索引。Lucene搜索結果

Finance expense 
Admin expenses 
Transaction expense 
Salary expenses 

索引:

try { 
    writer = createWriter(ramDirectory); 
    for(String line : readFile(FILE_PATH)) { 
     String[] split = line.split(","); 
     Document doc = new Document(); 
     doc.add(new TextField("id", split[0].trim(), Field.Store.YES)); 
     doc.add(new TextField("name", split[1].trim(), Field.Store.YES));          
     writer.addDocument(doc);     
    } 
    writer.commit();    
} finally { 
    if(writer != null) { 
     writer.close(); 
    } 
} 

搜索

IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(ramDirectory)); 
QueryParser nameQParser = new QueryParser(Version.LUCENE_48, "name", new StandardAnalyzer(Version.LUCENE_48)); 
Query query = nameQParser.parse("expense"); 
TopDocs queryResults = searcher.search(query, 10); 

以上觀點僅供參考下面兩個結果代碼的回報。它不會返回最後有's'的結果。

當前結果:

Finance expense 
Transaction expense 

預期的結果:

Finance expense 
Admin expenses 
Transaction expense 
Salary expenses 

請所說的其實是錯誤的,我的代碼。

回答

0

你可以使用WildCardQuery,因爲這個詞expense包含了所有四個文檔中,以便您可以通過搜索字符串作爲*expense*這將返回name字段中有費用的所有文檔。

不要忘記設置QueryParser允許領先的通配符如下:

QueryParser.setAllowLeadingWildcard(true) 

製作按照您的代碼更改:

nameQParser.setAllowLeadingWildcard(true); 
Query query = nameQParser.parse("*expense*"); 
0

一般來說,處理複數的最好方法是使用能更好地處理它們的分析器。 EnglishAnalyzer包含一個應該處理的詞幹分析器。它會將「開支」和「費用」(以及「費用化」和「費用」)都減少到指數中的「花費」。

Anternately,有點笨重,但你可以只使用一個前綴查詢在這種情況下:Query query = nameQParser.parse("expense*");