elasticsearch 如何通过字段值限制ElasticSearch结果?
我们有一个系统,使用mapper附件插件在ElasticSearch中索引简历文档。除了索引文档之外,我还存储一些基本信息,比如是否与申请者或员工、他们的姓名以及他们在系统中分配的ID有关。运行的查询在遇到ES时可能会像这样:elasticsearch 如何通过字段值限制ElasticSearch结果?,elasticsearch,filter,aggregate,full-text-indexing,elasticsearch,Filter,Aggregate,Full Text Indexing,我们有一个系统,使用mapper附件插件在ElasticSearch中索引简历文档。除了索引文档之外,我还存储一些基本信息,比如是否与申请者或员工、他们的姓名以及他们在系统中分配的ID有关。运行的查询在遇到ES时可能会像这样: { "size" : 100, "query" : { "query_string" : { "query" : "software AND (developer OR engineer)", "default_field" :
{
"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个唯一记录,然后再进行子聚合以获得“前100个点击”。下面是我的系统中的一个示例。在我的例子中,我是:
获取索引1/type1/\u搜索
{
“大小”:0,
“aggs”:{
“a1”:{
“条款”:{
“字段”:“input.user.name”,
“尺寸”:100
},
“aggs”:{
“热门歌曲”:{
“热门歌曲”:{
“尺寸”:1
}
}
}
}
}
}
使用上面的答案和来自IanGabes的链接,我能够像这样重新构建我的搜索:
{
"size": 0,
"query": {
"query_string": {
"query": "software AND (developer OR engineer)",
"default_field": "fileData"
}
},
"aggregations": {
"employee": {
"terms": {
"field": "employee.id",
"size": 100
},
"aggregations": {
"score": {
"max": {
"script": "scores"
}
}
}
},
"applicant": {
"terms": {
"field": "applicant.id",
"size": 100
},
"aggregations": {
"score": {
"max": {
"script": "scores"
}
}
}
}
}
}
这让我找回了两个bucket,一个包含所有申请人ID和匹配文档中的最高分数,对于员工也是如此。该脚本只不过是碎片上的一个groovy脚本,其中包含“\u score”作为内容。通过使用Elasticsearch的折叠功能,有一种更简单的方法来完成@ckasek希望完成的任务 字段折叠,如中所述: 允许根据字段值折叠搜索结果。折叠是通过每个折叠键仅选择排序靠前的文档来完成的 根据上面的原始查询示例,您可以对其进行如下修改:
{
"size" : 100,
"query" : {
"query_string" : {
"query" : "software AND (developer OR engineer)",
"default_field" : "fileData"
}
},
"collapse": {
"field": "id",
},
"_source" : {
"includes" : [ "applicant.*", "employee.*" ]
}
}
申请人id
是否唯一是?您的问题与此问题的意图类似: