Elasticsearch中的复杂查询

罗哈纳加瓦尔

我有一个包含折扣价格的文档结构。折扣仅在满足该折扣的所有条件时适用。
我尽力找出一个解决下面提到的用例的查询,但是我想我最终将不得不使用脚本功能。有没有一种方法可以构造以下用例的查询而无需编写脚本?

{
  "name": "Brown Teddy With Hat",
  "prices": {
    "basePrice": {
      "price": 3000, // actual price
      "discounts": [
        { "price": -10, "conditions": ["value1"] },
        { "price": -20, "conditions": ["value5", "value7"] }, // two conditions 
        { "price": -30, "conditions": ["value6"] },
        { "price": -40, "conditions": [] } // no conditions
      ]
    },
    "installmentPrice": {...} // ignore for now
  }
}

我想对满足条件的所有折扣进行汇总。将有一个包含一些条件值的输入数组,例如[value5,value6,value1]。折扣条件应该是输入数组的子集。
在上面的示例中:将应用折扣-10,-30和-40。我想从实际价格(3000)中减去折扣,然后对折扣价格进行排序。

我尝试了terms_set查询,但是这种方法适用于简单的情况,例如带有数组字段的文档,并且将输入与该数组匹配,但是对于我而言,折扣是多次嵌套的,因此terms_set无法正常工作。

Elasticsearch版本-6.6.1
无效的参考:
https : //discuss.elastic.co/t/subsets/46488
https://discuss.elastic.co/t/match-all-terms-in-document-阵列/ 24793

罗哈纳加瓦尔

终于,我花了一些时间才能够使用terms_set。
我还在折扣中添加了一个必填字段。
对我来说,requiredMatch字段的值等于条件数组的长度。我们还可以避免添加此字段,并使用脚本来访问conditions数组的长度。
条件数组为空的情况不起作用。我将通过始终向条件数组和输入数组添加“默认”值来破解它。因此,空条件将始终符合预期。

这是解决我的用例的查询:

{
  "aggs": {
    "sorted_by_price": {
      "aggs": {
        "nested_discounts_aggs": {
          "nested": {
            "path": "prices.basePrice.discounts"
          },
          "aggs": {
            "conditions_set_match": {
              "filter": {
                "terms_set": {
                  "prices.basePrice.discounts.conditions": {
                    "terms": [
                      "facebook",
                      "agreement12",
                      "bestxl",
                      "useless",
                      "magenta"
                    ],
                    "minimum_should_match_field": "prices.basePrice.discounts.requiredMatch"
                  }
                }
              },
              "aggs": {
                "finalPrice": {
                  "sum": {
                    "field": "prices.basePrice.discounts.price"
                  }
                }
              }
            }
          }
        }
      },
      "terms": {
        "field": "_id",
        "order": {
          "nested_discounts_aggs>conditions_set_match>finalPrice": "desc"
        },
        "size": 5
      }
    }
  }
}

新文档如下所示:

{
  "name": "Brown Teddy With Hat",
  "prices": {
    "basePrice": {
      "discounts": [
        { "price": 3000, "conditions": ["default"], "requiredMatch": 1 }, // actual price
        { "price": -10, "conditions": ["value1"], "requiredMatch": 1 },
        { "price": -20, "conditions": ["value5", "value7"], "requiredMatch": 2 }, // two conditions 
        { "price": -30, "conditions": ["value6"], "requiredMatch": 1 },
        { "price": -40, "conditions": ["default"], "requiredMatch": 1 } // no conditions
      ]
    },
    "installmentPrice": {...} // ignore for now
  }
}

剩下的唯一部分就是增加折扣价格。我将通过删除价格字段并将实际价格作为具有正值的折扣来实现。请注意,折扣为负值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章