2016-10-13 7 views
-1

inv = 0(0〜1000の可能な値)を持つすべての文書を結果セットの最後まで降格させたいと思います。私は名前のような他の並べ替えのオプションを持っているクエリの一部としてまたdesc。例えばSolrは条件がすべての文書を降格します

は、以下の私が一番下までINV = 0ですべての文書を押し、次に「名前ASC」並べ替えを適用したい、ここに...

Doc1 : name=apple , Inv=2 
Doc2 : name=ball , Inv=1 
Doc3 : name=cat , Inv=0 
Doc4 : name=dog , Inv=0 
Doc5 : name=fish , Inv=4 
Doc6 : name=Goat , Inv=5 

私は、ソートの下に達成したい私のSolrの文書です。 "(と-inv:" 0 ")^ 999.0" & DEFTYPE: "edismax" ここ

Doc1 
Doc2 
Doc5 
Doc6 
Doc3 
Doc4 

私のSolrリクエストは

BQのようなものです結果を降格させるために私が与えた順位です。

この追加クエリは正常に機能します。 inv = 0のすべての文書を一番下に移動します。

しかし、私が& sort = name ascをsolrクエリに追加すると、bq..iよりも "sort"の方が優先され、 "name asc"という結果が表示されます。

Doc1 : name=apple , Inv=2 
Doc2 : name=ball , Inv=1 
Doc3 : name=cat , Inv=0 
Doc4 : name=dog , Inv=0 
Doc5 : name=fish , Inv=4 
Doc6 : name=Goat , Inv=5 

誰でも私を助けてください。 ?

答えて

0

簡単な解決策:最初にinvでソートし、次に他の値を並べ替えることができます。これには、invにtrue(1)またはfalse(0)の値しかないことが必要です。私は、それはそうではありません推測:

あなたは、関数のクエリで並べ替えることができます - あなたは値が設定されているか否かに基づいて異なる値を返す機能ifを使用することができます。

sort=if(inv, 1, 0) desc, name desc 

Solrがinvを単独で解決できない場合は、field(inv)を使用できますが、必要はありません。

sort=min(1, inv) 
+0

ありがとう:

別のオプションは、それがインベントリにかいないのかどうかに応じて、ソートフィールドのための1または0のいずれかを取得する機能minを使用することです。しかし、私はinv(在庫は0から1000までの値を持つことができます)でソートしたくありません。私はちょうど名前で並べ替えるが、最後に0の値を持つすべてのレコードを持っている。ここで使用可能なマップ関数です。どうすれば使用できますか – user3085317

+0

"最後に0の値を持つすべてのレコードを持つ"デフォルトのソートです。図示のように 'if'関数のクエリ(または最小バージョン)を使うことで、ソートのための唯一の値は0または1になります。次の並べ替えフィールドは、その並べ替えの方向を再度指定します。期待通りの結果が得られない場合は、例を挙げてください。マップを使用する必要はありませんが、可能であれば、ドキュメントを最後に取得するために値をソートする必要があります。 – MatsLindh

+0

こんにちは、私は試し&ソート=分(1、フィールド(インベントリ))のdesc、name_ntk descそれは動作しませんでした。 – user3085317

関連する問題