反向Solr范围查询

时间:2014-04-23 17:19:28

标签: solr subquery edismax

我正在使用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为med, 1为低。理想情况下,我希望将其包含在常规权重中,但我无法将其添加为子查询。另外,如果我尝试增加它,我会回来"无限递归检测到解析查询' pr_high_max:[8 TO *]'"

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

此外,我可以控制正在进行的数据,因此如果能够使分辨率更容易,我可以轻松按摩它以不同的方式表示范围。

提前致谢

1 个答案:

答案 0 :(得分: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))