篠田です。 ご回答いただき、ありがとうございます。 使い方の問題だったんですね。 期待する動作にするには、インデックスを作る必要があるのと、さらにインデッ クスの作り方にも問題があったのだと理解しました。 全文検索エンジンを使うのに、使い方が合っているのか、もっとうまい使い方が あるのか、違うやり方をするともっとよく使えるのか、というアンテナがまだま だうまく働きません。例えばメールソフトをうまく使うには、どういうことだっ たらどういうネタがあれば実現できるか、というアンテナが働く(色んなアプリ を作った経験や、TCP通信、各種プロトコルを使った経験など)んですが、全文検 索エンジンの中身が私にとってブラックボックスすぎるんですよね。 > column_create Contents mails COLUMN_INDEX Mails contents ↑こういうやり方があること自体、私にとっては今回聞かなかったら絶対に思い つきませんし、きっと「できないんだな」で済ませてしまっていました。 これからもずれた質問をするかもしれませんが、何卒よろしくお願いいたします。 On Mon, 28 Feb 2022 16:25:42 +0900 (JST) Sutou Kouhei <kou****@clear*****> wrote: > 須藤です。 > > 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 mailing list > groon****@lists***** > https://lists.osdn.me/mailman/listinfo/groonga-dev ▲▽《篠田 敦》 shino****@jcom***** ▽▲ ▲▽ http://members.jcom.home.ne.jp/shinonon/ ▽▲