Elasticsearch:按嵌套字段总和+公司名通配符筛选用户文档
Elasticsearch 动态查询:筛选符合累计工作时长条件的用户
我们需要从包含多段工作经历的用户文档中,筛选出在公司名称匹配通配符*name*的企业中累计工作时长≥50个月的用户。
核心查询DSL
{ "query": { "bool": { "filter": [ { "nested": { "path": "work_experiences", "query": { "wildcard": { "work_experiences.company": "*name*" } }, "inner_hits": {} } }, { "script": { "script": { "source": """ int totalDuration = 0; for (int i = 0; i < doc['work_experiences.company'].length; i++) { String companyName = doc['work_experiences.company'][i].value; if (companyName =~ /.*name.*/) { totalDuration += doc['work_experiences.duration'][i].value; } } return totalDuration >= 50; """, "lang": "painless" } } } ] } } }
关键部分说明
- 嵌套查询(nested):由于
work_experiences是嵌套数组类型,必须通过nested查询定位到数组内符合公司名称条件的条目,inner_hits可返回匹配的具体工作经历,便于结果验证。 - Painless脚本筛选:遍历用户的所有工作经历,用正则表达式匹配符合
*name*规则的公司,累加对应工作时长,最终判断总和是否达到50个月的要求。
注意事项
- 字段映射要求:确保
work_experiences字段的映射为nested类型,若当前不是,需先更新索引映射:
PUT /your_user_index/_mapping { "properties": { "work_experiences": { "type": "nested" } } }
- 性能优化:通配符前缀
*name*的查询性能较差,数据量较大时,建议改用match_phrase_prefix或调整分词策略,避免全量扫描。
内容的提问来源于stack exchange,提问作者dfens
相关产品推荐
相关产品推荐

