2012-02-29 149 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讓你試試,但結果是不確定和不可預測的。

您可以更改您的模式並將此排序數據放入單值索引字段中,或者您需要先進行多次查詢,首先是機場,然後是城市地區,然後是火車站。