0

与えられた: 利用できない場合の間隔のリストを含むコンサルタントのリスト:

<consultant>
    <id>1</id>
    <not-available>
        <interval><from>2013-01-01</from><to>2013-01-10</to>
        <interval><from>2013-20-01</from><to>2013-01-30</to>
        ...
    </not-available>
</consultant>
...

STARTDATE から ENDDATE までの特定の間隔で少なくとも X 日間 (!) 利用可能なコンサルタントを検索したいと考えています。

例: 2013-01-01 から 2013-02-01 の範囲で少なくとも 5 日間利用可能なすべてのコンサルタントを表示します (これはコンサルタント 1 に一致します。彼は 2013-01-11 から 2013-01-19 まで空いているからです) )。

  • 質問 1: 私の solr ドキュメントはどのように見えるべきですか?
  • 質問 2: クエリはどのようになりますか?
4

1 に答える 1

1

一般的なアドバイスとして、できる限り事前に計算し、入力として取得するデータではなく、クエリ対象のデータを保存してください。

また、異なるエンティティに基づいていくつかのインデックスを使用してください。そうする自由があり、クエリがより単純で簡単になる場合。

わかりました、一般論はさておき、あなたの質問に進みます。


あなたの例から、コンサルタントが利用できない場合、現在インデックスに保存していると思います-おそらく、それが入力として得られるためです。しかし、照会したいのは、それらがいつ利用可能かということです。したがって、非可用性ではなく、可用性を格納することを検討する必要があります。

編集:これを照会する最も前向きな方法は、2 つの多値フィールドで間隔の開始と終了を照会するために特別な SOLR 機能に頼る必要がないように、間隔をエンティティとして使用することです。

利用可能な間隔を保存したら、それらの長さを事前に計算して保存することもできます。

<!-- id of the interval -->
<field name="id" type="int" indexed="true" stored="true" multiValued="false" />
<field name="consultant_id" type="int" indexed="true" stored="true" multiValued="false" />
<!-- make sure that the time is set to 00:00:00 (*/DAY) -->
<field name="interval_start" type="date" indexed="true" stored="true" multiValued="false" />
<!-- make sure that the time is set to 00:00:00 (*/DAY) -->
<field name="interval_end" type="date" indexed="true" stored="true" multiValued="false" />
<field name="interval_length" type="int" indexed="true" stored="true" multiValued="false" />

クエリ:

(1.) 必要に応じて、要求された長さ以上の間隔をすべて取得します。

fq=interval_length:[5 to *]

これはオプションのステップです。クエリのパフォーマンスが向上するかどうかをベンチマークすることができます。さらに、特定のコンサルタント ID でフィルタリングすることもできます。

(2.) 必須のクエリはインターバル用です (dismax ハンドラーの場合は q.alt を使用します):

q=interval_start:[2013-01-01T00:00:00.000Z TO 2013-02-01T00:00:00.000Z-5DAYS]
  interval_end:[2013-01-01T00:00:00.000Z+5DAYS TO 2013-02-01T00:00:00.000Z] 

(読みやすくするために改行を追加しました。クエリの 2 つのコンポーネントは通常のスペースで区切る必要があります)

時刻は常に同じ値に設定してください。/DAYhttp://lucene.apache.org/solr/4_4_0/solr-core/org/apache/solr/util/DateMathParser.html . _ _ 異なる値が少ないほど、キャッシングが向上します。


詳細: http://wiki.apache.org/solr/SolrQuerySyntax - Solr 範囲クエリ http://wiki.apache.org/solr/SolrCaching#filterCachefq -フィルター結果のキャッシュ


編集:

パラメータqに関する詳細情報:fq

http://wiki.apache.org/solr/CommonQueryParameters キャッシングに関しては、異なる方法で処理されます。そのため、最初に他のリンク (上記参照) を追加しました。fqクエリで頻繁に使用することが予想されるフィルターに使用します。fq複数のパラメータを組み合わせることができますqが、リクエストごとに 1 回しか指定できません。

「異なるエンティティに基づいて複数のインデックスを使用する」にはどうすればよいですか?

マルチコア機能をご覧ください: http://wiki.apache.org/solr/CoreAdmin

利用可能な日ごとに保存するのはやり過ぎでしょうか: date;num_of_days_to_end_of_interval - クエリをより簡単にする必要がありますか?

その場合に予想されるデータの量によって少し異なります。また、投稿したクエリに対して本当に役立つかどうかも正確にはわかりません。日付範囲クエリは非常に柔軟で高速です。それらを避ける必要はありません。キャッシュを許可するために、できるだけ広い時間を指定してください。

于 2013-08-23T14:03:31.793 に答える