Lucene搜索结果

时间:2016-06-10 20:46:01

标签: lucene

我在lucene 4.8和代码中有以下数据索引。

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

请告诉我的代码有什么问题。

2 个答案:

答案 0 :(得分:0)

通常,处理复数的最佳方法是使用能够更好地处理复数的分析器。 EnglishAnalyzer包括一个应该处理它的词干分析器。它会减少"费用"和"费用" (以及"支出"和"花费")到干"费用"在索引中。

有点笨拙,但在这种情况下你可以使用前缀查询:Query query = nameQParser.parse("expense*");

答案 1 :(得分:0)

您可以使用WildCardQuery,因为expense这个词包含在所有四个文档中,因此您可以将搜索字符串作为*expense*传递,这将返回name中所有费用的文档领域。

不要忘记设置QueryParser以允许带有以下内容的通配符:

QueryParser.setAllowLeadingWildcard(true)

在您的代码中进行以下更改:

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