基于函数结果的Solr刻面
我正在尝试基于动态值执行面处理。基本上,我想要与基于函数结果的Solr刻面,solr,Solr,我正在尝试基于动态值执行面处理。基本上,我想要与def函数相同的行为,但这似乎不适用于faceting 以这两种“产品”为例: 我想补充的是,overridePrice只是一个例子。实际字段是一个动态值,它取决于在什么上下文中执行搜索,并且可能有许多被覆盖的价格,因此我不能在索引时仅导出price 作为回应,我正在为fl做类似的事情: fl=price:def(覆盖价格,默认价格)并使用相同的def功能对price执行排序。这个很好用 现在我想把同样的逻辑应用到方面。我尝试过使用json.fac
def
函数相同的行为,但这似乎不适用于faceting
以这两种“产品”为例:
我想补充的是,overridePrice
只是一个例子。实际字段是一个动态值,它取决于在什么上下文中执行搜索,并且可能有许多被覆盖的价格,因此我不能在索引时仅导出price
作为回应,我正在为fl
做类似的事情:
fl=price:def(覆盖价格,默认价格)
并使用相同的def
功能对price
执行排序。这个很好用
现在我想把同样的逻辑应用到方面。我尝试过使用json.facet
,它似乎可以工作:
json.facet={
price: "def(overridePrice, defaultPrice)"
}
我也尝试过其他变体,例如使用field:def(overridePrice,defaultPrice)
以及field:price
,但是def
似乎不是用于刻面的可用函数,并且在刻面时,price
派生字段不可用
所以问题是:如何根据默认字段执行面处理,就像我为
fl
和排序所做的那样?这是否需要一个自定义聚合函数,或者是否有一种不需要自定义函数就可以实现的聪明方法?如果能够使用内置的Solr功能来实现这一点,那就更好了。我能够基于提示来实现一个黑客解决方案
根据字段是否存在,我们可以在查询中使用两个方面来过滤文档
例如:
{
price_override: {
type: query,
q: "overridePrice:[* TO *]",
facet: {
price_override:{
type:terms,
field: overridePrice
}
}
},
price_standard: {
type: query,
q: "-overridePrice:[* TO *] AND defaultPrice:[* TO *]",
facet: {
price_standard: {
type: terms,
field: defaultPrice
}
}
}
}
说明:
price_override: {
type: query,
q: "overridePrice:[* TO *]"
此范围查询仅选择具有overridePrice
字段的文档
price_standard: {
type: query,
q: "-overridePrice:[* TO *] AND defaultPrice:[* TO *]"
-overridePrice:[*TO*]
忽略带有overridePrice
字段的文档,并选择带有defaultPrice
字段的文档
以及层面反应:
"facets":{
"count":2,
"price_override":{
"count":1,
"price_override":{
"buckets":[{
"val":14.99,
"count":1}]}},
"price_standard":{
"count":1,
"price_standard":{
"buckets":[{
"val":49.99,
"count":1}]}}}
这确实需要手动将
price\u override
和price\u standard
分组为单个方面组,但结果与预期一致。这也可以很容易地调整为一个范围查询,这是我的用例。想补充一点,有一种更好的方法可以做到这一点,那就是使用分隔的有效负载字段。这允许在单个字段中存储多个值,是解决此类问题的一个非常好的方法。
"facets":{
"count":2,
"price_override":{
"count":1,
"price_override":{
"buckets":[{
"val":14.99,
"count":1}]}},
"price_standard":{
"count":1,
"price_standard":{
"buckets":[{
"val":49.99,
"count":1}]}}}