2013-01-21 17 views
0

的目標是通過然後得分距離來執行multisort,並限制到我執行以下查詢的0.14度的半徑:Solr的4個空間查詢過濾器仍返回文件超出範圍

localhost:8983/solr/coll1/select?sortsq={! score=distance}locations:"Intersects(Circle(34.0031792,-118.3082034 d=0.14))"&fl=score,distdeg:query($sortsq),*&facet=true&sort=score desc,query($sortsq) asc&indent=on&wt=xml&version=2.2&rows=10&start=0&q=text:*&facet.field=xxxxx&fq=fieldname:"filterValue" 

所有文件匹配查詢返回,不管它是否在圓內,但在0.14度內返回的距離(distdeg),其他的沒有返回該域。

如何省略不相交的文檔?

位置字段聲明:

<fieldType name="geo_field" class="solr.SpatialRecursivePrefixTreeFieldType" 
       spatialContextFactory="com.spatial4j.core.context.jts.JtsSpatialContextFactory" 
       distErrPct="0.025" 
       maxDistErr="0.000009" 
       units="degrees" 
/> 

更新: 查詢

http://localhost:8983/solr/coll1/select?getDist={! score=distance}locations:"Intersects(Circle(34.0031792,-118.3082034 d=0.14))"&fl=score,distdeg:query($getDist),*&facet=true&sort=score desc&indent=on&wt=xml&version=2.2&rows=10&start=0&q=*:*&boost=query({! score=distdeg filter=false v=$getDist)&fq=locations:"Intersects(Circle(34.0031792,-118.3082034 d=0.14))",states:"CA" 

回答

4

的工作版本,你是不是真正的空間濾波的。 solr搜索匹配基於'q'(來自用戶的查詢字符串;它得分)和'fq'(過濾器查詢,它們沒有得分)的文檔,沒有別的。你的'q'和'fq'都不是指你放入sortsq參數的空間過濾器。查看文檔:http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4#Search

您的q =文本:*很奇怪;你打算怎麼樣?所有文檔?該查詢可能似乎有效,但不這樣做,因爲它沒有按照您的想法行事;它會查找所有在該字段中具有任何價值的文檔(不是快速計算),這不是所有文檔都必需的。最佳做法是defType = edismax和q.alt = *:*和qf = text(假設這是您的文本搜索字段),如果您沒有要提供的查詢字符串,它將匹配所有文檔。

順便說一句,跟隨其他任何分數排序沒有任何意義。有很多浮點值,因此距離很少會被查詢。您可能想要按距離提高分數。下面是一個例子:& boost = query({!score = recipDistance filter = false v = $ spatialfilter})(用具有spatialFilter空間搜索的參數的名稱替換)。

+0

非常感謝您的回答,提高距離更有意義,但我真的很想理解語法,是否有任何有關boost語法和計算距離函數的文檔。我使用工作查詢語法更新了問題,儘管如此,仍然沒有使用dismax。如果有任何改進,我可以讓請告訴我,非常感謝您的時間和努力 –

+0

您更新的查詢正確使用'boost'參數,但是您沒有指定defType = edismax(edismax查找boost參數,沒有其他的)。我注意到一個尾隨「,在你的'fq'上寫着:」CA「,這是錯誤的,因爲逗號不應該在那裏,也許你的意思是'OR'?我在Solr的wiki上發佈了Solr 4空間頁面的鏈接。我應該添加一個描述提升的例子。您可能需要閱讀我的書或查看dismax/edismax上的其他信息(例如wiki)。 –

+0

你是對的,我已經ommited了,替換爲AND並且啓用了dismax查詢解析器,但是在這裏出現了混淆,在文檔中寫道,qf參數定義了要返回的特定字段,與fl參數相同,但是有能力提高查詢時間,我試過使用qf參數,但它不適用於degdist:query($ getDist)。我不確定哪個使用fl或qf,或者同時使用fl和qf來提升某些字段?還有你指定的提升參數,它可以處理多個提升?我應該使用它還是使用qf來提升字段? –