7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

groongaでレコードを削除する方法

Last updated at Posted at 2013-03-14

groongaやmroongaを実際に使っていて、記事を書いてもいいよ、という人を募集しています。
すでに数名の方からご応募いただいていますが、まだまだ募集中です。
詳細はgroonga普及のための協力のお願いを参照してください。

はじめに

オープンソースのカラムストア機能付き全文検索エンジンgroongaを公開しています。
この記事を書いたときの最新のバージョンは2013年2月28日にリリースした3.0.1です。

前回は、loadコマンドを使って特定のカラムを更新する方法を紹介しました。また、その中で定義したテーブルにデータを登録する方法も紹介しました。
そこで、今回は逆にgroongaのテーブルからレコードを削除する方法を紹介します。データを投入していって、不要になったレコードを削除したくなったときに使えます。

groongaにはレコードを削除する方法が次の3つあります。

  • 主キーやIDを指定する
  • 削除したいレコードの条件を指定する
  • テーブルに登録されたレコードすべてを削除する

最初に実際にレコードの削除を試すためのサンプルを示します。次に、それぞれの削除方法について簡単に紹介します。

サンプルのスキーマとデータ

以下はサンプルとして使うテーブルのスキーマです。

table_remove Books
table_create Books TABLE_HASH_KEY UInt32
column_create Books title COLUMN_SCALAR ShortText
column_create Books price COLUMN_SCALAR Int32

Booksというテーブルを作成し、本のタイトルを格納するtitleカラムと、値段を格納するpriceカラムを定義しました。
このテーブルに、前回も紹介したloadコマンドでデータを登録します。

load --table Books
[
{"_key":1, "title":"Head First Groonga", "price": 3400},
{"_key":2, "title":"Head First Mroonga", "price": 2800},
{"_key":3, "title":"Groonga command manual", "price": 1000},
{"_key":4, "title":"Head First Rroonga", "price": 2000},
{"_key":5, "title":"Mroonga manual", "price": 2500}
]

正しく登録できたかを、次のselectコマンドで確認します。

select Books --output_columns _key,title,price

上記コマンドの --output_columns _key,title,price というのは表示するカラムを指定する引数です。
上のコマンドを実行した結果を見やすいように抜粋し、整形すると以下のようになります。
(なお、以降の実行結果も適宜抜粋・整形しており、実際の実行結果には他にも情報が出力されます。詳しくは出力内容についてのドキュメントをご覧ください。)

[
  [
    [5],
    [["_key","UInt32"],["title","ShortText"],["price","Int32"]],
    [1,"Head First Groonga",3400],
    [2,"Head First Mroonga",2800],
    [3,"Groonga command manual",1000],
    [4,"Head First Rroonga",2000],
    [5,"Mroonga manual",2500]
  ]
]

実行結果を見ると、loadコマンドで登録した5つのレコードがBooksテーブルにあることがわかります。

主キーやIDを指定する

レコードを削除するには、deleteコマンドを使用します。
deleteコマンドはテーブル名と、削除するレコードの主キーの値やIDの値、もしくは後述しますが条件式を指定できます。
今回は、次のように_keyカラムの値が2のレコードを削除してみます。

delete Books 2

正しく削除が行われると、次のように実行結果が表示されます。

[true]

もし削除できなかった場合は [false] が返ってくるので、テーブル内のレコードの内容と実行したdeleteコマンドを確認してください。
さて、正しく削除されたかどうかをselectコマンドで確認してみましょう。先ほどと同じように、Booksテーブルの中身を確認してみます。

select Books --output_columns _key,title,price

正しく削除されている場合、次のような結果が返ってきます。

[
  [
    [4],
    [["_key","UInt32"],["title","ShortText"],["price","Int32"]],
    [1,"Head First Groonga",3400],
    [3,"Groonga command manual",1000],
    [4,"Head First Rroonga",2000],
    [5,"Mroonga manual",2500]
  ]
]

実行結果を見ると、レコード数が5つから4つに減り、主キーが2のレコードが削除されていることがわかります。

もし、主キーの値でなく、IDの値を指定したい場合は、まず次のようなselectコマンドでIDの値を確認します。

select Books --output_columns _id,_key,title,price

先ほど実行したselectコマンドとの違いは、 --output_columns 引数に対して _id という文字列を指定しているところです。これはレコードのIDを表示するためです。このselectコマンドを実行すると、次のように結果が返ってきます。

[
  [
    [4],
    [["_id","UInt32"],["_key","UInt32"],["title","ShortText"],["price","Int32"]],
    [1,1,"Head First Groonga",3400],
    [3,3,"Groonga command manual",1000],
    [4,4,"Head First Rroonga",2000],
    [5,5,"Mroonga manual",2500]
  ]
]

上記の実行結果のうち、各レコードの最初の値がそのレコードのIDです。
このうち、IDが5のレコードを消すには、次のように --id 引数を指定してdeleteコマンドを実行してください。

delete Books --id 5

正しく削除できていると、次のように実行結果が表示されます。

[true]

先ほどと同じselectコマンドを実行してみましょう。

select Books --output_columns _id,_key,title,price

正しく削除できている場合は、実行すると次のような実行結果が返ってきます。

[
  [
    [3],
    [["_id","UInt32"],["_key","UInt32"],["title","ShortText"],["price","Int32"]],
    [1,1,"Head First Groonga",3400],
    [3,3,"Groonga command manual",1000],
    [4,4,"Head First Rroonga",2000]
  ]
]

IDが5のレコードが削除されているのがわかります。

削除したいレコードの条件を指定する

先ほどの方法だと1つずつしかレコードを削除できません。例えば、"Groonga"という文字列がタイトルに含まれているレコードを先ほどの方法で削除しようとすると、titleカラムの値を見ながら1つずつ主キーの値を指定してdeleteコマンドを実行しなくてはなりません。
このように、削除したいレコードの条件が決まっているときには、deleteコマンドにfilter引数を指定することで条件を満たしたレコードを削除することができます。
条件はgroongaのスクリプト構文という記法に従って書きます。これはselectコマンドで全文検索するときにも使える記法です。そのため、deleteコマンドを使って全文検索し、ヒットしたレコードを削除することができます。スクリプト構文の詳しい書き方についてはリンク先をご覧下さい。

ここでは、「titleカラムに"Groonga"という単語が含まれている」という条件に当てはまったレコードを削除してみます。次のようにdeleteコマンドを実行してください。 'title @ "Groonga"' の部分が上記の条件を示しています。

delete Books --filter 'title @ "Groonga"'

これも、削除が成功すると次のように表示されます。

[true]

レコードが削除されているか、selectコマンドで確かめてみましょう。
なお、先ほど実行したselectコマンドの結果を見ると、"Groonga"という文字列が含まれるタイトルは主キーの値が1と3のレコードがもっていました。

select Books --output_columns _key,title,price

正しく削除されているなら次のような実行結果になります。

[
  [
    [1],
    [["_key","UInt32"],["title","ShortText"],["price","Int32"]],
    [4,"Head First Rroonga",2000]
  ]
]

selectコマンドの実行結果を見ると、確かに主キーの値が1と3のレコードが削除され、レコードの数が1つになっていることがわかります。

テーブルに登録されたレコードすべてを削除する

条件を指定せず、テーブルに登録されたレコードを全て削除するには、truncateコマンドを利用します。truncateコマンドはテーブル名を指定すると、そのテーブル内にあるレコードをすべて削除します。
それでは、残っているレコードを削除してみましょう。残っているのは主キーの値が4のレコードでした。次のコマンドを実行してください。

truncate Books

truncateコマンドには、レコードを指定するための値を何も指定していないのがわかります。
上記のコマンドが成功すると次のような実行結果になります。

[true]

次のselectコマンドで、Booksテーブルにレコードがないことを確認しましょう。

select Books --output_columns _key,title,price
[
  [
    [0],
    [["_key","UInt32"],["title","ShortText"],["price","Int32"]]
  ]
]

レコードの件数が0になっており、何もレコードが出力されていないことから、Booksテーブルからレコードがすべて削除されたことがわかります。

なお、deleteコマンドとtruncateコマンドどちらを使った場合でも、いちど削除したレコードを戻すことはできません。もし消してもいいか不安がある場合はデータベースをバックアップしておくと安心です。(バックアップにはdumpコマンドが利用できます。)

まとめ

今回はgroongaで不要になったレコードを削除するための方法について紹介しました。

groongaに興味を持ったなら、まずはインストールして試してみてください。

groongaの基本的な動作を知るためのチュートリアルもあります。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?