2012-06-03 61 views
2

我想用Solr做距離範圍搜索。Solr距離濾波

我知道它很容易做搜索的5公里範圍內篩選 &q=*:*&fq={!geofilt pt=45.15,-93.85 sfield=store d=5}

我是後是如何做同樣的事情,如果我期待在一系列的說5 10公里 ??

謝謝

回答

9

這裏有幾種方法來解決這個問題。很顯然,查詢進入過濾器查詢(「fq」參數),因爲其意圖不是修改分數。讓我們假設的這些參數在請求URL設置(雖然他們有沒有被放在那裏):

pt=45.15,-93.85&sfield=store 

這裏有一個辦法:

_query_:"{!geofilt d=10}" -_query_:"{!geofilt d=5}" 

我用_QUERY_ Solr的語法進入一個子查詢,它提供了將查詢解析器從Lucene切換到地理切換器的機會。

這裏的另一個辦法,可能是最快的:

{!frange l=5 u=10}geodist() 

這一個是一個函數查詢返回的距離,然後將其限制在所需範圍。它可能會更快,因爲它會評估每個文檔一次,而不是像以前的意願一樣。

您可能希望將其標記爲not cacheable並添加一個bbox過濾器,以便檢查每個文檔的數量少得多。 這裏是最終結果(未URL轉義):

pt=45.15,-93.85&sfield=store&fq={!frange l=5 u=10 cache=false cost=100}geodist()&fq={!bbox d=10} 
+0

Solr中4,用RPT字段類型使用的「geofilt」技術應該是更快,如果有在搜索結果中的一個「大」數。此外,如果您的空間域是多值的,那麼您將不得不使用geofilt,並且還需要創建一個自定義聚合Spatial4j形狀,其中包含一個外部圓,同時排除一個內部圓。即使您沒有多值數據,這也會使geofilt方法更快。有時在不久的將來,可以指定一個甜甜圈形狀,而無需編寫自己的。 –