【问题标题】:Complex sort expression in ravendb or elastic searchravendb 或弹性搜索中的复杂排序表达式
【发布时间】:2015-05-04 03:03:22
【问题描述】:

我正在尝试开发一个高级排序表达式,但不知道如何做到这一点。查询可以在弹性搜索或 ravendb(或 lucene 表达式)中完成。首选是使用 ravendb,即我打算拥有所有数据,但如果无法在 ravendb 上执行此操作,则弹性搜索将是一种替代方法。 主要思想是在某些字段值上有“分数”,所以我们可以传递这个分数值并有自定义类型的结果。

产品列表如下所示(概念):

{
name: 'product 1',
brand: 1,
filters: [1, 2, 7, 10]
},{
name: 'product 2',
brand: 2,
filters: [1, 3, 7, 15]
},{
name: 'product 3',
brand: 2,
filters: [1, 2, 8, 10]
},{
name: 'product 4',
brand: 3,
filters: [2, 8, 10]
}

我想通过查询品牌和过滤器的分数,像这样:

品牌 1:得分 10

品牌 2:得分 15

过滤器 1:得分 10

过滤器 3:得分 5

过滤器 10:得分 8

这样,我将得到以下排序的产品列表:

产品 3:15(品牌 2)+ 10(过滤器 1)+ 8(过滤器 10)= 33

产品 2:15(品牌 2)+ 10(过滤器 1)+ 5(过滤器 3)= 30

产品 1:10(品牌 1)+10(过滤器 1)+8(过滤器 10)=28

产品 4:8(过滤器 10)= 8

这个查询需要是动态的,所以我可以像这样发送下一个查询:

品牌 1:得分 10

品牌 2:得分 15

品牌 3:16

过滤器 1:得分 5

过滤器 3:得分 5

过滤器 10:得分 1

而且排序后的结果会发生变化:

产品 2:15(品牌 2)+ 5(过滤器 1)+ 5(过滤器 3)= 25

产品 3:15(品牌 2)+ 5(过滤器 1)+ 1(过滤器 10)= 21

产品 4:16(品牌 3)+1(过滤器 10)=17

产品 1:10(品牌 1)+ 5(过滤器 1)+ 1(过滤器 10)= 16

有任何ravendb、lucene或elastic search的查询,我都可以得到这个排序的结果,不需要循环它们(因为会同时有很多查询)?

谢谢!

【问题讨论】:

    标签: database sorting lucene ravendb


    【解决方案1】:

    我知道您没有将 Solr 包含在您的问题中作为可能性,但是由于与 Lucene/ElasticSearch 如此接近,我会将它扔在那里以防您考虑它。

    这可以通过Function Queries 在 Solr 中完成。使用sumiftermfreq 应该足以构建您想要的表达式(我相信还有其他组合可以实现它)。

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 2013-02-14
      • 2018-01-17
      • 1970-01-01
      相关资源
      最近更新 更多