【问题标题】:Sorting Solr multivalue fields based on field values根据字段值对 Solr 多值字段进行排序
【发布时间】:2012-02-29 15:48:39
【问题描述】:

我有多个具有不同架构的 Solr 实例。

我需要按排序顺序接收多值字段,例如按类型:train_station、airport、city_district 等:

q=köln&sort=query({!v="type:(airport OR train_station)"}) desc

我想在 train_station 类型之前查看机场类型文档。现在我总是在顶部获得 train_station 类型。

我应该如何编写查询?

【问题讨论】:

    标签: sorting solr multivalue


    【解决方案1】:

    由于 IDF,您的 train_stations 位于顶部。

    解决此问题的快速方法是使用范围查询(其优点是得分恒定)和查询提升:q=köln&sort=query({!v="type:([airport TO airport]^3 OR [train_station TO train_station]^2)"}) desc

    这样,在其类型字段中具有airport 的文档将获得3 分,在其类型字段中具有train_station 的文档将获得2 分,而在其类型字段中具有airporttrain_station 的文档将获得2 分。在他们的字段类型中,得分为 2+3=5(乘法常数)。

    一种更优雅(有效)的方法是编写自定义查询解析器(甚至是函数查询)。

    【讨论】:

    • 为什么选择范围而不是像“type:(airport^3 OR train_station^2)”这样直接比较?
    • 因为即使有提升,IDF 仍然被考虑在内。根据您的查询,如果 train_station 比 airport 少得多,则包含它的文档的得分将高于包含 airport 的文档。
    【解决方案2】:

    只有在每个文档返回单个值时,您才能对函数进行排序。您绝对不能对多值字段或任何标记化的字段进行排序。如果字段包含“机场”(即使它包含“火车站”)和“火车站”,如果它包含“火车站”但不包含“机场”,似乎你需要一个返回“机场”的函数,然后排序关于那个。

    另一种选择是在索引时处理此问题。添加一个名为“airport_train_station_sort”的字段,如果该字段包含“airport”,则返回 1,如果该字段包含“train station”但不包含机场,则返回 2,如果两者都不包含,则返回 3。然后简单地对该字段进行排序。

    【讨论】:

      【解决方案3】:

      您无法在 SOLR 中解决此问题。检查文档,SOLR 不对多值字段进行排序。旧版本的 SOLR 可让您尝试,但结果未定义且不可预测。

      您要么更改架构并将此排序数据放入单值索引字段,要么需要进行多次查询,首先是机场,然后是市区,然后是火车站。

      【讨论】:

        【解决方案4】:

        要在字段本身中对项目进行排序,您必须按您想要的顺序对其进行索引,或者进行后处理。 Solr 的排序只会对文档进行排序!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-04
          • 2020-04-10
          • 2017-06-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多