当前位置: 首页 > 面试题库 >

Elasticsearch聚合:如何对存储桶顺序进行排序

咸玄天
2023-03-14
问题内容

ES版本:1.5(Amazon Elasticsearch)

我的目标:在某个字段上具有重复数据删除功能的搜索结果。我目前正在对聚合进行一些研究,以解决重复数据删除问题。因此,我的结果是一个带有1个大小的存储桶的列表存储桶。但是,我找不到订购存储桶列表的方法。

当前查询:

curl -XGET "http://localhost:9200/myidx/product/_search?search_type=count" -d '{
   "size": 2, 
   "query": {
      "function_score": {
         "field_value_factor": {
           "field": "relevance",
           "factor": 2.0
         },
         "query":  { "term": { "title": "abcd" } },
         "score_mode": "multiply",
         "boost_mode": "multiply"
      }
   },
   "aggs": {
      "unique": {
         "terms": {
           "field": "groupid",
           "size": 2
         },
         "aggs": {
           "sample": {
             "top_hits": {
               "size": 1
             }
           }
         }
      }
   }
}'

结果:

{ ...
"aggregations": {
    "unique": {
      "doc_count_error_upper_bound": 1,
      "sum_other_doc_count": 39,
      "buckets": [
        {
          "key": 717878424,
          "doc_count": 14,
          "sample": {
            "hits": {
              "total": 14,
              "max_score": 45.856163,
              "hits": [
                {
                  "_index": "myidx",
                  "_type": "product",
                  "_id": "89531",
                  "_score": 45.856163,
                  "_source": { ... }
                }
              ]
            }
          }
        },
        {
          "key": 717878423,
          "doc_count": 8,
          "sample": {
            "hits": {
              "total": 8,
              "max_score": 68.78424,
              "hits": [
                {
                  "_index": "myidx",
                  "_type": "product",
                  "_id": "89517",
                  "_score": 68.78424,
                  "_source": { ... }
                }
              ]
            }
          }
        }
      ]
    }
  }
}

我想看到第二个存储桶,其中max_score = 68.78424为第一个。这可能吗?

如果不建议使用聚合,请告知。


问题答案:

是的,您可以通过在最大文档分数上添加另一个子聚合并按unique terms该分数对聚合进行排序来实现。

curl -XGET "http://localhost:9200/myidx/product/_search?search_type=count" -d '{
   "size": 2, 
   "query": {
      "function_score": {
         "field_value_factor": {
           "field": "relevance",
           "factor": 2.0
         },
         "query":  { "term": { "title": "abcd" } },
         "score_mode": "multiply",
         "boost_mode": "multiply"
      }
   },
   "aggs": {
      "unique": {
         "terms": {
           "field": "groupid",
           "size": 2,
           "order": {
              "max_score": "desc"
           }
         },
         "aggs": {
           "max_score": {
             "max": {
               "script": "doc.score"
             }
           },
           "sample": {
             "top_hits": {
               "size": 1
             }
           }
         }
      }
   }
}'


 类似资料:
  • 在elasticsearch中,是否有方法使用自定义分数对聚合桶进行排序/排序? 我正在按客户姓名进行扣球。每个客户都有多个订单,其中有一个交货日期字段(DeliveDate)。我想根据与当前日期的距离(接近程度)对桶进行排序。 例如,对交货日期更接近今天日期的客户名进行排序。 非常感谢。

  • 数据 我在ES索引中保留了对象。其中每个字段都有一个myKey和myName字符串字段(持久化为关键字字段)。不能保证同一个myKey的myName总是相同的。E、 g.以下两个条目共享相同的myKey,但具有不同的myName值: 挑战 我需要选择并返回所有不同的myKey值,查找并显示最可能的myName(myKey上下文中出现的最多),并按myName对生成的Bucket进行排序。 到目前为

  • 我想根据top hits聚合中第一个元素所拥有的属性,从terms聚合中订购Bucket。 我的尽力而为查询如下(有语法错误): 有人知道如何做到这一点吗? 例子: 按“a”分组,按“id”(desc)排序存储桶,并按“b”(desc)排序最热门的内容,将给出:

  • 我有一个索引,,我需要将其聚合到每年的桶中,然后进行排序。 我已经成功地使用Bucket Sort按简单的和值(

  • 我正在尝试对弹性搜索聚合的结果桶进行排序。我有一大套文件: 我目前正在做的是使用top_hits聚合获取每个的最新销售: 现在,我想按任意字段对生成的bucket进行排序。如果我想按排序,我可以使用这个问题的解决方案,添加一个aggregation,它从每个bucket中提取 字段,最后添加一个 的字母顺序排序,我不能使用< code>max聚合,因为它只对数值字段有效。 如何按文本字段对存储桶(

  • 此处为elasticsearch新用户,但存在术语聚合问题。我为187份文档编制了索引,其中包含“名称”、“主机”、“风险”等字段。字段风险有4个唯一值(“关键”、“高”、“中”、“低”、“信息”),我正在运行这样的术语聚合: 我希望得到一个结果,说明我有x个临界值,x个高值等等。问题是,我没有得到返回的桶。 我的Elasticsearch版本是7.12.0有什么想法吗 > 编辑:这是映射: 以下