我正在寻找一种编码lucene模糊查询的方法,该查询搜索与精确短语相关的所有文档。如果我搜索" mosa员工欣赏",文档包含"大多数员工欣赏"将作为结果返回。
我试图使用:
FuzzyQeury = new FuzzyQuery(new Term("contents","mosa employee appreicata"))
不幸的是,它在经验上并不起作用。 FuzzyQuery采用编辑器距离,理论上," mosa员工欣赏"应与#34相匹配;大多数员工都很欣赏"提供适当的距离。这看起来有点奇怪。
任何线索?谢谢。
答案 0 :(得分:15)
这里有两个可能的问题。第一:我猜测正在分析“内容”字段,以便“大多数员工apreciate”不是一个术语,而是三个术语。在这种情况下,定义为单个术语是不合适的。
然而,即使列出的内容是单个术语,我们遇到的第二个可能的问题是术语之间的距离太大以获得匹配。 mosa employee appreicata
和most employees appreciate
之间的Damerau-Levenshtein距离为4(顺便提一下,我拼写的平均第一次拍摄距离之间的近似距离)
“Damerau-Levenshtein”和正确的拼写)。模糊查询,从4.0开始,由于性能限制而处理编辑距离不超过2,并且假设较大距离通常不是特别相关。
如果您需要使用模糊术语执行词组查询,则应查看MultiPhraseQuery
或合并一组SpanQueries
(尤其是SpanMultiTermQueryWrapper
和SpanNearQuery
)满足您的需求。
SpanQuery[] clauses = new SpanQuery[3];
clauses[0] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("contents", "mosa")));
clauses[1] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("contents", "employee")));
clauses[2] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("contents", "appreicata")));
SpanNearQuery query = new SpanNearQuery(clauses, 0, true)
由于没有任何单个术语的编辑距离大于2,因此这应该更有效。
答案 1 :(得分:1)
femtoRgon的答案很棒!谢谢。
还有另一种方法可以解决这个问题。
//declare a mutilphrasequery
MultiPhraseQuery childrenInOrder = new MultiPhraseQuery();
//user fuzzytermenum to enumerate your query string
FuzzyTermEnum fuzzyEnumeratedTerms1 = new FuzzyTermEnum(reader, new Term(searchField,"mosa"));
FuzzyTermEnum fuzzyEnumeratedTerms2 = new FuzzyTermEnum(reader, new Term(searchField,"employee"));
FuzzyTermEnum fuzzyEnumeratedTerms3 = new FuzzyTermEnum(reader, new Term(searchField,"appreicata"));
//this basically pull out the possbile terms from the index
Term termHolder1 = fuzzyEnumeratedTerms1.term();
Term termHolder2 = fuzzyEnumeratedTerms2.term();
Term termHolder3 = fuzzyEnumeratedTerms3.term();
//put the possible terms into multiphrasequery
if (termHolder1==null){
childrenInOrder.add(new Term(searchField,"mosa"));
}else{
childrenInOrder.add(fuzzyEnumeratedTerms1.term());
}
if (termHolder2==null){
childrenInOrder.add(new Term(searchField,"employee"));
}else{
childrenInOrder.add(fuzzyEnumeratedTerms2.term());
}
if (termHolder3==null){
childrenInOrder.add(new Term(searchField,"appreicata"));
}else{
childrenInOrder.add(fuzzyEnumeratedTerms3.term());
}
//close it - it is important to close it
fuzzyEnumeratedTerms1.close();
fuzzyEnumeratedTerms2.close();
fuzzyEnumeratedTerms3.close();
答案 2 :(得分:1)
ComplexPhraseQueryParser
处理短语词的模糊搜索-即,指定应模糊搜索的词和不应该模糊搜索的词。工作原理
Query query = new ComplexPhraseQueryParser("content", analyzer)
.parse("some test~ query~ blah blah");
似乎工作正常。不确定性能,但是似乎可以在小型数据集上很好地工作。
答案 3 :(得分:0)
我有一些(很小)的铣刀,具有以下特点:
String[] searchTerms = searchString.split(" ");
FuzzyLikeThisQuery fltw = new FuzzyLikeThisQuery(searchTerms.length, new StandardAnalyzer());
Arrays.stream(searchTerms)
.forEach(term -> fltq.addTerms(term, FIELD, SIMILARITY_IN_EDITS, PREFIX_LENGTH);
此查询将太远的字符串与索引匹配。不匹配的字符串是其中每个术语与索引内容中使用的术语相距超过2次编辑的字符串。