Elasticsearch 6.2.4:如何通过_score排序聚合结果?

时间:2018-10-29 09:27:28

标签: elasticsearch

我在所需的查询结果中按_score desc排序了。现在,我需要提取每个文档的3个字段。我想实现像这样:

select distinct field1, field2, field3 from table A;

我刚刚尝试过:

1)使用折叠以删除重复的值

GET index/_search
{
  "collapse" : {
        "field" : "filed1.keyword" 
    }
  ...
}

但是问题是它只会保留filed1的不同值,而忽略field2和fiel3的值。例如,我们有2条记录,例如:

[1, "a", "b"], [1, "c", "d"] 

使用此方法,我们只能获得一条记录,因为它们具有与field1相同的值。我想要这三个字段的不同组合值。我们可以使用inner_hits来获取第二个字段的distict值,但根据https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-collapse.html:第二级别的折叠不允许使用inner_hits。这意味着它不能应用于从多个字段(> 2)中获取不同的值。

2)使用聚合:

GET index/_search
{
  "aggs": {
    "field1": {
      "terms": {
        "field": "field1.keyword"
      },
      "aggs": {
        "field2": {
          "terms": {
            "field": field2.keyword",
            "missing": ""
          },
          "aggs": {
            "field3": {
              "terms": {
                "field": "field3.keyword",
                "missing": ""
              }
            }
          }
        }
      }
    }
  },
  ...
}

它返回[field1,field2,field3]的离散值,但是文档的顺序已更改。它们是按 doc_count 排序的,而不是_score排序的,因此我们无法在结果中获取_score的信息。

那么,如何在不更改当前顺序的情况下获得不同的组合值(因为我们已在“查询”部分中自定义了文档顺序)?或者我们如何通过_score排序聚合结果?

谢谢!

1 个答案:

答案 0 :(得分:0)

下面是示例查询,介绍如何将ValueError: operands could not be broadcast together with shapes (273,) (273,29) (273,) 用于aggregations

_score

因此,您上面的聚合查询将采用以下形式:

POST <your_index_name>/_search
{
  "query": {
    "match": {
      "<yourfield>": "<yourquery>"
    }
  },
  "aggs": {
    "myaggs": {
      "terms": {
        "script": "_score"
      }
    }
  }
}

因此,基本上,以上查询将以POST <your_index_name>/_search { "size":0, "query":{ "match":{ "field1": "search non-search" } }, "aggs":{ "myaggs":{ "terms":{ "field":"field1.keyword", "order": { "_term": "asc" } }, "aggs":{ "myotheraggs":{ "terms":{ "field":"field2.keyword", "order": { "_term": "asc" } }, "aggs":{ "myotheraggs2":{ "terms":{ "field":"field3.keyword", "order": { "_term": "asc" } }, "aggs":{ "myscoreaggs":{ "terms":{ "script":"_score", "order": { "_term": "desc" } } } } } } } } } } } 的顺序返回给您,其中field1 field2 field3 score将基于field1 field2 field3的顺序进行排序,而_score会以asc lexicographical的顺序进行排序订购

例如以下是样本排序数据的样子

desc

更新的问答帖聊天

field1|field2|field3|score
--------------------------------
non-search|lucene|graphdb|1
search|lucene|elasticsearch|2
search|lucene|elasticsearch|1
search|lucene|solr|2
search|lucene|solr|1

让我知道是否有帮助。