我正在使用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 *]'"
有没有人遇到过这样的事情?有任何想法吗?
此外,我可以控制正在进行的数据,因此如果能够使分辨率更容易,我可以轻松按摩它以不同的方式表示范围。
提前致谢
答案 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))