Elasticsearch NEST客户端纯数字搜索查询返回空结果问题排查
C# NEST客户端Elasticsearch纯数字查询无返回结果问题解决
问题现象
- 执行纯数字内容的Elasticsearch查询时,C# NEST客户端返回空结果
- 相同逻辑的查询语句在Kibana中执行可正常命中文档
原始错误代码
var result = await _elasticClient .SearchAsync<MyDocument>(search => search.Index("index") .From(offset) .Size(size) .Query(q => q.Bool(b => b .Should(should => should .MultiMatch(mm => mm.Query(query) .Fields(f => f .Field("stringNumber", boost: 3) .Field("a", boost: 2) .Field("b", boost: 1) ).Lenient(true) ) ) .Should(should => should .MultiMatch(mm => mm.Query(query) .Fields(f => f .Field("a", boost: 2) ).Fuzziness(Fuzziness.Ratio(1) ) ) ) ) );
Kibana正常执行的查询语句
{ "size": 20, "query": { "bool": { "should": [ {"multi_match": { "query": "1234", "fields": ["stringNumber", "a^2", "b^1"] }} ] } } }
根因分析
NEST的Bool查询构造器中,重复调用.Should()方法会覆盖之前配置的Should子句,而非追加。原始代码中两次独立调用.Should(),最终生效的只有第二个带Fuzziness.Ratio(1)的MultiMatch子句:
- 纯数字查询时,带模糊匹配规则的子句无法匹配到对应文档,因此返回空结果
- Kibana查询仅包含第一个无模糊匹配的MultiMatch子句,因此可以正常命中
修复后代码
var result = await _elasticClient .SearchAsync<MyDocument>(search => search.Index("index") .From(offset) .Size(size) .Query(q => q.Bool(b => b .Should(should => should .MultiMatch(mm => mm.Query(query) .Fields(f => f .Field("stringNumber", boost: 3) .Field("a", boost: 2) .Field("b", boost: 1) ).Lenient(true) ) , should2 => should2 .MultiMatch(mm => mm.Query(query) .Fields(f => f .Field("a", boost: 2) ).Fuzziness(Fuzziness.Ratio(1) ) ) ) ) );
修复说明
将两个MultiMatch子句放在同一个.Should()方法的参数列表中,用逗号分隔,两个子句会被同时加入Should数组中,符合预期的查询逻辑。
内容的提问来源于stack exchange,提问作者Marcus Lagerstedt
相关产品推荐
相关产品推荐

