須藤です。 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を検索できるようになり、↑が動きます。