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

标签 elasticsearch filter aggregate full-text-indexing

我们有一个系统,可以使用映射器附件插件在 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”。这是我的系统中的一个示例。在我的示例中,我是:

  1. 将结果大小设置为 0,因为我只关心聚合
  2. 将聚合大小设置为 100
  3. 对于每个聚合,获取前 1 个结果

获取索引1/类型1/_search { “大小”:0, “阿格斯”:{ “a1”:{ “条款”:{ "field": "输入.用户名", “大小”:100 }, “阿格斯”:{ “热门点击”:{ “热门点击”:{ “尺寸”:1 } } } } } }

关于elasticsearch - 如何通过字段值限制ElasticSearch结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35514807/

相关文章:

elasticsearch - 通过API将文档添加到elasticsearch,然后通过kibana发现它们。怎么样?

amazon-web-services - 将日志发送到AWS ElasticSearch

android - 当我删除字符时过滤器不更新列表

javascript - 在多个条件下过滤 javascript 数组

r - 聚合组表示忽略零,除非 0 是唯一值

elasticsearch - 如何将not_analyzed应用于字段

elasticsearch - 应用程序侧加入Elasticsearch

java - 过滤延迟初始化集合

mysql - 查询MySQL表中某组数据的最新数据

r - R中由带有dplyr的另一列分组的分类值的计数