.TH "GROONGA" "1" "August 05, 2011" "1.2.4" "groonga" .SH NAME groonga \- groonga documentation . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .\" Man page generated from reStructeredText. . .INDENT 0.0 .IP \(bu 2 . \fBnews\fP .UNINDENT .SH GROONGAの特徴 .SS 全文検索ライブラリSennaの後継 .sp groongaは、広く使われている全文検索ライブラリSennaの後継として開発されています。Sennaの特徴である、高速・高精度・高柔軟性という特徴を引き継ぎつつ、さらにそれらの特徴を追求するために開発が始められました。 .SS HTTPなどの複数プロトコルに対応したサーバ .sp Sennaは、全文検索を行うアプリケーションで用いるための部品でした。groongaでは、全文検索サービスを行うためのサーバが存在します。groongaサーバは、HTTPやmemcached binaryプロトコル、独自プロトコルであるgqtpを用いてクライアントとTCP/IP通信を行うことができます。よって、ライブラリをインストールできないレンタルサーバなどの環境でも利用しやすくなりました。 .sp Sennaと同様に、groongaもC言語のライブラリとして利用できます。 .SS 高速なデータ更新 .sp groongaの前身であるSennaは、ストレージを持たない全文検索ライブラリでした。そのため、MySQLのMyISAMストレージエンジンと組み合わせて用いるTritonnや、PostgreSQLと組み合わせて用いるLudiaを通じて利用するのが一般的でした。しかし、これらの形態では、全文検索インデックス更新における参照lockが不要というSennaの性能特性を生かすことができませんでした。 .sp たとえば、MyISAMではレコードが更新される際には、多くの場合テーブルロックが必要となります。このような場合には、いかに全文検索インデックスの更新が速くとも、MyISAMでのデータ更新がボトルネックとなってしまいます。 .sp より即時性の高い検索サービスを実現するために、groongaでは参照lockが不要なストレージを実装しました。 .SS 複数プロセス・複数スレッドで共有できるストレージ .sp groongaのストレージファイルは、複数プロセスや複数スレッドで共有することができます。明示的なロックなどは必要ありません。 .sp Tritonnの次期バージョンは、MySQLのプラガブルストレージエンジンとして実装予定です。Tritonnで開いているgroongaストレージファイルも共有可能です。たとえば、MySQLプロトコルでデータの更新を行い、HTTPでデータの参照を行うことができます。 .SS ドリルダウンなどの集計系クエリを高速に実現 .sp groongaのストレージは、カラムごとにデータを保存するカラム指向データベースを採用しています。カラム指向データベースはOLAPなどの集計クエリを高速に実現するのに向いています。 .sp 全文検索結果のうち、特定のカラム値ごとにグループ分けをし、それぞれのグループのレコード数を数えるような処理をドリルダウンといいます。groongaはカラム指向データベースを生かして、このような処理を高速に実行します。 .SS Sennaの転置インデックス実装をさらに改良 .sp groongaの転置インデックスは、Sennaにおける転置インデックスの実装を改良し、より高速かつ汎用的なものとなりました。 .sp 転置インデックスを生かすことにより、SQLでも実現が難しい複雑なクエリを高速に実行することができます。いわゆるタグ検索やドリルダウンにおいて、転置インデックスを利用した高速な処理を行うことができます。 .SS 位置情報(緯度・経度)検索 .sp 日本測地系のみならず、世界測地系にも対応した位置情報での絞込が可能です。位置情報の範囲は、円や矩形を指定することができます。また、任意の2点間の距離も計算可能です。 .SS 自動クエリキャッシュ機構 .sp 参照系のクエリについて、自動的にクエリキャッシュを行います。 .SH INSTALL .sp We will explain of how to install Groonga for each environments. .sp The packages for 64\-bit binary are only distributed. Please attention not to distributing others for 32\-bit binaly. .SS Debian GNU/Linux squeeze .IP Note . We only distribute the package for amd64. .RE .sp /etc/apt/sources.list.d/groonga.list: .sp .nf .ft C deb http://packages.groonga.org/debian/ squeeze main deb\-src http://packages.groonga.org/debian/ squeeze main .ft P .fi .sp Install: .sp .nf .ft C % sudo apt\-key adv \-\-recv\-keys \-\-keyserver keyserver.ubuntu.com 1C837F31 % sudo aptitude update % sudo aptitude \-V \-D \-y install groonga .ft P .fi .SS Debian GNU/Linux wheezy .IP Note . We only distribute the package for amd64. .RE .sp /etc/apt/sources.list.d/groonga.list: .sp .nf .ft C deb http://packages.groonga.org/debian/ wheezy main deb\-src http://packages.groonga.org/debian/ wheezy main .ft P .fi .sp Install: .sp .nf .ft C % sudo apt\-key adv \-\-recv\-keys \-\-keyserver keyserver.ubuntu.com 1C837F31 % sudo aptitude update % sudo aptitude \-V \-D \-y install groonga .ft P .fi .SS Debian GNU/Linux sid .IP Note . We only distribute the package for amd64. .RE .sp /etc/apt/sources.list.d/groonga.list: .sp .nf .ft C deb http://packages.groonga.org/debian/ unstable main deb\-src http://packages.groonga.org/debian/ unstable main .ft P .fi .sp Install: .sp .nf .ft C % sudo apt\-key adv \-\-recv\-keys \-\-keyserver keyserver.ubuntu.com 1C837F31 % sudo aptitude update % sudo aptitude \-V \-D \-y install groonga .ft P .fi .SS Ubuntu 10.04 LTS Lucid Lynx .IP Note . We only distribute the package for amd64. .RE .IP Note . You should specify universe section of Ubuntu for installing by add file(ex. below\-mentioned). .RE .sp /etc/apt/sources.list.d/groonga.list: .sp .nf .ft C deb http://packages.groonga.org/ubuntu/ lucid universe deb\-src http://packages.groonga.org/ubuntu/ lucid universe .ft P .fi .sp Install: .sp .nf .ft C % sudo apt\-key adv \-\-recv\-keys \-\-keyserver keyserver.ubuntu.com 1C837F31 % sudo aptitude update % sudo aptitude \-V \-D \-y install groonga .ft P .fi .SS Ubuntu 11.04 Natty Narwhal .IP Note . We only distribute the package for amd64. .RE .IP Note . You should specify universe section of Ubuntu for installing by add file(ex. below\-mentioned). .RE .sp /etc/apt/sources.list.d/groonga.list: .sp .nf .ft C deb http://packages.groonga.org/ubuntu/ natty universe deb\-src http://packages.groonga.org/ubuntu/ natty universe .ft P .fi .sp Install: .sp .nf .ft C % sudo apt\-key adv \-\-recv\-keys \-\-keyserver keyserver.ubuntu.com 1C837F31 % sudo aptitude update % sudo aptitude \-V \-D \-y install groonga .ft P .fi .SS CentOS 5 .IP Note . We only distribute the package for amd64. .RE .sp Install: .sp .nf .ft C % sudo rpm \-ivh http://packages.groonga.org/centos/groonga\-repository\-1.0.0\-0.noarch.rpm % sudo yum update % sudo yum install \-y groonga .ft P .fi .SS Fedora 15 .IP Note . We only distribute the package for amd64. .RE .sp Install: .sp .nf .ft C % sudo rpm \-ivh http://packages.groonga.org/fedora/groonga\-repository\-1.0.0\-0.noarch.rpm % sudo yum update % sudo yum install \-y groonga .ft P .fi .SS Mac OS X (MacPorts) .sp Install: .sp .nf .ft C % git clone https://github.com/groonga/macports.git ~/groonga\-macports % (echo; echo file://$HOME/groonga\-macports) | sudo sh \-c "cat >> /opt/local/etc/macports/sources.conf" % sudo port install groonga .ft P .fi .SS Mac OS X (Homebrew) .sp Install: .sp .nf .ft C % brew install groonga .ft P .fi .SS Windows .IP Note . We only distribute the package for x64. .RE .sp You just download zip\-file from \fI\%packages.groonga.org/windows/\fP and extract it. We doesn\(aqt distribute installer for now. Sorry. .SS Others .sp If you will use indexes of tokenizing of each morpheme for full\-text search, you should install \fI\%MeCab\fP before you install groonga. .sp After, you should download tar.gz\-file from \fI\%packages.groonga.org/source/\fP for installing groonga. You should extract this file in place to install, and run commands below\-mentioned. .sp .nf .ft C \&./configure \-\-prefix=/usr \-\-localstatedir=/var && make && sudo make install .ft P .fi .sp The "prefix" option is the paramater for specified place to install. If you won\(aqt specify the option, "/usr/local" is specified. Please specify "/usr" for this option if you don\(aqt know environment variables(LD_LIBRARY_PATH and so on) well. .SH COMMUNITY .sp There are some places for sharing groonga information. We welcome you to join our community. .SS Mailing List .sp There are mailing lists for discussion about groonga. .INDENT 0.0 .TP .B For Japanese developers . \fI\%groonga-dev@lists.sourceforge.jp\fP .UNINDENT .SH チュートリアル .SS 基本的な操作 .sp groongaは、Cのライブラリとして使用する方法と、groonga実行ファイルを通して使用する方法があります。 .sp 本チュートリアルでは、groonga実行ファイルを使用する方法について説明します。 .sp groonga実行ファイルを使って、DBの作成・操作・サーバの起動・サーバへの接続などの操作が行えます。 .SS DBの作成 .sp 以下のようなコマンドを実行すると、データベースを新規に作成することができます。 .sp 書式 .sp .nf .ft C groonga \-n データベースパス名 .ft P .fi .sp \-nオプションは、データベースを作ることを示します。 .sp データベースパス名には、新しく作成するデータベースのフルパス名を指定します。 .sp 上記コマンドでデータベースを作成すると、そのまま対話モードと呼ばれるコマンドを受け付けるモードになります。Ctrlキーを押しながらdキーを押すと、対話モードから抜けることができます。 .sp 実行例: .sp .nf .ft C % groonga \-n /tmp/tutorial.db > ctrl\-d % .ft P .fi .SS DBの操作 .sp 書式 .sp .nf .ft C groonga DBパス名 [コマンド] .ft P .fi .sp 既存のデータベースのフルパス名をDBパス名に指定します。 コマンドを指定すると、実行結果を返します。 .sp コマンドを指定しない場合には、対話モードに入ります。 対話モードでは、標準入力からコマンドを読み込み、順次実行します。 本チュートリアルでは、対話モードを主に使用します。 .sp たとえば、statusというコマンドを実行してみましょう。statusコマンドは、groongaの実行状態を返すコマンドです。 .sp 実行例 .sp .nf .ft C % groonga /tmp/tutorial.db > status [[0,1308820929.89434,5.7777e\-05],{"alloc_count":525,"starttime":1308820641,"uptime":288,"version":"1.2.2\-104\-gf48051d","n_queries":376,"cache_hit_rate":0.797872340425532,"command_version":1,"default_command_version":1,"max_command_version":2}] .ft P .fi .sp 以上のように、コマンドの実行結果は基本的にjson形式で返却されます。jsonの配列の0番目の要素に、エラーコードや実行時間などの情報が入ります。jsonの配列の1番目の様子に、コマンドの実行結果が入ります。 .SS コマンド .sp groonga実行ファイルやgroongaサーバを介して様々なコマンドを実行して、DBを操作することができます。 コマンドは以下の書式のうちいずれかで与えることができます。 .sp .nf .ft C 書式1: コマンド名 引数1 引数2 .. 書式2: コマンド名 \-\-引数名1 値1 \-\-引数名2 値2 .. .ft P .fi .sp 書式1と2は混ぜて使うことができます。 .sp 書式2において、空白や、記号「"\(aq()」のうちいずれかを含む値を指定したい場合は、シングルクォート(\(aq)かダブルクォート(")で値を囲みます。 .sp 詳しくは、 \fB/execfile\fP のコマンドの項を参考にしてください。 .SS 主なコマンド .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .TP .B \fB/commands/status\fP .sp groongaプロセスの状態を表示します。 .TP .B \fB/commands/table_list\fP .sp DBに定義されているテーブルのリストを表示します。 .TP .B \fB/commands/column_list\fP .sp テーブルに定義されているカラムのリストを表示します。 .TP .B \fB/commands/table_create\fP .sp DBにテーブルを追加します。 .TP .B \fB/commands/column_create\fP .sp テーブルにカラムを追加します。 .TP .B \fB/commands/select\fP .sp テーブルに含まれるレコードを検索して表示します。 .TP .B \fB/commands/load\fP .sp テーブルにレコードを挿入します。 .UNINDENT .UNINDENT .UNINDENT .SS テーブルの作成 .sp \fB/commands/table_create\fP コマンドを使用してテーブルを作成します。 .sp groongaでは、多くの場合テーブルを作成する際に主キーが必要となります。また、主キーには型と、その格納方法を指定する必要があります。 .sp 型については、のちのチュートリアルで触れます。データの種類をあらわしているもの、とイメージしてください。 .sp 主キーの格納方法によって、主キーでの検索速度や、前方一致検索の可否が決まります。これも、のちのチュートリアルで触れます。 .sp ここでは、ShortText型の主キー値を持ち、主キーの格納方法はHASHである、\(aqSite\(aqという名前のテーブルを作成します。 .sp 実行例 .sp .nf .ft C > table_create \-\-name Site \-\-flags TABLE_HASH_KEY \-\-key_type ShortText [[0,1308820930.09682,0.063827982],true] .ft P .fi .SS 検索 .sp \fB/commands/select\fP コマンドを用いて、テーブルの中身を表示することができます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site [[0,1308820930.36252,0.000151605],[[[0],[["_id","UInt32"],["_key","ShortText"]]]]] .ft P .fi .sp selectにテーブル名を指定すると、指定したテーブルの中身を10件表示します。[0]は検索されたレコードの件数、["_id","Uint32"]は値がUInt32型である"_id\(aqという名前のカラム、["_key","ShortText"]は値がShortText型である\(aq_key\(aqという名前のカラムを示しています。 .sp table_createコマンドで作成したテーブルには、最初から\(aq_id\(aq/\(aq_key\(aqという2つのカラムがあります。\(aq_id\(aqはgroongaが自動的に付与するID番号が格納されるカラムです。\(aq_key\(aqは主キーが格納されるカラムです。これらのカラム名を変更することはできません。 .SS カラムの作成 .sp \fB/commands/column_create\fP コマンドを用いて、カラムを作成することができます。 .sp ShortText型の値を持つ、\(aqcomment\(aqという名前のカラムを\(aqSite\(aqテーブルに追加しましょう。 .sp 実行例 .sp .nf .ft C > column_create \-\-table Site \-\-name title \-\-flags COLUMN_SCALAR \-\-type ShortText [[0,1308820930.56469,0.052566362],true] > select \-\-table Site [[0,1308820930.81869,9.5061e\-05],[[[0],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]]]]] .ft P .fi .sp COLUMN_SCALARについては、通常のカラムであることを示しています。 .SS 全文検索用の語彙表の作成 .sp このチュートリアルでは、groongaに登録したデータを用いた全文検索を行います。 .sp 全文検索を行う場合は、まず語彙表を作成する必要があります。 語彙表とは、文書の中にある単語が主キーとなるテーブルです。 ここでは、ShortText型の主キー値を持つ、\(aqTerms\(aqという名前のテーブルを作成しました。 .sp 実行例 .sp .nf .ft C > table_create \-\-name Terms \-\-flags TABLE_PAT_KEY|KEY_NORMALIZE \-\-key_type ShortText \-\-default_tokenizer TokenBigram [[0,1308820931.02058,0.054235759],true] .ft P .fi .sp この実行例には、多くのパラメータが指定されています。本チュートリアルでは、これらをすべて理解する必要はありません。以下に簡単な説明を記しますが、読み飛ばしてもらってかまいません。 .sp 実行例にある、TABLE_PAT_KEY|KEY_NORMALIZEという値は、主キー値をパトリシア木に格納し、各語彙を正規化して登録することを示しています。 .sp 実行例にある、TokenBigramという値は、 語彙表として使用するテーブルは、対象の文書をトークナイズする方式を、default_tokenizerパラメータで与えます。この例ではTokenBigramを指定しています。よって、一般的にN\-gramと呼ばれるようなインデックス方式を選択しています。 .SS 全文検索用のインデックスカラムの作成 .sp Siteテーブルのtitleカラムを全文検索の対象としたいとしましょう。その場合には、語彙表にインデックス型のカラムを作成します。 .sp 実行例 .sp .nf .ft C > column_create \-\-table Terms \-\-name blog_title \-\-flags COLUMN_INDEX|WITH_POSITION \-\-type Site \-\-source title [[0,1308820931.27655,0.173806991],true] .ft P .fi .sp Siteテーブルのtitleカラムを検索対象とする、\(aqblog_title\(aqという名前のインデックス型カラムをTermsテーブルに作成しました。インデックス対象となるテーブルをtypeに、インデックス対象となるカラムをsourceに指定します。 .sp 実行例のflagsのCOLUMN_INDEX|WITH_POSITIONという値は、語彙の位置情報を格納するインデックス型のカラムであることを示しています。通常の全文検索インデックスでは、COLUMN_INDEX|WITH_POSITIONを指定してください。語彙の位置情報を格納する意味については、本チュートリアルでは触れません。 .SS データのロード .sp \fB/commands/load\fP コマンドを使用します。loadコマンドでは、jsonで受け取ったデータをテーブルに格納します。 .sp 実行例 .sp .nf .ft C > load \-\-table Site > [ > {"_key":"http://example.org/","title":"This is test record 1!"}, > {"_key":"http://example.net/","title":"test record 2."}, > {"_key":"http://example.com/","title":"test test record three."}, > {"_key":"http://example.net/afr","title":"test record four."}, > {"_key":"http://example.org/aba","title":"test test test record five."}, > {"_key":"http://example.com/rab","title":"test test test test record six."}, > {"_key":"http://example.net/atv","title":"test test test record seven."}, > {"_key":"http://example.org/gat","title":"test test record eight."}, > {"_key":"http://example.com/vdw","title":"test test record nine."}, > ] [[0,1308820931.65233,2.210007023],9] .ft P .fi .sp selectコマンドで、データが入っていることを確認しましょう。 .sp 実行例 .sp .nf .ft C > select \-\-table Site [[0,1308820934.06389,0.000123535],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"],[2,"http://example.net/","test record 2."],[3,"http://example.com/","test test record three."],[4,"http://example.net/afr","test record four."],[5,"http://example.org/aba","test test test record five."],[6,"http://example.com/rab","test test test test record six."],[7,"http://example.net/atv","test test test record seven."],[8,"http://example.org/gat","test test record eight."],[9,"http://example.com/vdw","test test record nine."]]]] .ft P .fi .SS データの検索 .sp groongaでは、\(aq_id\(aqカラムと\(aq_key\(aqカラムの値はテーブル中で一意です。よって、それを用いて検索してみましょう。 .sp selectコマンドにおいて、queryパラメータを用いるとデータの検索を行うことができます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-query _id:1 [[0,1308820934.2671,0.000244984],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]] .ft P .fi .sp queryパラメータに与えた「_id:1」というのは、\(aq_id\(aqという名前のカラムに\(aq1\(aqという値が入っているレコードを検索する、という意味です。 .sp _keyでも検索してみましょう。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-query "_key:\e"http://example.org/\e"" [[0,1308820934.46932,0.000421384],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]] .ft P .fi .sp queryパラメータに与えた「_key:"\fI\%http://example.org/\fP"」というのは、\(aq_key\(aqという名前のカラムに\(aq"\fI\%http://example.org/\fP"\(aqという値が入っているレコードを検索する、という意味です。 .SS 全文検索 .sp queryパラメータでは、インデックスを用いた全文検索を行うこともできます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-query title:@this [[0,1308820934.67264,0.000440628],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]] .ft P .fi .sp titleカラムに対して、\(aqthis\(aqという文字列で全文検索を行った結果を返します。 .sp queryパラメータに与えた「title:@this」というのが、\(aqtitle\(aqという名前のカラムに\(aqthis\(aqという文字列が含まれているレコードを検索する、という意味です。 .sp selectコマンドには、match_columnsというパラメータが存在します。これを指定すると、query内にカラム名を指定しない条件があった場合、match_columnsで指定されたカラムに対しての検索であることを示します。[1]_ .sp match_columnsパラメータに\(aqtitle\(aq、queryパラメータに\(aqthis\(aqという文字列を指定すると、上記のクエリと同じ結果を得ることができます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-match_columns title \-\-query this [[0,1308820934.87474,0.000280727],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]] .ft P .fi .SS 出力カラムの指定 .sp selectコマンドにおいて、output_columnsパラメータを用いることで、検索結果で表示するカラムを指定することが出来ます。 .sp 複数のカラムを指定する場合は、カンマ(,)区切りで指定します。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-output_columns _key,title,_score \-\-query title:@test [[0,1308820935.07756,0.000495772],[[[9],[["_key","ShortText"],["title","ShortText"],["_score","Int32"]],["http://example.org/","This is test record 1!",1],["http://example.net/","test record 2.",1],["http://example.com/","test test record three.",2],["http://example.net/afr","test record four.",1],["http://example.org/aba","test test test record five.",3],["http://example.com/rab","test test test test record six.",4],["http://example.net/atv","test test test record seven.",3],["http://example.org/gat","test test record eight.",2],["http://example.com/vdw","test test record nine.",2]]]] .ft P .fi .sp groongaの検索結果には、「_score」という名前のカラムが追加されています。このカラムは、全文検索の条件が合致する文書ほど高い数値が入ります。 .SS 表示範囲指定 .sp selectコマンドにおいて、offset,limitパラメータを用いることで、検索結果から指定された範囲のみを表示することが出来ます。大量の検索結果をページで分けて、1ページ分のみを表示したい場合に有効です。 .sp offsetパラメータには、検索結果を返す始点を指定します。1件目から結果を返す場合には、0を指定します。 .sp limitパラメータには、検索結果を何件表示するのかを指定します。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-offset 0 \-\-limit 3 [[0,1308820935.28442,0.000252225],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"],[2,"http://example.net/","test record 2."],[3,"http://example.com/","test test record three."]]]] > select \-\-table Site \-\-offset 3 \-\-limit 3 [[0,1308820935.48834,0.000202216],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[4,"http://example.net/afr","test record four."],[5,"http://example.org/aba","test test test record five."],[6,"http://example.com/rab","test test test test record six."]]]] > select \-\-table Site \-\-offset 7 \-\-limit 3 [[0,1308820935.69195,0.000117711],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[8,"http://example.org/gat","test test record eight."],[9,"http://example.com/vdw","test test record nine."]]]] .ft P .fi .SS 並び替え .sp selectコマンドにおいて、sortbyパラメータを用いることで、検索結果を並び替えることが出来ます。 .sp sortbyパラメータにカラム名を指定することで、そのカラムの値で昇順にソートします。また、カラム名の前にハイフン(\-)を付けることで、降順にソートすることも出来ます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-sortby \-_id [[0,1308820935.8941,0.000183882],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[9,"http://example.com/vdw","test test record nine."],[8,"http://example.org/gat","test test record eight."],[7,"http://example.net/atv","test test test record seven."],[6,"http://example.com/rab","test test test test record six."],[5,"http://example.org/aba","test test test record five."],[4,"http://example.net/afr","test record four."],[3,"http://example.com/","test test record three."],[2,"http://example.net/","test record 2."],[1,"http://example.org/","This is test record 1!"]]]] .ft P .fi .sp 出力カラムの指定で紹介した「_score」カラムは、ソートの条件としても使うことができます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-query title:@test \-\-output_columns _id,_score,title \-\-sortby _score [[0,1308820936.09781,0.000563749],[[[9],[["_id","UInt32"],["_score","Int32"],["title","ShortText"]],[1,1,"This is test record 1!"],[2,1,"test record 2."],[4,1,"test record four."],[3,2,"test test record three."],[9,2,"test test record nine."],[8,2,"test test record eight."],[7,3,"test test test record seven."],[5,3,"test test test record five."],[6,4,"test test test test record six."]]]] .ft P .fi .sp ソートするカラム名を複数指定したい場合は、カンマ(,)区切りで指定します。複数のカラムを指定した場合、最初のカラムで同一の値のレコードがあった場合に、次のカラムの値でソートさせることができます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-query title:@test \-\-output_columns _id,_score,title \-\-sortby _score,_id [[0,1308820936.3086,0.000588846],[[[9],[["_id","UInt32"],["_score","Int32"],["title","ShortText"]],[1,1,"This is test record 1!"],[2,1,"test record 2."],[4,1,"test record four."],[3,2,"test test record three."],[8,2,"test test record eight."],[9,2,"test test record nine."],[5,3,"test test test record five."],[7,3,"test test test record seven."],[6,4,"test test test test record six."]]]] .ft P .fi 脚注 .IP [1] 5 . 現在のバージョンでは、全文検索インデックスが存在する場合にのみ、match_columnsパラメータを利用することができます。通常のカラムでの絞り込みには利用できません。 .SS ネットワークを通じた利用 .sp groongaはネットワークを通じて利用することができます。groonga独自プロトコルもしくはHTTPのどちらかを選択してgroongaを起動することにより、groongaはネットワーク接続を待ち受けます。 .SS groonga専用プロトコルによる通信 .SS groongaデーモンの起動 .sp 書式 .sp .nf .ft C groonga [\-p ポート番号] \-d DBパス名 .ft P .fi .sp 既存のデータベースのフルパス名をDBパス名に指定します。 groongaがデーモンモードで起動し、指定したポート番号でgroongaの専用プロトコルを用いた通信をすることができます。 (ポート番号を省略した場合は10041が使用されます) .sp 実行例: .sp .nf .ft C % groonga \-d /tmp/tutorial.db 12345 % .ft P .fi .sp デーモンモードで起動後、プロセス番号が表示されます。 .SS groongaサーバへの接続 .sp 書式 .sp .nf .ft C groonga [\-p ポート番号] \-c [対象ホスト名またはIPアドレス] .ft P .fi .sp 対象ホストで動作しているgroongaサーバに接続します。 .sp 対象ホスト名を省略した場合はlocalhostに対して接続し、対象ポート番号を省略した場合は10041ポートに対して接続します。 .sp 接続に成功すると対話モードに入り、標準入力からコマンドを読み込んで順次実行します。 .sp 実行例 .sp .nf .ft C % groonga \-c > status [[0,1308820928.88213,4.1937e\-05],{"alloc_count":548,"starttime":1308820641,"uptime":287,"version":"1.2.2\-104\-gf48051d","n_queries":375,"cache_hit_rate":0.533333333333333,"command_version":1,"default_command_version":1,"max_command_version":2}] > ctrl\-d % .ft P .fi .SS groongaデーモンの終了 .sp groongaデーモンにshutdownコマンドを発行することにより、終了させることができます。 .sp 実行例 .sp .nf .ft C % groonga \-c > shutdown % .ft P .fi .SS HTTPによる通信 .sp groongaをHTTP経由で利用したい場合には、HTTPプロトコルモードで起動します。 .sp 書式 .sp .nf .ft C groonga [\-p ポート番号] \-d \-\-protocol http DBパス名 .ft P .fi .sp protocolオプションで、groongaが受け付けるプロトコルを指定できます。httpを指定すると、groongaはHTTPプロトコルでの通信を受け付けます。 .SS HTML管理ツール .sp コマンド実行後、http://[IPアドレスまたはホスト名]:[ポート番号]/ というURLにブラウザからアクセスすると、HTML管理ツールが表示されます。ブラウザは、JavaScriptの実行が有効になっている必要があります。 .SS HTTPでのコマンド実行 .sp groongaがHTTPプロトコルモードで起動されているとき、「/d/コマンド名」というURLにアクセスすると、コマンドを実行することが出来ます。 .sp コマンドのオプションは、HTTPのGETパラメータで渡します。つまり、「?オプション=値&オプション=値 …」という書式になります。 .sp 実行例 .sp .nf .ft C http://[IPまたはホスト名]:[ポート番号]/d/status 実行される処理: > status [[0,1308820929.085,4.9675e\-05],{"alloc_count":548,"starttime":1308820641,"uptime":288,"version":"1.2.2\-104\-gf48051d","n_queries":375,"cache_hit_rate":0.533333333333333,"command_version":1,"default_command_version":1,"max_command_version":2}] http://[IPまたはホスト名]:[ポート番号]/d/select?table=Site&query=title:@this 実行される処理: > select \-\-table Site \-\-query title:@this [[0,1308820929.28709,6.8668e\-05],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]] .ft P .fi .SS セキュリティ .sp groongaのネットワークサービスにはは認証機能がありません。誰でもデータベースの内容を閲覧・修正することができます。iptablesなどを用いて、アクセス元IPアドレスを制限することを薦めます。 .SS さまざまな種類をもったデータの保存 .sp groongaでは、さまざまなデータを格納させることが出来ます。 .SS データ型 .sp groongaでは、数値(整数・小数)や文字列や時刻や経緯度などの情報を格納することができます。 .sp ここでは、Int32型のカラムに整数を格納、Float型のカラムに浮動小数点の小数を、ShortText型のカラムに文字列を、Time型のカラムに時間を格納する例を示します。経緯度の格納については、のちのチュートリアルで触れます。 .sp その他のデータ型の一覧は、 \fB../type\fP を参照してください。 .sp 実行例 .sp .nf .ft C > table_create \-\-name Type \-\-flags TABLE_HASH_KEY \-\-key_type ShortText [[0,1308820985.62521,0.057448585],true] > column_create \-\-table Type \-\-name number \-\-type Int32 [[0,1308820985.88435,0.0506424],true] > column_create \-\-table Type \-\-name float \-\-type Float [[0,1308820986.13667,0.06274076],true] > column_create \-\-table Type \-\-name string \-\-type ShortText > column_create \-\-table Type \-\-name time \-\-type Time [[0,1308820986.40111,0.207566663],true] [[0,1308820986.60872,0.060231324],true] > load \-\-table Type > [{"_key":"sample","number":12345,"float":42.195,"string":"GROONGA","time":1234567890.12}] [[0,1308820986.87067,0.202168318],1] > select \-\-table Type [[0,1308820987.27451,0.000171948],[[[1],[["_id","UInt32"],["_key","ShortText"],["time","Time"],["string","ShortText"],["number","Int32"],["float","Float"]],[1,"sample",1234567890.12,"GROONGA",12345,42.195]]]] .ft P .fi .SS テーブル型 .sp table_createで作成したテーブルを、カラムの型として使うことが出来ます。 .sp また、output_columnsにおいて「.」を区切りとして、参照先のテーブルに存在するカラムを指定すると、指定したカラムの値を表示することができます。 .sp ここでは、先のチュートリアルで作成したSiteテーブルに手を加え、どのサイトをリンクしているのかを保存してみましょう。 .sp 他のテーブルを参照するカラムにデータを入力する場合には、参照先のテーブルの_keyカラムの値を代入する必要があります。 .sp 実行例 .sp .nf .ft C > column_create \-\-table Site \-\-name link \-\-type Site [[0,1308820987.47796,0.067493639],true] > load \-\-table Site > [{"_key":"http://example.org/","link":"http://example.net/"}] [[0,1308820987.74711,0.201407365],1] > select \-\-table Site \-\-output_columns _key,title,link._key,link.title \-\-query title:@this [[0,1308820988.15016,0.000502207],[[[1],[["_key","ShortText"],["title","ShortText"],["link._key","ShortText"],["link.title","ShortText"]],["http://example.org/","This is test record 1!","http://example.net/","test record 2."]]]] .ft P .fi .sp このように、linkカラムに他のサイトへの参照を保存することができました。また、参照先の_keyとtitleカラムの内容を表示することができました。 .SS ベクターカラム .sp column_createコマンドでカラムを作成するとき、\-\-flagsオプションでCOLUMN_VECTORフラグを指定すると、複数の値を配列で格納できるカラムが作成されます。 .sp テーブル型で配列を格納するカラムは、1対多の参照関係を表すのに有効です。 .sp テーブル型のチュートリアルでは、Siteテーブルに手を加え、どのサイトをリンクしているのかを保存しました。しかし、通常は1つのサイトから多くのサイトにリンクが張られています。複数のリンク情報を格納するために、複数の参照関係を保存するカラムを作成してみましょう。 .sp 他のテーブルを参照するベクターカラムにデータを入力する場合には、参照先のテーブルの_keyカラムの値の「配列」を代入する必要があります。 .sp 実行例 .sp .nf .ft C > column_create \-\-table Site \-\-name links \-\-flags COLUMN_VECTOR \-\-type Site [[0,1308820988.35428,0.055857261],true] > load \-\-table Site > [{"_key":"http://example.org/","links":["http://example.net/","http://example.org/","http://example.com/"]}] [[0,1308820988.61189,0.20152687],1] > select \-\-table Site \-\-output_columns _key,title,links._key,links.title \-\-query title:@this [[0,1308820989.01506,0.000477611],[[[1],[["_key","ShortText"],["title","ShortText"],["links._key","ShortText"],["links.title","ShortText"]],["http://example.org/","This is test record 1!",["http://example.net/","http://example.org/","http://example.com/"],["test record 2.","This is test record 1!","test test record three."]]]]] .ft P .fi .sp このように、複数の参照関係が保存できました。また、output_columnsによって、複数の参照先のカラム値も表示させることができました。 .SS さまざまな検索条件の指定 .sp groongaは、JavaScriptに似た文法での条件絞込や、計算した値を用いたソートを行うことができます。また、位置情報(緯度・経度)を用いた絞込・ソートを行うことができます。 .SS JavaScriptに似た文法での絞込・全文検索 .sp selectコマンドのfilterパラメータは、queryパラメータと同様に、レコードの検索条件を指定します。filterパラメータとqueryパラメータが異なる点は、filterパラメータには、JavaScriptの式に似た文法で条件を指定する点です。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-filter "_id <= 1" \-\-output_columns _id,_key [[0,1308820947.12902,0.000234772],[[[1],[["_id","UInt32"],["_key","ShortText"]],[1,"http://example.org/"]]]] .ft P .fi .sp ここで、filterパラメータには .INDENT 0.0 .INDENT 3.5 .sp _id <= 1 .UNINDENT .UNINDENT .sp という条件を指定しています。この場合は_idの値が1以下のレコードが検索結果として得られます。 .sp また、&& や || を使って、条件のAND・OR指定をすることもできます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-filter "_id >= 4 && _id <= 6" \-\-output_columns _id,_key [[0,1308820947.331,0.000465292],[[[3],[["_id","UInt32"],["_key","ShortText"]],[4,"http://example.net/afr"],[5,"http://example.org/aba"],[6,"http://example.com/rab"]]]] > select \-\-table Site \-\-filter "_id <= 2 || _id >= 7" \-\-output_columns _id,_key [[0,1308820947.5341,0.00048586],[[[5],[["_id","UInt32"],["_key","ShortText"]],[1,"http://example.org/"],[2,"http://example.net/"],[7,"http://example.net/atv"],[8,"http://example.org/gat"],[9,"http://example.com/vdw"]]]] .ft P .fi .sp queryパラメータとfilterパラメータを同時に指定すると、両者の条件をともに満たすレコードが結果として返ります。 .SS scorerを利用したソート .sp selectコマンドのscorerパラメータは、 全文検索を行った結果の各レコードに対して処理を行うためのパラメータです。 .sp filterパラメータと同様に、 JavaScriptの式に似たな文法で様々な条件を指定することができます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-filter "1" \-\-scorer "_score = rand()" \-\-output_columns _id,_key,_score \-\-sortby _score [[0,1308820947.7379,0.000649717],[[[9],[["_id","UInt32"],["_key","ShortText"],["_score","Int32"]],[9,"http://example.com/vdw",327254586],[6,"http://example.com/rab",498777856],[8,"http://example.org/gat",524872353],[5,"http://example.org/aba",631704567],[4,"http://example.net/afr",791698927],[2,"http://example.net/",822890675],[7,"http://example.net/atv",1255179497],[1,"http://example.org/",1469834481],[3,"http://example.com/",1610120709]]]] > select \-\-table Site \-\-filter "1" \-\-scorer "_score = rand()" \-\-output_columns _id,_key,_score \-\-sortby _score [[0,1308820947.94322,0.000598748],[[[9],[["_id","UInt32"],["_key","ShortText"],["_score","Int32"]],[8,"http://example.org/gat",112805732],[6,"http://example.com/rab",160051528],[2,"http://example.net/",269455306],[4,"http://example.net/afr",352406219],[9,"http://example.com/vdw",1120048829],[1,"http://example.org/",1572276965],[5,"http://example.org/aba",1600028624],[3,"http://example.com/",1703964683],[7,"http://example.net/atv",2040332871]]]] .ft P .fi .sp 検索結果には、\(aq_score\(aqという名前の、全文検索のスコアが代入されている仮想的なカラムが付与されることをチュートリアル中ソートの項目で説明しました。 .sp 上記の実行例では、scorerパラメータに .INDENT 0.0 .INDENT 3.5 .sp _score = rand() .UNINDENT .UNINDENT .sp という条件を指定しています。ここでは、rand()という乱数を返す関数を用いて、全文検索のスコアを乱数で上書きしています。 .sp sortbyパラメータには、 .INDENT 0.0 .INDENT 3.5 .sp _score .UNINDENT .UNINDENT .sp を指定しています。これは、スコア順に昇順にソートすることを意味しています。 .sp よって、上記のクエリは実行されるたびに検索結果の並び順がランダムに変わります。 .SS 位置情報を用いた絞込・ソート .sp groongaでは、位置情報(経緯度)を保存することができます。また、保存した経緯度を用いて絞込やソートができます。 .sp 位置情報を保存するためのカラムの型として、TokyoGeoPoint/WGS84GeoPointの2つの型があります。前者は日本測地系、後者は世界測地系(WGS84相当)の経緯度を保存します。 .sp 経緯度をデータを入力するためには、"緯度のミリ秒x経度のミリ秒"という形式の文字列を代入する必要があります。 .sp ここでは、ためしに東京駅と新宿駅とついて、世界測地系での位置情報を保存してみましょう。東京駅は緯度が35度40分52.975秒、経度が139度45分57.902秒です。新宿駅は緯度が35度41分27.316秒、経度が139度42分0.929秒です。よって、代入する文字列はそれぞれ"128452975x503157902"/"128487316x502920929"となります。 .sp 実行例 .sp .nf .ft C > column_create \-\-table Site \-\-name location \-\-type WGS84GeoPoint [[0,1308820948.149,0.106673308],true] > load \-\-table Site > [ > {"_key":"http://example.org/","location":"128452975x503157902"} > {"_key":"http://example.net/","location":"128487316x502920929"}, > ] [[0,1308820948.45731,0.804828624],2] > select \-\-table Site \-\-query "_id:1 OR _id:2" \-\-output_columns _key,location [[0,1308820949.46367,0.000415883],[[[2],[["_key","ShortText"],["location","WGS84GeoPoint"]],["http://example.org/","128452975x503157902"],["http://example.net/","128487316x502920929"]]]] .ft P .fi .sp scorerパラメータにおいて、 \fB../functions/geo_distance\fP 関数を用いることにより、2点間の距離を計算することができます。 .sp ここでは、秋葉原駅からの距離を表示させてみましょう。世界測地系では、秋葉原駅の位置は緯度が35度41分55.259秒、経度が139度46分27.188秒です。よって、geo_distance関数に与える文字列は"128515259x503187188"となります。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-query "_id:1 OR _id:2" \-\-output_columns _key,location,_score \-\-scorer \(aq_score = geo_distance(location, "128515259x503187188")\(aq [[0,1308820949.66719,0.000579851],[[[2],[["_key","ShortText"],["location","WGS84GeoPoint"],["_score","Int32"]],["http://example.org/","128452975x503157902",2054],["http://example.net/","128487316x502920929",6720]]]] .ft P .fi .sp この結果を見ると、東京駅と秋葉原駅は2054m、秋葉原駅と新宿駅は6720m離れているようです。 .sp geo_distance関数は、_scoreを通じてソートでも用いることができます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-query "_id:1 OR _id:2" \-\-output_columns _key,location,_score \-\-scorer \(aq_score = geo_distance(location, "128515259x503187188")\(aq \-\-sortby \-_score [[0,1308820949.87105,0.00059959],[[[2],[["_key","ShortText"],["location","WGS84GeoPoint"],["_score","Int32"]],["http://example.net/","128487316x502920929",6720],["http://example.org/","128452975x503157902",2054]]]] .ft P .fi .sp 「ある地点から何m以内に存在する」といった絞込も可能です。 .sp filterパラメータにおいて、 \fB../functions/geo_in_circle\fP 関数を用いることにより、2点間の距離が指定のm以下におさまるかどうかを判定することができます。 .sp たとえば、秋葉原駅から5000m以内にあるレコードを検索してみましょう。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-output_columns _key,location \-\-filter \(aqgeo_in_circle(location, "128515259x503187188", 5000)\(aq [[0,1308820950.07638,0.000388003],[[[1],[["_key","ShortText"],["location","WGS84GeoPoint"]],["http://example.org/","128452975x503157902"]]]] .ft P .fi .sp また、経緯度が指定の矩形領域内であるかどうかを判定する \fB../functions/geo_in_rectangle\fP 関数も存在します。 .SS ドリルダウン .sp groongaでは、特定のカラム値で検索結果をグループ化することができます。これをドリルダウンと呼びます。 .sp Siteテーブルに2つのカラムを追加します。TLDドメイン名を格納するdomainカラムと、国名を格納するcountryカラムです。これらのカラムの型は、それぞれドメイン名を主キーとするSiteDomainテーブルと、国名を主キーとするSiteCountryテーブルとします。 .sp 実行例 .sp .nf .ft C > table_create \-\-name SiteDomain \-\-flags TABLE_HASH_KEY \-\-key_type ShortText [[0,1308821014.79373,0.08400713],true] > table_create \-\-name SiteCountry \-\-flags TABLE_HASH_KEY \-\-key_type ShortText [[0,1308821015.07862,0.039604105],true] > column_create \-\-table Site \-\-name domain \-\-flags COLUMN_SCALAR \-\-type SiteDomain [[0,1308821015.31978,0.038851776],true] > column_create \-\-table Site \-\-name country \-\-flags COLUMN_SCALAR \-\-type SiteCountry [[0,1308821015.56016,0.038916093],true] > load \-\-table Site > [ > {"_key":"http://example.org/","domain":".org","country":"japan"}, > {"_key":"http://example.net/","domain":".net","country":"brazil"}, > {"_key":"http://example.com/","domain":".com","country":"japan"}, > {"_key":"http://example.net/afr","domain":".net","country":"usa"}, > {"_key":"http://example.org/aba","domain":".org","country":"korea"}, > {"_key":"http://example.com/rab","domain":".com","country":"china"}, > {"_key":"http://example.net/atv","domain":".net","country":"china"}, > {"_key":"http://example.org/gat","domain":".org","country":"usa"}, > {"_key":"http://example.com/vdw","domain":".com","country":"japan"} > ] [[0,1308821015.80061,2.21225519],9] .ft P .fi .sp domainカラムとcountryカラムでドリルダウンを行う例を以下に示します。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-limit 0 \-\-drilldown domain [[0,1308821018.21592,0.000324538],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["location","WGS84GeoPoint"],["links","Site"],["link","Site"],["domain","SiteDomain"],["country","SiteCountry"]]],[[3],[["_key","ShortText"],["_nsubrecs","Int32"]],[".org",3],[".net",3],[".com",3]]]] .ft P .fi .sp テーブル型を持つカラムに対してドリルダウンを行った場合、参照先のテーブルに存在するカラム値を取得することもできます。ドリルダウンを行ったテーブルには、_nsubrecsという仮想的なカラムが追加されます。このカラムには、グループ化されたレコード数が入ります。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-limit 0 \-\-drilldown domain \-\-drilldown_output_columns _id,_key,_nsubrecs [[0,1308821018.42021,0.000313807],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["location","WGS84GeoPoint"],["links","Site"],["link","Site"],["domain","SiteDomain"],["country","SiteCountry"]]],[[3],[["_id","UInt32"],["_key","ShortText"],["_nsubrecs","Int32"]],[1,".org",3],[2,".net",3],[3,".com",3]]]] .ft P .fi .sp 複数のカラムに対してドリルダウンを行うことができます。複数のカラムに対してドリルダウンを行う場合には、drilldownパラメータにカラム名をカンマ区切りで与えます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-limit 0 \-\-drilldown domain,country [[0,1308821018.62463,0.00042405],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["location","WGS84GeoPoint"],["links","Site"],["link","Site"],["domain","SiteDomain"],["country","SiteCountry"]]],[[3],[["_key","ShortText"],["_nsubrecs","Int32"]],[".org",3],[".net",3],[".com",3]],[[5],[["_key","ShortText"],["_nsubrecs","Int32"]],["japan",3],["brazil",1],["usa",2],["korea",1],["china",2]]]] .ft P .fi .sp ドリルダウン結果を並びかえることができます。例えば、_nsubrecsパラメータの降順で並び替えることができます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-limit 0 \-\-drilldown country \-\-drilldown_sortby _nsubrecs [[0,1308821018.83002,0.000406563],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["location","WGS84GeoPoint"],["links","Site"],["link","Site"],["domain","SiteDomain"],["country","SiteCountry"]]],[[5],[["_key","ShortText"],["_nsubrecs","Int32"]],["brazil",1],["korea",1],["usa",2],["china",2],["japan",3]]]] .ft P .fi .sp ドリルダウン結果は、デフォルトでは10件のみ表示されます。drilldown_offsetパラメータと、drilldown_limitパラメータによって、offsetとlimitを指定することができます。 .sp 実行例 .sp .nf .ft C > select \-\-table Site \-\-limit 0 \-\-drilldown country \-\-drilldown_sortby _nsubrecs \-\-drilldown_limit 2 \-\-drilldown_offset 2 [[0,1308821019.03466,0.000365367],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["location","WGS84GeoPoint"],["links","Site"],["link","Site"],["domain","SiteDomain"],["country","SiteCountry"]]],[[5],[["_key","ShortText"],["_nsubrecs","Int32"]],["usa",2],["china",2]]]] .ft P .fi .sp 文字列型のカラムに対するドリルダウンは、他の型でのドリルダウンに比べて低速です。文字列でのドリルダウンを行いたい場合には、このチュートリアルのように、文字列型を主キーとするテーブルを別途作成し、そのテーブルを型とするカラムを作成します。 .SS タグ検索・参照関係の逆引き .sp 本チュートリアルで、groongaはカラム値として他のテーブルへの参照の配列を持つことができることを紹介いたしました。実は、テーブルへの参照の配列データを用いることによって、いわゆるタグ検索を行うことが可能となります。 .sp タグ検索はgroongaの転置インデックスというデータ構造を用いて高速に行われます。 .SS タグ検索 .sp 動画共有サイトの検索エンジンを作ることを想定します。1つの動画には、その動画の特徴を表す、複数の語句が付与されています。「ある語句が付与されている動画の一覧を取得する」検索を行いたいとします。 .sp 実際に、動画情報のテーブルを作成し、検索をしてみましょう。 .sp 動画の情報を保存する、Videoテーブルを作成します。Videoテーブルでは、動画のタイトルをtitleカラムに、動画のタグ情報をtagsカラムにTagテーブル型で複数格納しています。 タグの情報を保存する、Tagテーブルを作成します。Tagテーブルでは、タグ文字列を主キーに格納し、Videoテーブルのtagsカラムに対するインデックスをindex_tagsカラムに格納しています。 .sp 実行例 .sp .nf .ft C > table_create \-\-name Video \-\-flags TABLE_HASH_KEY \-\-key_type UInt32 [[\-22,1308820912.80154,0.000455314,"already used name was assigned: