Kouhei Sutou
kou****@clear*****
2014年 1月 28日 (火) 16:56:22 JST
須藤です。 In <CAHB5oTOKg_noT7sK3B=9N3++Pde15cp0ZwCUd=ghX=ocdDY****@mail*****> "[groonga-dev,02073] ストレージモードで転置索引テーブルからレコードを削除するとデータも削除される" on Mon, 27 Jan 2014 10:44:35 +0900, "yoku ts." <yoku0****@gmail*****> wrote: > 作業のログはこんな感じになるのですが、 > > https://gist.github.com/yoku0825/3a0f5adeba0be3aeb32f > > ・WHERE MATCH(val) AGAINST ('まご' IN BOOLEAN MODE)でnum= 1が引っかからないようにしたい > ・でもWHERE num= 1では当然引っかかってほしい(データはそのまま残る) > ・t1-valの_key== 'まご'を消せばいけるはず > > と思っていたのですが、カスケード削除に当たるのか、 > t1テーブルのvalカラムがまるまる空っぽになってしまっています。 これは期待していない挙動です! Groongaにはカスケード削除機能があって、これはインデックスのキー を消すと、インデックス元のレコード消す機能です。もともと、こ の機能は、全文検索用のインデックスではなく、逆引き用のインデッ クスのために追加したものです。 追加コミットがこれで、このコミットに含まれているテストがユー スケースを表しています。 https://github.com/groonga/groonga/commit/d488768d3eca23aadd1a429528a4054a1dcc53e3 ユーザーがブックマークするみたいなサービス用のケースで、URL が消えたらユーザーのブックマークからも削除する、ということを 実現したいケースです。URLだけ消すと、ユーザーのブックマーク にすでに存在しないURLテーブルのレコードへの参照が残ってしま うので、いろいろ不具合があったのです。それが起きないようにカ スケード削除機能を追加しました。 ユーザーテーブル ブックマークカラム(URLテーブル型。ベクター。) URLテーブル ユーザーテーブルのブックマークカラム用のインデックス(*) (*) URLを指定してブックマークしているユーザー一覧を高速に検 索するため。 で!そのときは全文検索用のインデックスのテーブルのキー(トー クン)を削除することは想定していなかったのです!で、全文検索 用のインデックスで同じような挙動になるのは、変だなぁと思うの で、期待していない挙動です! 手元ではカスケード削除しないようにする変更があるんですが、今、 コードフリーズ中なので、明日以降にpushしておきます! > (ストレージモードのみで、ラッパーモードでは期待した結果になりました) ↑のカスケード削除機能はGroongaのデータベース機能のレイヤー (テーブルとかカラムの関係とかを管理)のAPIで実装しているので すが、ラッパーモードのときは、それより下のレイヤーのAPIで、イ ンデックスを直接使っていたので関係無かったのです。 > また、deleteを叩いた直後はMySQLからはdelete前の情報が見えていて、 > FLUSH TABLESなどで開きなおしてやるとdelete後の情報が見えるようになっているようです。 これはMySQLのキャッシュじゃないかと思います。 > また、↑のような「あるレコードが特定のキーワードで(のみ)マッチしないようにする」のはt1-valの_keyをいじってやる…というのはそもそも間違っていたりしますか? 想定はしていませんでしたが、動くといいなとは思いました! -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) Groongaサポート: http://groonga.org/ja/support/ パッチ採用はじめました: http://www.clear-code.com/recruitment/ コミットへのコメントサービスはじめました: http://www.clear-code.com/services/commit-comment.html