Elasticsearch通过分页按价格对InnerHits进行排序

时间:2017-09-06 12:44:29

标签: sorting elasticsearch nested kibana nest

我的弹性搜索索引中有几千个文档。 Document有一些嵌套集合。其中之一是“变体”的嵌套集合。 JSON结构的文件之一是:

{
  "id" : 1,
  "name": "lollipop",
  "model_name": "candy",
  "variants": [
    {
      "id": 1000,
      "taste": "orange",
      "gross_price": 13,
      "stock_quantity": 15
    },
    {
      "id": 1001,
      "taste": "apple",
      "gross_price": 7,
      "stock_quantity": 1
    },
    {
      "id": 1002,
      "taste": "bannana",
      "gross_price": 9,
      "stock_quantity": 13
    },
    ,
    {
      "id": 1003,
      "taste": "pinaple",
      "gross_price": 19,
      "stock_quantity": 10
    },

    ... and more and more ...       

  ],
  ... and more and more ...
}

我的商店在一页上只显示了48个产品。 我的索引总共有4800种产品,因此我的商店有100页。

我遇到按价格排序的问题。

在任何页面上,我想获得48个具有最低变种价格的产品,其中stock_quantity大于1.对于最轻的结果 - 我使用的是变体的inner_hits。然后我只有那些符合我条件的变种。

我写了一些elasticsearch查询(第一页):

GET myshop_index/product/_search
{
  "from": 0,
  "size": 48,
  "sort": [
    {
      "variants.gross_price": {
        "mode": "min", 
        "order": "asc",
        "nested_path": "variants"
      }
    }
  ], 
  "_source": {
    "excludes": [
      "variants"
    ]
  },
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "query": {
              "bool": {
                "must": [
                  {
                    "range": {
                      "variants.stock_quantity": {
                        "gt": 1
                      }
                    }
                  }
                ]
              }
            },
            "path": "variants",
            "inner_hits": {
              "name": "variants",
              "size": 10000
            }
          }
        }
      ]
    }
    }
  }
}

我的前48种产品都带有他们的变种,但这种分类并没有在我的索引中使用完整的产品变体。这种排序的工作方式如下:

  1. 首先获得48种带有变体的产品
  2. 排序变种价格asc
  3. 返回结果
  4. 但我需要得到这种情况:

    1. 按照gross_price ascending
    2. 对我的索引中的所有产品变体进行排序
    3. 返回前48个产品及其变体(使用inner_hits)按gross_price升序排序。
    4. 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

好的,我解决了我的问题。我找到了Nested Sorting。这对我有用。特别是第5点。 “sort子句中的nested_filter与主查询子句中的嵌套查询相同。接下来解释原因。”并在此之后解释