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

Back to archive index

Hiroyuki Sato hiroy****@gmail*****
2015年 8月 15日 (土) 01:42:22 JST


須藤様

佐藤です。
ご連絡をありがとうございます。

インラインでコメントしました。
よろしくお願いします。


2015年8月13日 23:47 Kouhei Sutou <kou****@clear*****>:
> 須藤です。
>
> 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のキーが複数だったり、条件が指定されているとインデッ
> クスがあってもなくても速度は変わりません。

ありがとうございます。今使っているのは複数のqueryを使っているでソートは速くならいですね。

>
>>  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です。

なるほど、ありがとうございます。

ちなみに、二つのカラムが同じ型(ex ShortText)である場合
インデックス用のテーブルを別々にしたほうが良いケースはありますでしょうか?

例えば

http://groonga.org/ja/docs/tutorial/match_columns.html?highlight=複数%20カラム%20インデックス
こちらのtitle,messageのような場合

titleはTitleIndexテーブル、messageはMessageIndexとするようなケースです。
それぞれで異なるトークナイズの方法が違う場合はそれぞれ別にテーブルを作る必要がある
という理解で良いでしょうか?

>
> 型が違うのでこの定義は動きません。
> (動いたとしてもたまたまです。)
>
>>   ・別々のテーブルを作りインデックスを作る
>>       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 mailing list
> groon****@lists*****
> http://lists.osdn.me/mailman/listinfo/groonga-dev



-- 
Hiroyuki Sato



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