【问题标题】:Elastic Search, Nest. functional sorting弹性搜索,巢。功能排序
【发布时间】:2015-11-13 00:36:52
【问题描述】:

我正在构建一个带有构面等的过滤器页面,它应该可以正常工作。 现在我们的客户有一个请求,基本上是“能够决定哪些分类项目出来”。 每个产品都装饰有产品展示订单,并且位于产品线中。

我们得到了这些示例产品展示订单: 1. 特色项目 2.核心项目 3. 备件 4. 实用性

还有这些产品线: 1. 锤子 2. 锯 3. 木材

排序是这样的: 排序应该首先基于产品展示订单,其次是产品线,第三是字母顺序。 因此,所有属于Featured Item的产品都会首先列出,然后所有这些Featured Items都会按照它们的product line排序,如果某些产品在同一个Featured Item中并且产品线,然后按字母顺序排列。

挑战是:我不能只将产品展示订单项目和产品线的排序作为产品上的数字,我只有一个名称/ID。

我们曾根据产品是否属于不同的类别来考虑提升,但这似乎有点混乱。

看看是否有可能在排序中有一些逻辑。 按 productDisplayOrder 排序: 1.特色,2.核心项目... 然后按 ProductLines: 1. 锤子,2. 锯... 然后按名称 DESC。

哪种方式是进行这种排序的最佳方式,是否可以将此逻辑赋予弹性,如果它是匹配的,然后对其进行排序。还是我们需要扭曲产品的提升?

希望这对您有意义。 提前致谢! :)

【问题讨论】:

    标签: nest elasticsearch


    【解决方案1】:

    选项 1)。最快/最佳执行的解决方案是为productDisplayOrderProductLine 创建新的/单独的整数字段,然后按照描述在排序标准中使用这些字段(在重新索引和验证数据按预期索引之​​后)。

    选项 2) 如果您想要比描述的更多细微差别(例如,更高的得分匹配可以“突破”描述的排序上限),那么您可以探索使用 Function Score Query 来实施采用 productDisplayOrder 和 @ 的自定义评分策略987654327@ 在生成总体匹配分数时考虑在内。

    选项 3)。如果您无法更改映射和重新索引数据,您可以使用Script-Based Sorting 使用脚本(例如Groovy)从当前索引的productDisplayOrder/ProductLine 文本生成排序值。请记住,查询性能将比前两个选项差。

    【讨论】:

    • 谢谢@Peter。我知道最优化的选项是第一个,但我们不知道该字段在搜索时是否包含正确的值,因为如果可以更改 ProductDisplayOrder 的排序,那么我们的产品将被重新索引。使用函数分数查询,我可以100%确定控制分数吗?
    • 听起来您需要您的客户端生成一个动态脚本以在查询中使用。 (最后两个选项之一。)
    • 非常感谢彼得。我们将尝试使用选项 1,并在编辑排序节点时重新索引。然后我们可能需要重新索引所有产品,但排序不应该经常改变。因此,与其对客户更慢,不如让编辑慢一点。
    • 还有第四个选项,它可以使在“排序节点”处更改顺序变得非常便宜,但它会带来内存溢价和分片策略的限制。您将使用“排序节点”作为父级(将产品作为子级)对数据父级/子级进行建模。然后,您可以使用function_score 查询将您的排序建模为基于父项和子项中的值的评分脚本。选项 1 可能仍然是更好的方法,但请阅读此处了解更多信息:stackoverflow.com/questions/21289149/…
    猜你喜欢
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2017-02-09
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多