[groonga-dev,04929] Re: 自テーブルと別テーブルの同時検索はできない?

Back to archive index
Sutou Kouhei kou****@clear*****
2022年 2月 28日 (月) 16:25:42 JST


須藤です。

In <20220****@jcom*****>
  "[groonga-dev,04928] 自テーブルと別テーブルの同時検索はできない?" on Fri, 25 Feb 2022 08:52:29 +0900,
  shinonon <shino****@jcom*****> wrote:

> 久しぶりにソフト製作欲が湧いてきたので、保留状態だったメール検索のため
> の groonga テーブル設計を考えていたのですが、文書本体とメールのテーブ
> ルを分けておいたほうがあとあと都合がいいと思い、以下のようにしてみまし
> た。ところが、期待と違う検索結果が出てきてしまい、何かの制限事項に引っ
> かかっているのか、または使い方の問題なのかで悩んでいます。

使い方の問題です!

全文検索用のインデックスがないのでシーケンシャルサーチになっ
ているのですが、シーケンシャルサーチには制限があってインデッ
クスでの検索と同じように動かないことがあります。

> select --table Mails --match_columns "contents.body" --query "eee"

Mails.contentsがベクターなのでこれは各要素に対する完全一致検
索になります。

> {"_key":1, "ctype":"text", "body":"eee", "msgid": "<aaa @ bbb>"},

のbodyが"eee"なのでヒットします。

> select --table Mails --match_columns "subject || contents.body" --query "eee"

シーケンシャルサーチだとmatch_columns "A || B"は使えないので
ヒットしません。

> select --table Mails --match_columns "subject" --query "subject"

Mails.subjectがスカラーなのでこれはカラムの値に対する部分一
致検索になります。

> {"_key":"<aaa @ bbb>", "subject":"subject", "contents":[1,2]},

のsubjectが部分一致(完全一致)してヒットします。

> select --table Mails --match_columns "subject || contents.body" --query "subject"

シーケンシャルサーチだとmatch_columns "A || B"は使えないので
ヒットしません。

> select --table Mails --match_columns "contents.body" --query "ワード"

部分一致ではなく完全一致なので「ワード」だとヒットしません。
「ワード文書」だとヒットします。


ということで、これらは全文検索用のインデックスを次のように作
るとヒットするようになります。

table_create Terms TABLE_PAT_KEY ShortText \
  --default_tokenizer TokenNgram \
  --normalizer NormalizerNFKC130
column_create Terms mails_subject COLUMN_INDEX|WITH_POSITION \
  Mails subject
column_create Terms contents_body COLUMN_INDEX|WITH_POSITION \
  Contents body


ただし、最後の

> select --table Mails --match_columns "contents.body" --query "ワード"

はこれだけだとヒットしなくて、↓のインデックスも必要です。

column_create Contents mails COLUMN_INDEX Mails contents

これがあるとContents.bodyで全文検索し、ヒットしたContentsを
持つMailsを検索できるようになり、↑が動きます。


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