質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Groonga

Groongaは、カラムストア機能を備えているオープンソースの全文検索エンジンです。大量にある文書から目的のキーワードを含む文書を高速で見つけることができ、全文検索機能を持つ高性能のアプリケーションを開発できます。

Q&A

解決済

1回答

1914閲覧

Groongaで1:nテーブル設計

super

総合スコア33

Groonga

Groongaは、カラムストア機能を備えているオープンソースの全文検索エンジンです。大量にある文書から目的のキーワードを含む文書を高速で見つけることができ、全文検索機能を持つ高性能のアプリケーションを開発できます。

0グッド

0クリップ

投稿2017/01/12 08:32

編集2017/01/12 09:46

こんにちは。
groongaの初心者です。テーブルの設計で助けを求め、ポスト致します。

<仕様>
次の親・子関係(1:n)のテーブルの情報があります。
親・子テーブルどっちでも1,2,3でhitしたら親の記事テーブルの1-5の情報を出力したい(json type) *4,5は検索対象ではない

  • 親の記事テーブル(検索出力結果に出す)
  1. 作成者
  2. タイトル
  3. 本文
  4. 登録日時
  5. 更新日時
  • 子のコメントテーブル(0個以上有る)
  1. 作成者
  2. タイトル
  3. コメント
  4. 登録日時
  5. 更新日時
  • 子のツイッターテーブル(0個以上有る)
  1. 作成者
  2. タイトル
  3. コメント
  4. 登録日時
  5. 更新日時
  • これから子のフッターが追加されます(0個以上複数可能)

groongaはjoinができない古いバージョン(4)なので、
以下のように一個のテーブルにくっつける設計方法を考えております。

以下のリンク先の記事から大変ヒントをいただきました。
https://kitaitimakoto.github.io/apehuci/2016/02/26.html

・groonga用トータル設計テーブル
親の記事部分 + 子のコメント部分 + 子のツイッター部分 <- 子のコメント+ツイッターの数分くっつける(親の記事部分は重複有り)

・一つのポストがコメント3個、ツイッター2個を持つ場合の例

json

1{ 2 post_id : 1, 3 post_register : "register01", 4 post_title : "title01", 5 post_contents : "contents01", 6 post_create_dt : 2017-01-12 11:12:13, 7 post_update_dt : null, 8 comments_register : "register0101", 9 comments_title : "title0101", 10 comments_contents : "contents0101", 11 comments_create_dt : 2017-01-12 11:12:13, 12 comments_update_dt : null, 13 twitter_register : "register010101", 14 twitter_title : "title010101", 15 twitter_contents : "contents010101", 16 twitter_create_dt : 2017-01-12 11:12:13, 17 twitter_update_dt : null 18}, 19{ 20 post_id : 1, 21 post_register : "register01", 22 post_title : "title01", 23 post_contents : "contents01", 24 post_create_dt : 2017-01-12 11:12:13, 25 post_update_dt : null, 26 comments_register : "register0102", 27 comments_title : "title0102", 28 comments_contents : "contents0102", 29 comments_create_dt : 2017-01-12 11:12:13, 30 comments_update_dt : null, 31 twitter_register : "register010102", 32 twitter_title : "title010102", 33 twitter_contents : "contents010102", 34 twitter_create_dt : 2017-01-12 11:12:13, 35 twitter_update_dt : null 36}, 37{ 38 post_id : 1, 39 post_register : "register01", 40 post_title : "title01", 41 post_contents : "contents01", 42 post_create_dt : 2017-01-12 11:12:13, 43 post_update_dt : null, 44 comments_register : "register0103", 45 comments_title : "title0103", 46 comments_contents : "contents0103", 47 comments_create_dt : 2017-01-12 11:12:13, 48 comments_update_dt : null, 49 twitter_register : "", 50 twitter_title : "", 51 twitter_contents : "", 52 twitter_create_dt : , 53 twitter_update_dt : 54} 55...

親のpost部分にhitしたら(子のレコードの)重複分、結果が出るためdrilldownコマンドで親のpost毎、グルーピングしたいと思います。
commentsやtwitterの子に1件以上hitしても、結果は親のpost毎、グルーピングしたいと思います。

以下groongaのドキュメントを見て想像したselectコマンドです。公式ページでは最新バージョンのドキュメントが載ってるので古いバージョンをインストールして確かめないと動くか分からないんですが、設計法として最善策かが知りたいです。mroongaなどは使えなくバージョンも4のgroonga httpサーバーに決まっております。

sql

1select 2 --table Post 3 --match_columns post_register, post_title, post_contents, comments_register, comments_title, comments_contents, twitter_register, twitter_title, twitter_contents 4 --output_columns _key, post_id, post_register, post_title, post_contents, post_create_dt, post_update_dt 5 --query @検索語 6 --drilldown post_id

もし勘違いしているどころや、
もっといい設計方法など是非教えてください。
(テーブルをPost, Comments, Twitterの3個に分けて検索しながら親のPostを参照して出力する方法など)

助かるリンクなども構いません。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「JOINができない」というのは「ネストされたインデックスが使えない」という意味ですよね?

「ネストされたインデックス」はバージョン3の頃から使えるのでバージョン4でも使えるはずです。

なので、こんな感じでいけると思います。

text

1table_create Comments TABLE_HASH_KEY UInt32 2column_create Comments register COLUMN_SCALAR ShortText 3column_create Comments title COLUMN_SCALAR ShortText 4column_create Comments contents COLUMN_SCALAR Text 5 6table_create Tweets TABLE_HASH_KEY UInt32 7column_create Tweets register COLUMN_SCALAR ShortText 8column_create Tweets title COLUMN_SCALAR ShortText 9column_create Tweets contents COLUMN_SCALAR Text 10 11table_create Posts TABLE_HASH_KEY UInt32 12column_create Posts register COLUMN_SCALAR ShortText 13column_create Posts title COLUMN_SCALAR ShortText 14column_create Posts contents COLUMN_SCALAR Text 15column_create Posts created_at COLUMN_SCALAR Time 16column_create Posts comments COLUMN_VECTOR Comments 17column_create Posts tweets COLUMN_VECTOR Tweets 18 19table_create Terms TABLE_PAT_KEY ShortText \ 20 --normalizer NormalizerAuto \ 21 --default-tokenizer TokenBigram 22column_create Terms posts_index COLUMN_INDEX|WITH_POSITION|WITH_SECTION \ 23 Posts register,title,contents 24column_create Terms comments_index COLUMN_INDEX|WITH_POSITION|WITH_SECTION \ 25 Comments register,title,contents 26column_create Terms tweets_index COLUMN_INDEX|WITH_POSITION|WITH_SECTION \ 27 Tweets register,title,contents 28 29column_create Comments posts_index COLUMN_INDEX Posts comments 30column_create Tweets posts_index COLUMN_INDEX Posts tweets 31 32load --table Comments 33[ 34{"_key": 11, "register": "register0101", "title": "title0101", "contents": "contents0101"}, 35{"_key": 12, "register": "register0102", "title": "title0102", "contents": "contents0102"}, 36{"_key": 13, "register": "register0103", "title": "title0103", "contents": "contents0103"} 37] 38 39load --table Tweets 40[ 41{"_key": 101, "register": "register010101", "title": "title010101", "contents": "contents010101"}, 42{"_key": 102, "register": "register010102", "title": "title010102", "contents": "contents010102"} 43] 44 45load --table Posts 46[ 47{"_key": 1, "register": "register01", "title": "title01", "contents": "contents01", "comments": [11, 12, 13], "tweets": [101, 102], "created_at": "2017-01-12 11:12:13"} 48] 49 50select \ 51 --table Posts \ 52 --match_columns register,title,contents,comments.register,comments.title,comments.contents,tweets.register,tweets.title,tweets.contents \ 53 --output_columns _key,register,title,contents,created_at \ 54 --query 'title010102' \ 55 --output_pretty yes

結果例:

json

1[ 2 [ 3 0, 4 1484270763.037899, 5 0.05170822143554688 6 ], 7 [ 8 [ 9 [ 10 1 11 ], 12 [ 13 [ 14 "_key", 15 "UInt32" 16 ], 17 [ 18 "register", 19 "ShortText" 20 ], 21 [ 22 "title", 23 "ShortText" 24 ], 25 [ 26 "contents", 27 "Text" 28 ], 29 [ 30 "created_at", 31 "Time" 32 ] 33 ], 34 [ 35 1, 36 "register01", 37 "title01", 38 "contents01", 39 1484187133.0 40 ] 41 ] 42 ] 43]

投稿2017/01/13 01:29

編集2017/01/13 01:31
kou

総合スコア48

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

super

2017/01/13 04:39 編集

貴重なご意見有難う御座います。 とても丁寧にサンプルコードまで書いてくださって、ありがとうございます。 古いバージョンでテーブルの分割がだめだと思い、テーブルを一つにする方法を考えましたが理想的な策をご提示していただいて助かりました。 他のどころも試してみましたが、完璧に親・子で検索、出力できました。 理解ができるまで分析して使いたいと思います。 本当に有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問