如何在Azure搜索中实现min max facet(类似于Elasticsearch中的统计聚合)?

时间:2019-04-30 07:39:44

标签: azure-search

我们的索引包含价格字段,我想动态获取给定搜索词组的所有产品的最低/最高价格。可以通过Elasticsearch中的统计信息聚合来实现此功能,但是如何使用Azure搜索方面来实现此功能?

3 个答案:

答案 0 :(得分:1)

Azure Search确实支持范围方面。 未包括的是响应中的最小值/最大值

您可以对此feedback投赞成票,以促进实现expose functionality equivalent to Elasticsearch aggregations的功能。

答案 1 :(得分:1)

我想出了另一种解决方法。想法是按值对构面进行排序。

以价格为例:

  1. 在创建索引时在索引中定义两个价格字段
    "fields": [
        { "name": "price", "type": "Edm.Double", "facetable": true }
        { "name": "price_copy", "type": "Edm.Double", "facetable": true}
    ]
    
  2. 上传文档时,在price和price_copy字段中输入相同的值
  "value": [  
    {  
      "@search.action": "upload",  
      "price": 19.99,
      "price_copy": 19.99
    }]
  1. 发送构面请求
    facet=price,sort:value,count:1&facet=price_copy,sort:-value,count:1

响应将是这样的:

"@search.facets": {
    "price": [
        {
            "count": 45,
            "value": 0
        }
    ],
    "price_copy": [
        {
            "count": 20,
            "value": 2899.99
        }
    ]
}

然后,我们可以分别从price和price_copy方面获取价格的最小/最大值。我认为这种解决方案更好,因为与Liam建议的存储范围解决方案相比,它可以获得更准确的最小/最大值。

有什么想法吗?

答案 2 :(得分:0)

完全同意Joel是正确的答案,但是另一种选择是对价格进行分面并获得所有潜在价格,然后在客户端采用最小和最大。显然,这与Joel的选择不一样,如果您有很多不同的价格,这可能是不现实的。在那种情况下,我认为您可以对价格范围进行分类(例如,计数0至10美元,10-20美元等),以找到最大和最小价格范围,以减少会出现的构面数量回来。