当前位置: 首页 > 知识库问答 >
问题:

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

卫宁
2023-03-14

我已经在按\u score desc排序的查询部分中获得了所需的查询结果。现在我需要提取每个文档的3个字段。我想实现如下目标:

select distinct field1, field2, field3 from table A;

我刚刚试过:

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

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

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

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

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

2) 使用聚合:

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

它返回[field 1, field 2, field 3]的distict值,但文档的顺序发生了变化。它们是按doc_count排序的,但不是_score,我们无法在结果中获得_score的信息。

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

谢啦!

共有1个答案

祁正浩
2023-03-14
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将根据asc词典的顺序进行排序,而\u score将按描述的顺序进行排序

例如,下面是按其显示方式排序的样本数据

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
POST someindex/_search
{  
   "size":0,
   "aggs":{  
      "myagg":{  
         "terms":{  
            "script":{  
               "source":"doc['field1'].value + params.param + doc['field2'].value + params.param + doc['field3'].value",
               "lang":"painless",
               "params":{  
                  "param":", "
               }
            },
            "order":{  
               "_term":"asc"
            }
         }
      }
   }
}

如果有帮助,请告诉我。

 类似资料:
  • 问题内容: 我想在字段上使用stats或extended_stats聚合,但是找不到完成此操作的任何示例(即,似乎只能将聚合与实际文档字段一起使用)。 是否有可能计算出“元数据”在ElasticSearch查询响应每个命中字段请求集合(例如,,,,等等)? 我假设答案是“否”,因为未对类似字段进行索引… 问题答案: 注意:就最新版本的Elasticsearch而言,原始答案现在已过时。使用Groo

  • 在这里,我得到了错误: “无效的术语聚合顺序路径[price>price>price.max]。术语桶只能在子聚合器路径上排序,该路径由路径中的零个或多个单桶聚合和路径末尾的最终单桶或度量聚合组成。子路径[price]指向非单桶聚合” 如果我按持续时间聚合排序,查询可以正常工作,如 那么,有什么方法可以通过嵌套字段上的嵌套聚合来排序聚合吗?

  • 我如何对键上的elasticsearch聚合桶进行排序。我有嵌套的聚合,想对我的第二个聚合桶结果进行排序。 就像我有: 我希望我的< code >事件聚集桶在关键< code >印象或< code >页面视图上按desc/asc排序。我如何实现这样的结果集? 这是我的查询 我试过使用_key,但它在桶内排序。我想通过查看所有桶来排序。就像我有一个键。我希望我的桶结果用这个键排序。不在桶内。 我希望

  • 问题内容: 我在Redis商店中使用type。我为每个用户创建一个自己的 KEY 并将数据放在此处: KEY 示例 : 我想从Redis中为用户键选择数据:1、2、3,并按得分(时间戳)进行排序。 如果只是简单地看问题,我需要跨时从任何KEY中选择一个数据,然后将按分数排序的所有结果组合在一起。 问题答案: 有两种方法可以执行此操作,但是正确的方法取决于您要执行的操作。例如: 您可以在代码中为每个

  • 问题内容: 我使用ES v 1.7。ES仅在“命中”部分返回_score,但是我对“命中”不感兴趣,我需要 使用_score 从响应的“聚合”部分中 获取数据 。为什么ES会喜欢这样,以及如何解决? Requset: 响应: 问题答案: 由于您正在使用排序,因此您需要为要计算的分数显式设置“ track_scores ”。 例:

  • 我想要实现的是通过唯一对(城市、州)进行聚合。根据Elasticsearch文档,术语聚合不支持从同一文档中的多个字段收集术语。因此,我创建了一个嵌套的agg,如下所示: 作为这种聚合的结果,我得到了这样的响应: 问题是如何获得按最深doc\u计数排序的结果? 预期的有序列表应如下所示: 内华达州拉斯维加斯(5840) 杰克逊维尔,佛罗里达州(2986) 北卡罗来纳州杰克逊维尔(1962) 亚利桑