首页 > 解决方案 > 根据子类型属性对弹性搜索类型进行排序

问题描述

我正在开发电子商务搜索页面,需要自由文本搜索产品并具有多个方面选项和排序功能。我面临的问题与产品价格有关:一种产品有多种价格——有特别折扣、B2B 客户特定价格和特定 B2C 价格。每个产品可能有几百个价格。

我需要能够对产品进行全文搜索,但仍然能够对选定的价格组之一进行排序。

我最初的想法是将所有价格放入产品项目中,但这意味着每次价格变化时我都需要更新索引中的产品对象——这经常发生。这也会使对象变得很大。

我看到 elasticsearch 现在具有 HasParent/HasChildren 查询的功能,但我不确定这是否是正确的方法,或者是否有可能。是否可以将价格作为产品类型之外的单独类型并使用 HasParent/HasChilden 查询对价格进行排序?

标签: elasticsearchnest

解决方案


我最初的想法是将所有价格放入产品项目中,但这意味着每次价格变化时我都需要更新索引中的产品对象——这经常发生。这也会使对象变得很大。

我个人倾向于不在 Elasticsearch 中存储复杂的定价数据,至少不是由业务逻辑计算的价格,例如折扣和特定的 B2C 价格。

可以存储基本价格以供查询和排序,并通过脚本分别使用脚本查询脚本排序将定价逻辑应用于此。

我看到 elasticsearch 现在具有 HasParent/HasChildren 查询的功能,但我不确定这是否是正确的方法,或者是否有可能。是否可以将价格作为产品类型之外的单独类型并使用 HasParent/HasChilden 查询对价格进行排序?

父/子关系对单个索引内的文档进行操作,文档上的连接数据类型字段指示父子之间的关系,子文档与父文档在同一分片上索引。如果子级在父级/分片之间分布不均匀,例如,一个父级文档有 100 万个子级,而其他每个只有几个子级,则最终可能会在分片中出现热点,从而影响性能。产品和定价数据不适合父母/孩子;定价听起来太动态了,无法存储在文档中。


推荐阅读