Lucene忽略/覆盖QueryParser中的模糊编辑距离

Lucene忽略/覆盖QueryParser中的模糊编辑距离,lucene,Lucene,给定以下查询字符串中带有FuzzySearch术语的QueryParser: fun fuzzyquery() { val query = QueryParser("term", GermanAnalyzer()).parse("field:search~4") println(query) } 结果查询实际上将具有以下表示形式: field:search~2 因此,~4被重写为~2。我将代码追溯到以下实现: QueryParserBa

给定以下查询字符串中带有FuzzySearch术语的QueryParser:

fun fuzzyquery() {
    val query = QueryParser("term", GermanAnalyzer()).parse("field:search~4")
    println(query)
}
结果查询实际上将具有以下表示形式:

field:search~2
因此,
~4
被重写为
~2
。我将代码追溯到以下实现:

QueryParserBase

protectedquerynewfuzzyquery(术语、浮点最小相似度、int前缀长度){
字符串文本=term.text();
int numEdits=FuzzyQuery.floatToEdits(最小相似性,text.codePointCount(0,text.length());
返回新的FuzzyQuery(术语、numEdits、前缀长度);
}
模糊查询

public static int floatToEdits(float minimumSimilarity,int termLen){
如果(最小相似性>=1.0F){
返回(int)数学最小值(最小相似性,2.0F);
}否则{
返回最小相似性==0.0F?0:Math.min((int)((1.0D-(双重)最小相似性)*(双重)termLen),2);
}
}

显而易见,任何高于2的值都将被重置为
2
。这是为什么?我如何才能将我想要的模糊编辑距离正确地输入查询解析器?

这可能会越界为“不是答案”-但对于注释(或一些注释)来说太长了:

这是为什么?

这似乎是一个设计决定。文档中提到了这一点

“该值介于0和2之间”

有一篇古老的文章对此进行了解释:

“更大的差异需要更高的计算效率,而且Lucene无法处理。”

不过,我不知道这有多正式

更正式地说,在类的JavaDoc中,它声明:

此查询最多可匹配2次编辑的术语。距离越远(尤其是启用了换位),通常就越不有用,而且会匹配大量术语词典

如何将所需的模糊编辑距离正确地输入查询解析器?

除非您自定义源代码,否则不能

我认为,最好(最差?)的选择可能是上面提到的
FuzzyQuery
Javadoc:

“如果你真的想要这个,请考虑使用N-gram索引技术(比如建议模块中的拼写检查程序)。”


在这种情况下,要付出的代价将是一个潜在的更大的指数——即使如此,n克也不等于编辑距离。我不知道这是否能满足您的需要。

我认为这是一个完全可以接受的答案。我在进一步研究时也发现了这一点