基于函数结果的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}]}}}