Kouhei Sutou
kou****@clear*****
2014年 9月 17日 (水) 22:14:28 JST
須藤です。 In <20140****@jcom*****> "[groonga-dev,02775] _keyを後から変更したい" on Wed, 17 Sep 2014 12:19:03 +0900, shinonon <shino****@jcom*****> wrote: > 今まで HyperEstraier で構築していた自作のシステムを Groonga にしてみよう > と思って検討しています。そこで、Groonga で登録済みのカラムの _key を後か > ら変更したいのですが、私が試した中ではできなさそうです。何かいい方法はあ > りませんでしょうか? あぁ、_keyを変更する機能は機能としてはあるのですが、外からは 呼ぶ方法はないですね。。。 > _key を変更する方法を私が知らないだけでしたら杞憂ですが、仮に変更する方 > 法がなかった場合、Groonga の機能の活用(例えばテーブル作成の工夫や検索条 > 件の工夫やドリルダウン機能等)や使い方の工夫で、もしかしたらいい解決方法 > があるのかもしれませんが、私が調べた中ではいい方法が思いつきません。長文 > になって申し訳りませんが、以下にやりたいことを記しますので、どなたかアド > バイスがありましたら教えていただけますでしょうか? Milkodeを作っているongaeshiさんがノウハウを持っていそうな気 がします。 この記事が参考になるかもしれません。 http://gihyo.jp/dev/clip/01/groonga/0004 > あるフォルダ構造を持ったデータを扱おうと思っています。 > 1. /FolderA/article0 > 2. /FolderA/FolderB/article1 > 3. /FolderC/article2 > > フォルダ構造+ファイル名を _key として、内容を body として持ち、_key も > body もインデックス型のカラムとします。全文検索は body を query して行い、 > 通常は filter なし、特定のフォルダ内を検索したいときだけ filter で _key > の前方一致を条件にしようと思っています。 パスをキーではなくpathカラムに入れるのはどうでしょうか? それぞれのファイルのキーはUUIDやハッシュ値など一意な値にして こんな感じでどうでしょうか。(↓では単純に1ずつインクリメン トしています。) table_create Files TABLE_HASH_KEY UInt64 column_create Files path COLUMN_SCALAR ShortText column_create Files body COLUMN_SCALAR LongText table_create Paths TABLE_PAT_KEY ShortText column_create Paths files_path COLUMN_INDEX Files path table_create Tokens TABLE_PAT_KEY ShortText \ --default_tokenizer TokenBigram \ --normalizer NormalizerAuto column_create Tokens files_body COLUMN_INDEX|WITH_POSITION Files body TABLE_PAT_KEYでインデックスを張っている(Paths.file_path)の でインデックスを使った前方一致検索もできます。 load --table Files [ {"_key": 1, "path": "/FolderA/article0", "body": "0番目の記事です。"}, {"_key": 2, "path": "/FolderA/FolderB/article1", "body": "Bの0番目の記事です。"}, {"_key": 3, "path": "/FolderC/article2", "body": "Cの2番目の記事です。"} ] select Files --filter 'path @^ "/FolderA/" && query("body", "B 記事")' --commanbd_version 2 # [ # [ # 0, # 1410959391.35675, # 0.000402927398681641 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "UInt64" # ], # [ # "body", # "LongText" # ], # [ # "path", # "ShortText" # ] # ], # [ # 1, # 1, # "0番目の記事です。", # "/FolderA/article0" # ], # [ # 2, # 2, # "Bの0番目の記事です。", # "/FolderA/FolderB/article1" # ] # ] # ] # ] もちろん、全文検索と組み合わせることもできます。 select Files --match_columns body --query "B 記事" --filter 'path @^ "/FolderA/"' # [ # [ # 0, # 1410959391.35717, # 0.000516176223754883 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "UInt64" # ], # [ # "body", # "LongText" # ], # [ # "path", # "ShortText" # ] # ], # [ # 2, # 2, # "Bの0番目の記事です。", # "/FolderA/FolderB/article1" # ] # ] # ] # ] > そのような中で、仮に FolderA の名前が変更された場合 1,2 の _key を変更し > ようと思うのですが、現在の Groonga ではいったん delete した後に新しい > _key で load し直すしか方法がなさそうに思えます。 > 実際には body 以外の属性もたくさんあり、「delete して load し直し」はな > るべくやりたくありません。 更新するときはselect --filter 'path @^ "/XXX"'で更新対象 の_keyを調べて load --table Files [ {"_key": 2, "path": "/FolderA/article1"} ] のようにします。 更新が少し面倒ですかねぇ。。。 -- 須藤 功平 <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/