2015-10-08 6 views
6

文書の一部にはd1、その他のものにはd2の索引が付いた文書があります。どちらの文書でもどちらもソートする必要があります。ソルでソートの日付フィールドを結合する

sort=d1 desc, d2 desc 

はこのように、d2とドキュメントのseperatly d1で文書をソートします:私たちが望む何

d1: 2014-03-12 
d1: 2010-03-12 
d2: 2013-03-12 
d2: 2011-03-12 

すべてがこのようにソートされます:

持つすべての文書をインデックスの再作成
d1: 2014-03-12 
d2: 2013-03-12 
d2: 2011-03-12 
d1: 2010-03-12 

残念ながら新しい共通フィールドはオプションではありません。

答えて

1

私が知っている限り、あなたはsolrのFunction Queriesを使うことができます。 ((ABS(MS(D1、D2))> 0)、D1、D2)DESC

私はまだそれをテストしたが、ここでされていない場合は、この種のために、それは=その

一種のようなものですあなたの問題を整理する役に立つリンク。

https://wiki.apache.org/solr/FunctionQuery
Sort result by date difference

0

を、それがthis discussionでinvoquedたので、あなたのような何かを試みることによってConcatFieldUpdateProcessorFactoryを使用してデータを更新することができます。

その後
<processor class="com.test.solr.update.CustomConcatFieldUpdateprocessorFactory"> 
    <str name="field">d1</str> 
    <str name="field">d2</str> 
    <str name="dest">date</str> 
    <str name="delimiter"></str> 
</processor> 

を、あなたは、並べ替えしようとすることができますあなたのフィールド日付で。

1

アブドルがfunctionを使用するアプローチが正しいアプローチです。 しかし、アブドルの解決策は私のためには機能しません。

これを正常にテストしました。

ちょうどあなたのクエリにこのパラメータを追加します。

sort=max(d1,d2) desc 
0

二つの提案を、の一つは、既に提案されている:

(1)copyFieldを使用してください。

<field name="d" type="date" indexed="true" stored="true" multiValued="false"/>  
<copyField source="d1" dest="d" /> 
<copyField source="d2" dest="d" /> 

d1d2フィールドが重要である場合でも、あなたはまだあなたのクエリに含めるが、ちょうどソートマージdフィールドにすることができます。

(2)データソースの種類によっては、data-config.xmlファイルのクエリを変更して、これら2つのフィールドを1つにまとめることができます。私たちの環境では、Solrを使用してMySQLインスタンスからデータを索引付けしています。異なるデータベースからのデータがSolrに統合されていることが何度もあります。これにより、異なるデータベースからのデータを正規化する必要がある同様の問題が発生します。このような状況では、クエリではCASEまたはIFNULLのような構文を使用することがよくあります。これがあなたの状況に当てはまる場合、私はより具体的な内容に入ることができます。

0

私はあなたと非常に似た問題がありました。私の場合、すべてのドキュメントには「d1」と「d2」のフィールドがあり、すべてに「d1」の値があります。 「d2」の値は、「d1」の値を上書きするために使用されます。このため

私のソリューションは、次のとおりです。

sort=map(ms(d2),0,0,ms(d1)) desc 

それが空でない場合map(ms(d2),0,0,ms(d1))は「D2」のタイムスタンプを返します。そうであれば、代わりに「d1」タイムスタンプが使用されます

誰かを助けることを願っています。

関連する問題