当前位置: 首页 > 知识库问答 >
问题:

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

孟品
2023-03-14

我的elasticsearch索引中有几千个文档。文档有几个嵌套集合。其中之一是“变体”的嵌套集合。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页。

我对按价格排序有一个问题。

我编写了一些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. 返回结果

但我需要得到这个场景:

  1. 按gross_price升序对我的索引中的所有产品变体进行排序
  2. 返回前48个产品及其变体(使用inner_hits),按gross_price升序排序。

有什么想法吗?

共有1个答案

蓝星辰
2023-03-14

好的,我解决了我的问题。我找到了嵌套排序。对我来说是工作。尤其是第五点。“sort子句中的nested_filter与main query子句中的嵌套查询相同。下面解释原因。”然后解释

 类似资料:
  • 问题内容: 这是场景: 想象一下,注册用户使用创建了一个新实体,而其他注册用户创建了一个新实体,依此类推… 我想要做的是根据记录价格对记录进行排序,具体取决于前端用户选择的货币(欧元或美元)。 我无法编制索引,例如或,因为费率每小时都会变化,但是如果可能的话,更新10000条记录价格的最佳方法是什么? 1-以下是我的建议,它可行,但是我认为这可能是更好的方法,有什么建议吗? 2-如果没有,哪种性能

  • 我的目标是通过拖放对tableview进行排序。我举了一个例子:http://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm 对于拖放,我通过Scene Builder添加了fxml 制造了控制器 但是在drag Drop,我无法得到我扔下物体的那排位置。我得到的只是手机信息<代码>文本[Text=“

  • 你可以使用内置的 yield* 操作符来组合多个 Sagas,使得它们保持顺序。 这让你可以一种简单的程序风格来排列你的 宏观任务(macro-tasks)。 function* playLevelOne(getState) { ... } function* playLevelTwo(getState) { ... } function* playLevelThree(getState) { .

  • 我创建了这两个实体来证明我的问题: 业主ntity.java: 子实体。java: 我想写一个查询,显示来自OwnerEntity和一个连接的ChildEntity的信息。我创建了一个投影: 所有者权益项目。java: 我的JPA假设: 现在,当我运行这个简单的测试时: 我收到以下错误: 我还检查了日志中生成的JQPL: 如您所见,Spring Data Jpa从from子句中附加了第一个实体别名

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