我们有一个系统,可以使用映射器附件插件在 ElasticSearch 中索引简历文档。除了索引文档之外,我还存储一些基本信息,例如它是否与申请人或员工相关、他们的姓名以及他们在系统中分配的 ID。运行的查询在命中 ES 时可能看起来像这样:
{
"size" : 100,
"query" : {
"query_string" : {
"query" : "software AND (developer OR engineer)",
"default_field" : "fileData"
}
},
"_source" : {
"includes" : [ "applicant.*", "employee.*" ]
}
}
并得到如下结果:
"hits": [100]
0: {
"_index": "careers"
"_type": "resume"
"_id": "AVEW8FJcqKzY6y-HB4tr"
"_score": 0.4530588
"_source": {
"applicant": {
"name": "John Doe"
"id": 338338
}
}
}...
我想要做的是限制结果,这样,如果 id 为 338338 的 John Doe 在系统中有三份不同的简历都与查询匹配,我只会返回一项匹配项,最好是得分最高的一项(尽管这并不重要,只要我能找到那个人)。我一直在尝试使用过滤器和聚合的不同选项,但我还没有偶然发现一种方法来做到这一点。
在得到结果后,我可以在应用程序中采取多种方法来调用 ES 来解决这个问题,但如果我可以在 ES 方面做到这一点,那就更好了。由于我将查询限制为 100 个结果,因此我希望返回 100 个个人,而不是返回 100 个结果,然后发现其中 25% 是与同一个人相关的文档。
最佳答案
您想要做的是聚合以获取前 100 条唯一记录,然后进行子聚合以获取“top_hits”。这是我的系统中的一个示例。在我的示例中,我是:
- 将结果大小设置为 0,因为我只关心聚合
- 将聚合大小设置为 100
- 对于每个聚合,获取前 1 个结果
获取索引1/类型1/_search
{
“大小”:0,
“阿格斯”:{
“a1”:{
“条款”:{
"field": "输入.用户名",
“大小”:100
},
“阿格斯”:{
“热门点击”:{
“热门点击”:{
“尺寸”:1
}
}
}
}
}
}
关于elasticsearch - 如何通过字段值限制ElasticSearch结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35514807/