Elasticsearch 6.x:指定工作区中排除固定键匹配动态键值的查询
可行的查询方案
针对你的需求,这里提供两种实用的解决方案,适配Elasticsearch 6+版本:
方案1:使用multi_match结合字段排除/通配符
直接通过multi_match查询所有字段,同时排除entry_id和workspace_id,配合bool过滤指定workspace_id的文档:
{ "query": { "bool": { "must": [ { "multi_match": { "query": "abc", "fields": ["*", "-entry_id", "-workspace_id"], "operator": "OR" } } ], "filter": [ { "term": {"workspace_id": "People"} } ] } } }
fields: ["*", "-entry_id", "-workspace_id"]:匹配所有字段,但排除固定的两个字段;operator: "OR":确保任意一个动态字段匹配"abc"即可(默认就是OR,可显式声明);filter中的term查询不会影响评分,且会被缓存,提升查询性能。
方案2:预定义联合字段(推荐,性能更优)
如果动态字段较多,通配符查询可能影响性能,建议在索引映射中新增一个自定义字段(比如dynamic_content),通过copy_to属性让所有动态字段自动将值复制到该字段:
索引映射示例(动态字段配置)
{ "mappings": { "properties": { "entry_id": {"type": "keyword"}, "workspace_id": {"type": "keyword"}, "some_dynamic_key_1": { "type": "text", "copy_to": "dynamic_content" }, "some_dynamic_key_2": { "type": "text", "copy_to": "dynamic_content" } // 其他动态字段均配置"copy_to": "dynamic_content" } } }
查询语句
之后只需查询这个联合字段,配合workspace_id过滤:
{ "query": { "bool": { "must": [ { "match": { "dynamic_content": "abc" } } ], "filter": [ { "term": {"workspace_id": "People"} } ] } } }
这种方式避免了通配符遍历所有字段,查询性能更稳定,尤其适合动态字段数量较多的场景。
内容的提问来源于stack exchange,提问作者Prosto_Oleg
相关产品推荐
相关产品推荐

