[groonga-dev,03412] Re: 日付データと、highlight_htmlのことについて押してください。

Back to archive index

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/




groonga-dev メーリングリストの案内
Back to archive index