よしだのブログ

サブタイトルはありません。

Solrでよく勘違いしそうな仕様3点+1

検索エンジン Apache Solr を使ったプロジェクトがそろそろ終了しそうなんですが、勘違い?というか理解不足で若干痛いて戻りをしてしまったのでメモ。間違いなどありましたらご指摘いただけると幸いです。。

 グルーピングとソート

グルーピング時の sort パラメータは、group.sort の第一位の値でソートされるわけではない。処理の流れとしては、全体のソート(sort) → (ここからSolr) → group → group.sort という流れ。なので、sort の結果1位になったレコードにグループの順位が固まる。group.sort はあくまで見た目だけの整形処理グループ"内"でのインデックスのソートであり、グループ"間"のソートではない。FASTとは違う。

group vs partition by 

SQL → Solr の場合、特に注意しないといけないのは select 文中の partition by。グループ中のレコードの中から任意のレコードの値を代表値として選択できる。表示だけなら Solr も全部とってこれば可だが、ソートや検索条件に使用するのは不可。

timezone はUTC固定

日付のタイムゾーン問題。Solrは日付をUTCでしか扱うことができない。(文字列表現の後ろの Z はUTCを示す。)このため、日本のサーバー上のアプリで日付の値を取得するとSolrに格納された値が、UTCなので、JST に変換した時間が取得される(+9時間 http://ja.wikipedia.org/wiki/ISO_8601)。このため、Solrに投入する際に、UTCとして、-9 して入れるなどの対応が必要になる。

trunc できない

Solrの日付検索では、「時分秒を無視して、今日の日付」というような検索が得意でない。以下のようなクエリが必要。クエリの方はパース計算されるが、値の方はされないので、範囲検索になる。。
field:[ 2000-01-01T00:00:00Z/DAY TO 2000-01-01T00:00:00Z/DAY+1DAY-1SECONDS ]
http://lucene.apache.org/solr/4_4_0/solr-core/org/apache/solr/util/DateMathParser.html

 追加するかも。