为每个过滤的弹性搜索文档运行一个子查询



我有一个名为 Employees 的索引,其结构如下:

{
id: integer,
name: text,
age: integer,
cityId: integer,
resumeText: text           <--------- parsed resume text
}

我想搜索具有某些条件的员工,例如年龄> 40 岁、简历文本包含特定技能或员工属于某个城市等,并且到目前为止的要求有以下查询:

{
query:{
bool:{
should:[
{
term:{
cityId:2990
},
{
match:{
resumeText:"marketing"
},
{
match:{
resumeText:"critical thinking"
}}}
],
filter:{
range:{
age:{
gte:40
}}}}}
}

这给了我预期的结果,但我也想知道在返回的文档/员工中,哪些是简历文本包含上述技能的文档/员工。 例如,在响应中,我想获得提到此文档与"批判性思维"匹配的文档,该员工同时匹配了技能,而该员工不匹配任何技能(因为它是根据其他过滤器返回的(

我需要做哪些更改才能获得预期的结果:

  • 聚合可以提供帮助吗?
  • 我们可以为每个过滤的文档编写脚本来计算所需的结果(每个文档的子查询(吗?
  • 还有其他方法吗?

是的,您可以使用聚合。

参考这个

您可以像有多少简历与您正在寻找的每项技能相匹配。

GET employees/_search
{
"size": 0,
"aggs" : {
"messages" : {
"filters" : {
"filters" : {
"marketing_resume_count" :   { "match" : { "resumeText" : "marketing"   }},
"thinking_resume_count" : { "match" : { "resumeText" : "thinking" }}
}
}
}
}
}

要扩展到您的使用案例,请执行以下操作:

可以将query部分添加到查询中,如下所示

GET employees/_search
{
"size": 0,
"query":{
"match":{
"region":"AM"
}
},
"aggs" : {
"messages" : {
"filters" : {
"filters" : {
"marketing_resume_count" :   { "match" : { "resumeText" : "marketing"   }},
"thinking_resume_count" : { "match" : { "resumeText" : "thinking" }}
}
}
}
}
}

可以使用range查询来处理gtelet条件。您可以参考此范围查询示例。这可以用来代替query部分。

最新更新