2012-04-19 12 views
3

のフィールドを多値:私は
<doc>
<arr name="StartDate">
<date>2012-08-18T17:00:00Z</date>
<date>2012-06-28T17:00:00Z</date>
<date>2013-02-28T17:00:00Z</date>
<date>2012-04-16T17:00:00Z</date>
<date>2012-08-06T17:00:00Z</date>
<date>2012-05-18T17:00:00Z</date>
<date>2012-07-04T17:00:00Z</date>
</arr>
<arr name="EndDate">
<date>2012-09-29T17:00:00Z</date>
<date>2012-06-29T17:00:00Z</date>
<date>2013-04-16T17:00:00Z</date>
<date>2012-05-07T17:00:00Z</date>
<date>2012-08-15T17:00:00Z</date>
<date>2012-06-22T17:00:00Z</date>
<date>2012-08-01T17:00:00Z</date>
</arr>
</doc>
クエリは、私はこのような文書いるSolrの

を日付範囲を持ち、範囲をカバー開始日と終了日のペアを見つけたいです。たとえば、startDateとEndDateの最初のペア(2012-08-18 TO 2012-09-29)は、入力範囲(x、y)が2012-08-18 < xと2012-09-29 >の場合にtrueを返します。終了日:[2012-09-29T00:00 [:00:00.000Z 2012-08-18T00 TO 59.999Z:1995-12-31T23:59]
開始日:

私はこのようなクエリを書きました:00.000Z TO 2099-01-01T00:00:00.000Z]
しかし、問題はSOLR検索です。上記の14項目のセットのすべての一致日は、1つ1つ(1と1,2 2と...)。

どうすればいいのか教えてください。どうもありがとう。

答えて

2

私は同様のモデルを持っていますが、私の知る限り、Solrでこれを行う方法はありません。

Solrには意味「フラット」のインデックスを、持っているあなたの基本エンティティは次のように見える場合:

dates: [ 
    (start1, end1), 
    (start2, end2), 
    (start3, end3) 
] 
それがフラット化されます

start_date: [ start1, start2, start3 ] 
end_date: [ end1, end2, end3 ] 

との間には接続は存在しないので、それぞれstartendのペアであるため、範囲クエリを実行する方法はありません。これがSolrで直接動作するには、おそらくこの接続を維持するカスタムSolrフィールド型を実装する必要があります。

別の解決策は、日付フィールドとプライマリエンティティのidを別々に持つことです。これの欠点は、プライマリエンティティの他のフィールドで日付検索とフィルタリングを組み合わせることができないことです。

+0

あなたの最初の解決策です。私はSolrの '関数'クエリの使用について考えています。 2つの配列を繰り返し処理できる限り、それを行う方法を見つけることができます。ちょうど私の考え。私はSolrにとってとても新しいです。ありがとう、他の答えを待っている。 – dtnam

+0

多値フィールドの順序が保証されているかどうかは疑問です。私はこれをチェックするソースを読んでいませんが、代わりに '[start2、start1、start3]'で終わる可能性は確かです。 – beerbajay

+0

私が見ることができる他の方法は、あなたが検索できる1つの値に(start1、end1)を非正規化することです。しかし、これは容易ではない/全く可能ではないかもしれません – Fuxi

関連する問題