0

ターゲットは、スコア、次に距離でマルチソートを実行し、半径0.14度に制限するために次のクエリを実行します。

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

1 に答える 1

4

実際には、空間的にフィルタリングしているわけではありません。solr検索は、「q」(ユーザーからのクエリ文字列。スコアリング)と「fq」(スコアリングしないフィルタークエリ)に基づいてドキュメントを照合します。'q'も'fq'も、sortsqパラメーターに入力した空間フィルターを参照していません。ドキュメントを参照してください:http ://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4#Search

あなたのq=text:*は奇妙です。何をするつもりですか?すべてのドキュメント?そのクエリは機能しているように見えるかもしれませんが、あなたが思っていることをしていないので、そうしないでください。そのフィールドに値がある(計算が速くない)すべてのドキュメントを検索しますが、これはすべてのドキュメントである必要はありません。ベストプラクティスは、defType=edismaxおよびq.alt=*:*およびqf = text(これがテキスト検索フィールドであると想定)です。これは、提供するクエリ文字列がない場合にすべてのドキュメントに一致します。

ちなみに、スコアの並べ替えを他の方法で追跡することは意味がありません。浮動小数点値にはさまざまな種類があるため、距離が参照されることはめったにありません。代わりに、距離によってスコアを上げることをお勧めします。その例を次に示します。&boost = query({!score = recipDistance filter = false v = $ Spatialfilter})(spatialFilterを空間検索するパラメーターの名前に置き換えます)。

于 2013-01-21T19:18:47.447 に答える