【问题标题】:Solr faceting based on function result基于函数结果的 Solr faceting
【发布时间】:2020-02-26 00:50:03
【问题描述】:

我正在尝试基于动态值执行分面。基本上我想要与def 函数相同的行为,但这似乎不适用于分面。

考虑这两种“产品”:

{
  "id":"product1",
  "defaultPrice":19.99,
  "overridePrice":14.99
},
{
  "id":"product2",
  "defaultPrice":49.99
}

我想补充一点,overridePrice 只是一个例子。实际字段是一个动态值,取决于执行搜索的上下文,并且可能有许多被覆盖的价格,所以我不能只在索引时派生price

对于回复,我正在为fl 做这样的事情:

fl=price:def(overridePrice, defaultPrice) 并使用相同的def 函数对price 执行排序。这很好用。

所以现在我想将相同的逻辑应用于构面。我尝试过使用json.facet,它似乎可以工作:

json.facet={
  price: "def(overridePrice, defaultPrice)"
}

我也尝试过其他变体,例如使用field:def(overridePrice, defaultPrice)field:price,但def 似乎不是用于分面的可用函数,而price 派生字段不是刻面时可用。

所以问题是:如何像我为fl 所做的那样基于默认字段执行分面和排序?这是否需要自定义聚合函数,或者有没有一种聪明的方法可以在没有自定义函数的情况下做到这一点?如果能够使用内置的 Solr 功能来做到这一点,那就更可取了。

【问题讨论】:

    标签: solr


    【解决方案1】:

    我能够根据another question. 中的提示做一个 hacky 解决方案

    我们可以在查询中使用两个方面来根据字段是否存在来过滤文档。

    例子:

    {
      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_overrideprice_standard 分组到一个构面组中,但结果符合预期。这也可以很容易地调整为范围查询,这是我的用例。

    【讨论】:

    • 想补充一点,有一种更好的方法可以做到这一点,那就是使用分隔的有效负载字段。这些允许在单个字段中存储许多值,并且是此类问题的一个非常好的解决方案。 lucidworks.com/post/solr-payloads
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-23
    • 2012-02-18
    • 2016-04-03
    相关资源
    最近更新 更多