ElasticSearch中query_string查询如何自动忽略文档不存在的检索字段
解决方案
有两种常用的实现方式,可根据你的Elasticsearch版本选择:
方法1:使用skip_unavailable_fields参数(推荐,Elasticsearch 7.10+版本支持)
直接在query_string查询中添加"skip_unavailable_fields": true配置即可,该参数会自动识别并跳过查询语句中不存在的字段,不会将这些无效条件纳入查询逻辑,也不会抛出异常。
修改后的查询示例:
{ "query": { "bool": { "must": [ { "query_string": { "query": "(*catalog*:Trunk) AND (*@type*:Product) AND (*countryCode*:USA)", "skip_unavailable_fields": true } } ] } } }
上述查询执行时会自动忽略countryCode对应的条件,等价于仅查询(*catalog*:Trunk) AND (*@type*:Product)。
方法2:使用lenient参数(兼容低版本Elasticsearch)
如果你的Elasticsearch版本低于7.10,可添加"lenient": true配置,该参数会忽略查询过程中因字段不存在、字段类型不匹配产生的异常,避免查询直接报错。
注意:该配置下,不存在的字段对应的查询条件会被判定为
无匹配,如果你的查询用AND连接多个条件,会导致整个查询无返回结果,仅适合不需要保留其他条件查询结果的场景。如果需要完全忽略无效条件,还是建议升级Elasticsearch版本使用方法1。
业务层兼容方案
如果你不想修改查询语句,也可以在业务代码中先调用Elasticsearch的获取字段映射接口,拿到当前索引的所有合法字段列表,构造查询前先过滤掉不存在的字段,再生成最终的查询语句。
内容的提问来源于stack exchange,提问作者Raghavan
相关产品推荐
相关产品推荐

