我在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
请告诉我的代码有什么问题。
答案 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*");