elasticsearch 如何通过字段值限制ElasticSearch结果?,elasticsearch,filter,aggregate,full-text-indexing,elasticsearch,Filter,Aggregate,Full Text Indexing" /> elasticsearch 如何通过字段值限制ElasticSearch结果?,elasticsearch,filter,aggregate,full-text-indexing,elasticsearch,Filter,Aggregate,Full Text Indexing" />

elasticsearch 如何通过字段值限制ElasticSearch结果?

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" :

我们有一个系统,使用mapper附件插件在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个唯一记录,然后再进行子聚合以获得“前100个点击”。下面是我的系统中的一个示例。在我的例子中,我是:

  • 将结果大小设置为0,因为我只关心聚合
  • 将聚合的大小设置为100
  • 对于每个聚合,获得前1个结果
  • 
    获取索引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
    是否唯一是?您的问题与此问题的意图类似: