我正在用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表示低。理想情况下,我希望将其包含在常规权重中,但我无法将其添加为子查询。此外,如果我试图改进它,我会返回"Infinite Recursion检测到解析查询'pr_high_max:[8 to*]'"
以前有人遇到过这样的事情吗?有什么想法吗?
此外,我可以控制正在进行的数据,所以我可以很容易地对其进行按摩,以不同的方式表示范围,如果这会使分辨率更容易的话。
提前感谢
好吧,花了一段时间,但我想明白了,我必须为每个查询添加一个空的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))