考虑得分的弹性搜索的聚合

时间:2016-06-16 18:27:05

标签: elasticsearch

我有一个包含以下列的文档:

  • 名为'content'的全文列
  • 员工(一人或多人)
  • ...

我做了这个查询“Michael Seam 度假”,因此elasticsearch返回了数千个结果。

查询结果没问题。首先,我收到了Michael Seam的假期,然后是其他员工的假期结果

在结果中,有数十名员工使用“休假”一词的内容,如:

  • Michael Seam Porter(1次点击)
  • Michael Seam Carl(3次点击)
  • 卢卡斯(30次点击)
  • Maria Fuch(27次点击)
  • Jose White(15次点击)
  • ...

当我为员工专栏添加聚合时,我在Michael Seam Porter和Michael Seam Carl之前收到了Lucas,Maria和其他人,有时他们甚至因聚合大小而出现。

如何(仅在聚合中)显示查询中包含的员工?有可能吗?

P.S。:我正在使用ES 1.7.5

1 个答案:

答案 0 :(得分:0)

我找到了一种方法。

"aggregatePerEmployee" : {
    "terms" : {
        "field" : "employee.raw",
        "order": {
            "top_hit": "desc"
        },
        "size" : 4
    },
    "aggs": {
        "top_hit" : {
            "max": {
                "script": "_score"
            }
        }
    }
}

有了这个,汇总顺序就会考虑每个员工的最高分。

查看结果

"aggregatePerEmployee": {
  "doc_count_error_upper_bound": -1,
  "sum_other_doc_count": 1145,
  "buckets": [
    {
      "key": "Michael Seam Carl",
      "doc_count": 3,
      "top_hit": {
        "value": 2.097010612487793
      }
    },
    {
      "key": "Michael Seam Porter ",
      "doc_count": 1,
      "top_hit": {
        "value": 2.0433993339538574
      }
    },
    {
      "key": "Lucas",
      "doc_count": 30,
      "top_hit": {
        "value": 2.0033993339538574
      }
    },
    {
      "key": "Jose White ",
      "doc_count": 15,
      "top_hit": {
        "value": 1.5995635986328125
      }
    }
  ]
}

P.S。:要启用这个groovy脚本,需要编辑elasticsearch.yml并在其上加上这一行:

script.engine.groovy.inline.aggs: on

之后,重新启动elasticsearch节点