Kouhei Sutou
kou****@clear*****
2015年 8月 13日 (木) 23:47:44 JST
須藤です。 In <CA+Tq-RpHssEDa55t-Li-9=-j53T****@mail*****> "[groonga-dev,03411] 日付データと、highlight_htmlのことについて押してください。" on Thu, 13 Aug 2015 23:01:53 +0900, Hiroyuki Sato <hiroy****@gmail*****> wrote: > 日付データと、highlight_htmlのことについて押してください。 > > > | isbn | title | 発売日 | > |--------------|-------------------|----------| > | 49-1234-7890 | Haskell入門 | 2015/1/1 | > | 49-1234-7891 | Groonga入門 | 2015/2/1 | > | 49-1234-7892 | できるErlang | 2015/3/1 | > | 49-1234-7893 | Go言語入門 | 2015/4/1 | > | 49-1234-7894 | 三日でできるScala | 2015/5/1 | > 確認事項 > 1, 発売日でソートする場合 > ・インデックスは必須でしょうか? 必須ではありません。 > ・インデックスをつけることで、ソートが速くなりますか? 速くなります。 ただし、速くなるのは--sortbyのキーがpublished_dateだけで、条 件が指定されていない(--queryも--filterも指定されていない) ときだけです。 --sortbyのキーが複数だったり、条件が指定されているとインデッ クスがあってもなくても速度は変わりません。 > 2, 発売日で絞り込みをする場合(queryに日付を指定する場合) > ・インデックスは必須でしょうか? 必須ではありません。 > ・インデックスをつけることで、ソートが速くなりますか? ソートは速くなりませんが、検索は速くなります。 ソートのときのような制限はありません。 > 3, 発売日と、titleでインデックスを作る場合 > > ・どちらもOKでしょうか? > ・同じテーブルの異なるカラムでインデックスを作る > column_create --table Terms --name published_idx --flags > COLUMN_INDEX --type Book --source published_date これは動きません。 インデクスをどのテーブルに作るかを考えるときは、 語彙表(=インデックスのテーブル、↑だとTerms)のキーの型と 値の型が同じか、ということを気にするとよいです。 (厳密に言うと、値をトークナイズしたトークンの型が同じか、な んですが、よくわからないうちはあまり気にしなくてよいです。) ↑では、Termsが語彙表でそのキーの方はShortTextです。 一方、published_dateの型はTimeです。 型が違うのでこの定義は動きません。 (動いたとしてもたまたまです。) > ・別々のテーブルを作りインデックスを作る > table_create --name PublishDate --flags > TABLE_PAT_KEY|KEY_NORMALIZE --key_type ShortText --default_tokenizer > TokenBigram 別のテーブルを作るのが正しいのですが、この定義では動きません。 まず、型を揃えます。つまり、Timeにします。 table_create \ --name PublishDate \ --flags TABLE_PAT_KEY \ --key_type Time --default_tokenizerを指定するのは全文検索したいときだけ、と 考えてください。全文検索するときは部分文字列で検索したいので 元の値を分割(=トークナイズ)する必要があります。 今回は日付の値そのもので検索したいのでトークナイズする必要は ありません。 よって、--default_tokenizerを指定する必要はありません。 また、KEY_NORMALIZEはキーの型がShortTextの場合のみに有用です。 よって、指定する必要はありません。 なお、KEY_NORMALIZEは非推奨になっているので、使うときは代わ りに--normalizer NormalizerAutoを指定してください。 以上から、テーブル定義は↑でよいです。 > column_create --table PublishDate --name published_idx --flags > COLUMN_INDEX --type Book --source published_date インデックスカラムの定義はこれでOKです。 > 4, 指定した発売日の中で、条件に合致したものだけハイライト表示 > > ・こういう検索の仕方は大丈夫でしょうか? > (一応動いているので大丈夫そうなんですが..念のための確認です。) > 1430406000: 2015/5/1 > select --table Book \ > --query '(go OR erlang OR haskell) OR ( published_date:>0 > published_date:<1430406000)' \ > --output_columns 'highlight_html(title)' --match_columns title > --command_version 2 大丈夫です。 なお、 published_date:<1430406000 は published_date:<"2015/5/1 00:00:00" というように文字列でも指定できます。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> Groongaベースの全文検索システムを総合サポート: http://groonga.org/ja/support/ パッチ採用 - プログラミングが楽しい人向けの採用プロセス: http://www.clear-code.com/recruitment/ コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ: http://www.clear-code.com/services/code-reader/