2016-11-08 13 views
0

inv = 0(0〜1000の可能な値)を持つすべてのドキュメントを結果セットの最後に降格したいとします。私は名前のような他の並べ替えのオプションを持っているクエリの一部としてまたdesc。例えばsolr boost sort with separate sort

は、以下の私が一番下まで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の文書です。

Doc1 
Doc2 
Doc5 
Doc6 
Doc3 
Doc4 

私のSolrリクエストは

BQのようなものです: "(:AND -inv:" 0 ")^ 999.0" & DEFTYPE: "edismax" ここ

999されます私が結果を降格させたランク。

この追加クエリは正常に機能します。 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

Solrのデフォルトのソート基準はscore descです。ここで、scoreは仮想フィールドであり、実際にはドキュメントのスコアを表します。
&sort=name ascを渡すと、デフォルトのソートが上書きされます。

ここで解決策が考えられるのは、&sort=score desc, name ascです。文字通りの意味:最初にscoreでソートし、同等のスコアを持つ書類については、nameで昇順にしてください。

doc1、doc2、doc5、doc6のスコアが同じであれば動作します。

そうでない場合は、inv:0でドキュメントをペナルティする方法の詳細についてはSolr Wiki linkをご覧ください。

1

昇順が昇順をオーバーライドします。

したがって、条件マップをブースト値にすることで、ソートをブーストに移動することができます。

または、昇順条件をquery()の構文を使用してソートに移動します。これは、the Lucene/Solr Revolution 2016 presentation by hossの宝石の1つでした(クリックプレゼンテーション開始):

 qq = Harry 
     q = +{!edismax v=$qq} 
     qf = title actor writer director keywords 
     sort = query($title_sort,0) desc, title asc 
title_sort = {!field f=title v=$qq}