如何通过Elasticsearch查询指定code_raw的所有祖先文档?
Elasticsearch层级code反向查询实现方案
无需预处理的查询方式
可以通过**脚本查询(Script Query)**直接实现,不需要提前处理数据。核心逻辑是判断文档的code_raw是否为输入值的前缀,同时限定前缀的长度范围(对应你需要的层级深度)。
示例查询DSL:
{ "query": { "script": { "script": { "source": "def target = params.target_code; def doc_code = doc['code_raw'].value; return target.startsWith(doc_code) && doc_code.length() >= target.length() - 3 && doc_code.length() <= target.length();", "params": { "target_code": "A01359" } } } } }
target.startsWith(doc_code):确保文档的code_raw是目标值的前缀doc_code.length() >= target.length() -3:控制要返回的层级深度(比如目标值长度为5,减3后长度为2,对应最上层的A01)- 可根据实际层级需求调整长度差值,需要更多上级层级则增大数值
预处理优化方案
如果数据量较大,脚本查询性能可能不足,建议在索引阶段预处理:
- 给每个文档新增字段(如
code_prefixes),存储该code_raw所有上级前缀(含自身)。例如code_raw为A01359的文档,code_prefixes值为["A01359", "A0135", "A013", "A01"] - 查询时直接用
terms查询匹配该字段,传入目标值的所有前缀列表即可:
示例查询DSL:
{ "query": { "terms": { "code_prefixes": ["A01359", "A0135", "A013", "A01"] } } }
这种方式查询效率远高于脚本查询,适合高频查询场景。
内容的提问来源于stack exchange,提问作者Arturo Hernandez
相关产品推荐
相关产品推荐

