我有一个名为 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
查询来处理gte
和let
条件。您可以参考此范围查询示例。这可以用来代替query
部分。