Elasticsearch:获取记录的排序索引

时间:2018-06-18 07:33:16

标签: elasticsearch elasticsearch-5

让我用真实的例子来描述我的场景。 我有一个页面,我需要显示按字段排序的公司列表" overallRank"并使用少量过滤器(如companyType和employeeSize)。 现在,很容易从过滤器的ES索引中获取结果,然后按overallRank对它们进行排序。但是,我还想知道所有公司数据中公司的排名,而不仅仅是过滤结果。 例如。亚马逊是美国地区的第三家公司,companyType = Private。但是,如果我们删除companyType过滤器,它是美国第五家公司。在显示过滤器companyType的结果时,我想知道这个整体排名(即第5个)。是否有可能以某种方式在结果中包含此字段?

我目前正在做的是首先通过companyType和位置US获取过滤结果。然后只按位置获取排序结果。第二个查询通过位置的整体排名(亚马逊排在第5位)给出结果。现在我迭代第一个结果,看看该公司在第二个结果中的位置,以确定它的整体排名。 这种方法的问题在于,确定整个公司数据中的总体排名的第二种方法非常昂贵,因为它必须检索大约60k的结果。通过给出批量大小1000,它必须对ES进行大约60次往返,以便将所有结果记录在内存中。它耗费时间和空间。

有人可以建议一个更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我认为您可以使用filtered aggregations: top hits aggregation来解决问题

例如,您可以执行以下操作:

{
  "aggs": {
    "filtered_companies_by_us": {
      "filter": {
        "term": {
          "location": "US"
        }
      },
      "aggs": {
        "top_companies": {
          "top_hits": {
            "sort": [
              {
                "overallRank": {
                  "order": "desc"
                }
              }
            ],
            "size": 5
          }
        }
      }
    }
  }
}