C#调用Elasticsearch检索数据时platform匹配条件不生效问题
问题根因
C#代码中拼接的Elasticsearch查询JSON和Postman验证通过的查询逻辑不一致,错误将bool查询下的must子句写为should子句:
- Postman可正常运行的查询中,platform匹配条件放在
must数组下,属于必须满足的强匹配条件 - C#代码拼接的JSON中,platform匹配条件放在
should数组下。Elasticsearch的bool查询规则为:当查询同时存在filter子句、无must子句时,should下的条件默认不做强制匹配,仅参与相关性算分,只要满足filter中的时间范围条件就会返回结果,因此platform过滤规则未生效。
修复方案
直接修改C#代码中拼接的JSON字符串,将should替换为must,和Postman验证通过的查询结构保持一致即可,修改后的JSON字符串如下:
string json = "{\"from\": 0,\"size\": 10000,\"query\":{\"bool\":{\"must\":[{\"match\":{\"platform\":\"COSMOS\"}}],\"filter\":[{\"range\":{\"cu_ticketLastUpdated_date\":{\"gte\":\"2022-05-31 00:00:00\",\"lt\":\"2022-05-31 23:59:59\"}}}]}}}";
优化建议:手动拼接JSON字符串极易出现关键字拼写错误、转义符错误这类问题,后续可以使用对象序列化的方式生成查询JSON,比如通过Newtonsoft.Json的
JsonConvert.SerializeObject()方法将构造好的查询匿名对象序列化为JSON字符串,避免手动拼写失误。
序列化写法示例:var queryParam = new { from = 0, size = 10000, query = new { @bool = new { must = new[] { new { match = new { platform = "COSMOS" } } }, filter = new[] { new { range = new { cu_ticketLastUpdated_date = new { gte = "2022-05-31 00:00:00", lt = "2022-05-31 23:59:59" } } } } } } }; string json = JsonConvert.SerializeObject(queryParam);这种写法不需要手动处理转义符,结构清晰,后续修改查询条件时也不容易出错。
内容的提问来源于stack exchange,提问作者Madha venugopal
相关产品推荐
相关产品推荐

