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

在resultset中获取elasticsearch嵌套对象的值

司徒锐进
2023-03-14

我试图建立一个方面的导航使用elasticsearch为一个电子商务网站。

商店产品可以有多个变体。我想到的文档结构如下所示:

PUT /products_test/product/1
{
  "id": "1",
  "manufacturer": "foobar",
  "categories": [
                  "28554568",
                  "28554577",
                  "28554578"
  ],
  "variants": [
    {
      "id": "1_a",
      "color": "blue",
      "size": "L"
      "price": "67.99"
    },
    {
      "id": "1_b",
      "color": "red",
      "size": "L"
      "price": "69.99"
    }
  ]
}

我将变体定义为嵌套类型。这样,以下查询将返回包含匹配筛选器的变体的所有文档:

POST /products_test/product/_search
{
  "query": {
    "filtered": {
       "query": {"match_all": {}},
       "filter": {
          "and": [
            {"term": {"categories": "28554568"}},
            {"terms": {
              "variants.color": [
                "red"
              ]
            }}
          ]
       }
    }
  }
}

现在,我真的希望获得与过滤器匹配的变体的id,以便在类别页面上显示该产品的变体。因此,在本例中,我希望返回第二个变量(1_b)的id。我只获取ResultSet中返回的文档的id。有什么方法可以从嵌套对象中定义一个值吗?

共有1个答案

燕琛
2023-03-14

当前无法获取与查询匹配的嵌套文档。这是一个已知的问题,人们已经开始努力/思考来解决它。问题的当前状态是,Elasticsearch的获取阶段需要重构以支持该特性。

这很重要,而且将会发生,因为重构也将使elasticsearch的其他部分受益,但这是一个主要的重构。目前还没有预计时间。

我会考虑对您的数据进行非规范化处理,以便每个变体都包含“根对象”数据,然后在客户机内部进行分组。

或者,您可以调查父/子映射,但也适用类似的限制(无法确定哪个子匹配has_child查询),但它确实提供了更多的灵活性,因为子是可以搜索的独立文档

 类似资料:
  • 问题内容: 我有一个包含嵌套对象的文档,如下所示: 现在,我需要按书名(不是book_title)和年份(比如2014)来过滤书籍。我需要的输出将是: 当我使用嵌套过滤器时,即使它们不匹配,我也会得到所有嵌套对象。如何仅获取匹配的嵌套对象? 问题答案: 您需要使用以下嵌套功能。 在输出中,您将确切地获得期望的结果,即字段和嵌套数组中的匹配书。

  • 让我们想象一下Elasticsearch索引,其中每个文档代表一个国家。Country具有城市字段,该字段定义为嵌套的。 示例映射(为了本示例的简洁性而简化): 我插入到索引中的文档如下所示: 是否可以组成一个返回所有城市(所有国家)并支持排序的查询 第一个返回页面(回复)将包含捷克共和国的10个城市,第二个页面将包含10个城市,其中四个(最后一个)来自捷克共和国,六个来自斯洛伐克。 我正在研究复

  • 问题内容: 我有两个结构: 它代表我的自定义PostgreSQL对象类型(我自己创建): 下一个结构是DB中的表: 我的自定义对象嵌套在Client类型中,名为。我尝试通过以下方式读取数据: 但不幸的是,我无法读取字段(具有默认值)。我不想使用google_account创建单独的表,也不希望将此结构作为客户端表中的单独字段或将其打包为json(创建单独的实体,因为该结构不仅在此表中使用,而且我正

  • 我有一个索引,它有嵌套的字段。我想在响应中只包括特定的嵌套对象,基于条件以及其他字段。例如,考虑映射 我想按名称搜索用户,并希望响应只包括嵌套对象包含country='U.S.“。请考虑用户索引中的以下文档 我期待搜索结果如下 请为我提供一个合适的elasticsearch查询以获取此文档

  • 问题内容: 是否可以使elasticsearch中的所有嵌套对象自动映射为默认嵌套的类型。而不是对象? 问题答案: 是的,您可以在创建索引时使用以下动态模板来做到这一点:

  • 问题内容: 甲提供方法返回原语。是否有可能获得允许的物体?我正在检索的数据库字段可以为空,并且只要该字段为,就会返回我。 谢谢 问题答案: 只需检查该字段是否在使用。 或者,如果你能保证你使用正确的数据库列类型,以便真正返回(因而没有,或),那么你也可以强制转换它。 更新:对于Java 1.7+