升级至Nest 2(Elasticsearch 2.3):FuzzyMinimumSimilarity替代方案及代码改写咨询
嘿,刚好对Nest 2和Elasticsearch 2.3的这段变更很熟悉,我来给你详细拆解下解决方案:
一、FuzzyMinimumSimilarity的替代方案
在Elasticsearch 2.x(对应Nest 2)中,FuzzyMinimumSimilarity这个参数被完全移除了,取而代之的是**fuzziness参数**,不过两者的逻辑有区别:
- 原来的
FuzzyMinimumSimilarity是用相似度(0到1之间的数值)来控制模糊匹配的严格程度,比如0.7意味着匹配度至少要达到70% - 新的
fuzziness参数直接用编辑距离(即需要修改多少个字符才能匹配)来定义,同时支持更灵活的取值方式:- 直接指定整数编辑距离,比如
1或2(最多允许修改2个字符) - 使用
auto:Elasticsearch会根据目标字符串的长度自动选择合适的编辑距离,规则是:- 字符串长度≤2:必须完全匹配(编辑距离0)
- 3≤长度≤5:允许1个编辑距离
- 长度>5:允许2个编辑距离
- 如果一定要对应原来的0.7相似度,可以通过公式转换:编辑距离 = 四舍五入((1 - 相似度) × 字符串长度),不过更推荐用
auto,它能适配不同长度的字符串,更符合实际业务需求。
- 直接指定整数编辑距离,比如
二、原有代码的Nest v2改写
你提供的原有代码:
new SearchDescriptor<T>().Type(searchTypes).Query(q =>q.QueryString(qs => qs.Query(fuzzy).FuzzyMinimumSimilarity(0.7)));
改写为Nest 2版本的话,核心是把FuzzyMinimumSimilarity(0.7)替换为Fuzziness相关设置,同时注意FuzzyMaxExpansions的参数要求:
new SearchDescriptor<T>() .Type(searchTypes) .Query(q => q.QueryString(qs => qs .Query(fuzzy) // 替换FuzzyMinimumSimilarity,这里用auto作为示例,也可以改成EditDistance(2)等 .Fuzziness(Fuzziness.Auto) // FuzzyMaxExpansions的参数是整数,控制模糊查询扩展的最大术语数,默认50 // 你提到的0.7应该是笔误,这里设置合理的整数值即可,比如100 .FuzzyMaxExpansions(100) ));
补充说明FuzzyMaxExpansions:
这个参数和原来的相似度没有关系,它的作用是限制模糊查询时Elasticsearch会扩展出的候选术语数量,数值越大,匹配的结果可能越多,但性能消耗也会增加。默认值是50,你可以根据业务场景调整,比如结果太少就调大,性能差就调小。
三、OnFieldsWithBoost的替代方案
你提到OnFieldsWithBoost也被移除了,原来用来给指定字段设置查询权重,在Nest 2里可以用Fields方法结合权重参数来实现:
比如原来的代码如果是:
.QueryString(qs => qs.OnFieldsWithBoost(fb => fb.Add("title", 3).Add("content", 1)))
改写为Nest 2版本:
.QueryString(qs => qs .Fields(f => f // 强类型字段+权重 .Field(p => p.Title, 3) .Field(p => p.Content, 1) // 或者用字符串字段名 // .Field("title", 3) // .Field("content", 1) ) )
内容的提问来源于stack exchange,提问作者Gonzalo
相关产品推荐
相关产品推荐

