首页 > 解决方案 > 从第一个数组元素访问值 - 过滤

问题描述

在花了一个周末寻找答案后,我决定向你寻求帮助。我有一个产品索引。变体是产品中对象的嵌套列表,我在喂食索引时按库存数量和其他一些条件对它们进行排序。我正在尝试按弹性响应中第一个变量的值对产品进行排序(包括在查询中传递的过滤器)。这是我正在寻找的示例。缩短的弹性响应结构:

{
    "id": 6346,
    "name": "name",
    "variants": [
        {
            "variant_id": 1,
            "stock_quantity": 20,
            "price": 9.9
        },
        {
            "variant_id": 2,
            "stock_quantity": 15,
            "price": 20.9
        },
        {
            "variant_id": 3,
            "stock_quantity": 0,
            "price": 16.9
        }
    ]
}

让我们按价格 gte 15 过滤列表:

{
    "id": 6346,
    "name": "name",
    "variants": [
        {
            "variant_id": 2,
            "stock_quantity": 15,
            "price": 20.9
        },
        {
            "variant_id": 3,
            "stock_quantity": 0,
            "price": 16.9
        }
    ]
}

现在我尝试通过响应中第一个变体的价格对产品进行排序。到目前为止我试图做什么?

按脚本排序

"sort": 
     {
       "_script": {
         "order": "desc",
         "type": "number",
         "script": {
          "source": "return params['_source']['variants'][0].gross_price"
         }
       }
     }

这一直有效,直到我开始过滤列表。在 variant.gross_price gte 15 案例中,脚本从源文档返回值:9.9,而不是我预期的 20.9。我跳过了出于性能原因不推荐参考源的事实。

按字段排序

"sort": 
{
      "variants.gross_price": {
        "nested": {
          "path": "variants",
          "filter": {
            "bool": {
              "filter": [               
                {
                  "range": {
                    "variants.gross_price": {
                      "gt": "15"
}
[...]

我不知道为什么,但是这样我就没有从响应中得到第一个变体的价格,而是产品中最便宜的变体的价格——在这种情况下是 16.9。

我还在变体中添加了标志“include_in_parent”,并尝试通过脚本中的“doc['variants.gross_price'].values”获取值,但效果与第一个相同。

所以..我还能尝试做什么?

我正在寻找来自 6.5 版本的更新Max_children。

标签: elasticsearch

解决方案


你可以试试下面的脚本。

"sort": {
        "_script": {
            "type": "number",
            "script": {
                "inline": "if(doc['variants.gross_price'].value > 15) {max = doc['variants.gross_price'].value;}, abs(max)",
            "order" : asc
            }
       }
   }

推荐阅读