【问题标题】:Elasticsearch: How to get all parent fields along with child docs?Elasticsearch:如何获取所有父字段以及子文档?
【发布时间】:2017-06-20 16:03:47
【问题描述】:

在索引中,我有两个文档示例:产品和 Sku。在产品文档中,我索引了所有与产品相关的属性,例如产品名称、产品品牌,在 sku 文档中,我们索引了所有 sku 属性,例如价格、库存。

我们会将许多 sku 映射到一个产品,但反之亦然。所以我们在 Product 和 sku 之间创建了父子关系。我们将 Product 设置为 Parent,并将 Sku 作为子映射到 Product。问题是当我们查询产品或 sku 时,我们只获得与产品相关的属性(名称和品牌)或仅与 sku 相关的属性(价格和库存)。

但在我们的例子中,当我们查询时,我们还需要获取所有与产品和 sku 相关的属性(名称、品牌、价格和库存)。当我们查询子文件时如何获取父文档的所有属性(或)当我们查询产品时如何获取所有子 sku 及其属性。

在 Elasticsearch 中是否可行。请帮忙。谢谢。 我正在使用 Elasticsearch 2.3.1 版。

【问题讨论】:

  • 您是否已经看过“hasParent”和“hasChild”查询?这里是“hasParent”的文档,但“hasChild”非常类似:elastic.co/guide/en/elasticsearch/reference/2.3/…
  • @khituras 是的,已经尝试过了,它只是使用基于子级的过滤父级,反之亦然,它没有返回所有属性
  • 哦,是的,就像 chocomuesli 已经提到的那样,innerHits 会给你。

标签: elasticsearch


【解决方案1】:

在我之前的项目中,我们遇到了同样的问题,有父项(目录项)和子项(配置的产品 - 用颜色指定的项...等)。正如 khituras 所提到的,您可以应用 hasParent- 和 hasChild-queries,尽管它们不会返回带有孩子的父母的组合结果集......(link)。

也许你应该试试InnerHits-queries,这似乎是promising

您的数据集是否经常更改,因此您受益于父子关系,因为父文档或子文档确实经常更改?否则,您可以考虑将父文档嵌入到每个子文档中。 Elasticsearch 带有基于文档的数据模型,因此您必须注意使用父子关系时可能存在的缺陷。在我的项目中,我们应用了嵌入式方法,因为我们未能针对子文档的父信息应用聚合。

干杯,多米尼克

【讨论】:

  • 是的,我的孩子文档会经常更改(每 15 分钟一次),但我的父母不会。除了嵌入式之外,还有其他方法可以实现这一目标吗?使用父子关系有什么缺点? -谢谢
  • 举几个缺点: * 你不能在子文档上使用聚合来对抗父数据link * 子文档和父文档总是存储在同一个分片上。这可能会扰乱 Elasticsearch 评分机制 link * 较慢的搜索性能,虽然更好的索引时间 link 如前所述,您可以尝试 innerHits-queries :)
猜你喜欢
  • 2019-09-18
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
  • 2023-03-08
  • 2014-11-12
  • 1970-01-01
相关资源
最近更新 更多