1

我正在使用 SOLR 进行一些数据分析,但我被困在一个可能为我提供一些巨大价值的部分。

我有一个 solr 集合,其中包含许多范围的数字字段,例如:

pr_high_max = 10.35
pr_high_min = 8.15

pr_med_max = 12.55
pr_med_min = 10.40

每个最小/最大组合提供一个价格范围,高/中部分是由当前组中的项目数量按该范围得出的,我不打算讨论一些时髦的数学。

我需要用商品价格查询 solr 并取回一个价格在某个范围内的文档,我需要能够为其分配权重,以便高字段优先于 med 字段。这本质上是一个反向 RANGE 搜索。

我正在查询其他字段,所以这应该包含在权重中,这也不能在 fq 中,因为如果项目不符合这个条件,那么它可能会匹配其他字段。

到目前为止,我能够组装这个函数查询:

 prboost:sum(
 if(and(query({!edismax v='pr_high_max:[8 TO *]' }),query({!edismax v='pr_high_min:[* TO 8]'})),5,0),
 if(and(query({!edismax v='pr_med_max:[8 TO *]' }),query({!edismax v='pr_med_min:[* TO 8]'})),3,0),
 if(and(query({!edismax v='pr_low_max:[8 TO *]' }),query({!edismax v='pr_low_min:[* TO 8]'})),1,0),
 )

其中 8 是我将传递的价格,基本上这是检查价格是否在任何范围内,如果是,我将返回一个值,5 表示高,3 表示中,1 表示低. 理想情况下,我想将其包含在常规权重中,但我无法将其添加为子查询。此外,如果我尝试增强它,我会返回“无限递归检测到解析查询'pr_high_max:[8 TO *]'”

有没有人遇到过这样的事情?有任何想法吗?

此外,我可以控制正在进行的数据,因此如果这会使解析更容易,我可以轻松地对其进行按摩以以不同的方式表示范围。

提前致谢

4

1 回答 1

1

好吧,花了一段时间,但我明白了,我必须为每个查询添加一个空的 boost 参数,这就是有效的。我总结了所有的值,从 1 开始(因为没有它,任何额外的提升都会导致值小于 1 并且实际上会惩罚文档)。每个子查询都会运行,根据匹配的子查询,提升将增加 1%、5%、10% 或 15%。

sum(1, if(and(query({!edismax boost='' v='pr_shigh_max:[$doc->{pr} TO *]' }),query({!edismax boost=''       v='pr_shigh_min:[* TO $doc->{pr}]'})),0.15,0), 
if(and(query({!edismax boost='' v='pr_high_max:[$doc->{pr} TO *]' }),query({!edismax boost='' v='pr_high_min:[* TO $doc->{pr}]'})),0.1,0), 
if(and(query({!edismax boost='' v='pr_med_max:[$doc->{pr} TO *]' }),query({!edismax boost='' v='pr_med_min:[* TO $doc->{pr}]'})),0.05,0), 
if(and(query({!edismax boost='' v='pr_low_max:[$doc->{pr} TO *]' }),query({!edismax boost='' v='pr_low_min:[* TO $doc->{pr}]'})),0.01,0))
于 2014-05-05T15:23:10.153 回答