2012-02-29 145 views
0

我有多个独立模式的Solr实例。基于字段值对Solr多值字段进行排序

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

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

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

我该如何编写查询?

回答

6

由于IDF,您得到顶部的train_station s。

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

这种方式,这在他们的类型字段有airport文件将有3分,这在他们的类型字段有train_station文件将有一个分数的具有airporttrain_station在自己的领域类型将有2个文件得分2 + 3 = 5(乘法常数)。

这样做的更优雅(而且有效)的方法是编写自定义查询分析器(甚至函数查询)。

+1

这是一个聪明的快速入侵。 – 2012-03-02 05:22:02

+0

为什么选择范围而不是像“type :(机场^ 3或train_station^2)”那样直接比较? – rounak 2013-08-28 17:17:40

+1

因为即使有提升,IDF仍被考虑在内。有了您的查询,如果train_station比机场更为罕见,那么包含它的文件将比包含机场的文件高。 – jpountz 2013-08-29 23:26:26

0

要在该领域内订购物品,您必须根据需要对其进行索引或进行后期处理。 Solr的排序只会对文档进行排序!

1

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

另一种选择是在索引时处理这个问题。添加一个名为“airport_train_station_sort”的字段,如果该字段包含“机场”,则返回1;如果该字段包含“火车站”但不包含机场,则返回2;如果该字段不包含,则返回3。然后只需在该领域排序。

1

SOLR内部无法解决此问题。检查文档,SOLR不排序多值字段。老版本的SOLR让你试试,但结果是不确定和不可预测的。

您可以更改您的模式并将此排序数据放入单值索引字段中,或者您需要先进行多次查询,首先是机场,然后是城市地区,然后是火车站。