.\" Man page generated from reStructuredText. . .TH "GROONGA" "1" "2015 年 10 月 28 日" "5.0.9" "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 .. .INDENT 0.0 .IP \(bu 2 \fBnews\fP .UNINDENT .SH GROONGAの特徴 .SS Groonga の概要 .sp Groonga は転置索引を用いた高速・高精度な全文検索エンジンであり、登録された文書をすぐに検索結果に反映できます。また、参照をブロックせずに更新できることから、即時更新の必要なアプリケーションにおいても高い性能を発揮します。 .sp 全文検索エンジンとして開発された Groonga ですが、独自のカラムストアを持つ列指向のデータベースとしての側面も持っています。そのため、MySQL や PostgreSQL など、既存の代表的なデータベースが苦手とする集計クエリを高速に処理できるという特徴があり、組み合わせによって弱点を補うような使い方もできます。 .sp Groonga の基本機能は C ライブラリとして提供されていますが、MySQL や PostgreSQL と連携させたり、Ruby から呼び出したりすることもできます。そのため、任意のアプリケーションに組み込むことが可能であり、多様な使い方が考えられます。 興味のある方は \fI\%利用例\fP をご覧ください。 .SS 全文検索と即時更新 .sp 一般的なデータベースにおいては、追加・削除などの操作がすぐに反映されます。一方、全文検索においては、転置索引が逐次更新の難しいデータ構造であることから、文書の追加・削除に対応しないエンジンが少なくありません。 .sp これに対し、転置索引を用いた全文検索エンジンでありながら、Groonga は文書を短時間で追加・削除することができます。その上、更新しながらでも検索できるという優れた特徴を持っているため、全文検索エンジンとしてはとても柔軟性があります。また、複数の転置索引を統合するような重い処理を必要としないので、安定して高い性能を発揮することが期待できます。 .SS カラムストアと集計クエリ .sp 現代は、インターネットを情報源とすれば、いくらでも情報を収集できる時代です。しかし、膨大な情報から有益な情報を引き出すのは困難であり、多面的な分析による試行錯誤が必要となります。たとえば、日付や時間帯により絞り込んでみたり、地域により絞り込んでみたり、性別や年齢により絞り込んでみたりすることでしょう。そして、そのようなときに便利な存在が集計クエリです。 .sp 集計クエリとは、指定したカラムの値によってレコードをグループ化し、各グループに含まれるレコードの数を求めるクエリです。たとえば、地域の ID を格納しているカラムを指定すれば、地域毎のレコード数が求まります。日付のカラムを指定したときの出力をグラフ化すれば、レコード数の時間変化を視覚化することができます。さらに、地域による絞り込みと日付に対する集計クエリを組み合わせれば、特定の地域におけるレコード数の時間変化を視覚化ことも可能です。このように、尺度を自由に選択して絞り込み・集計できることは、膨大な情報を扱う上でとても重要になります。 .sp Groonga が集計クエリを高速に処理できる理由は、データベースの論理構造にカラムストアを採用しているからです。集計クエリが参照するのは指定されたカラムのみであるため、カラム単位でデータを格納する列指向のデータベースでは、必要なカラムのみを無駄なく読み出せることが利点となります。一方、レコード単位でデータを格納する行指向のデータベースでは、隣接するカラムをまとめて読み出してしまうことが欠点となります。 .SS 転置索引とトークナイザ .sp 転置索引は大規模な全文検索に用いられる伝統的なデータ構造です。転置索引を用いた全文検索エンジンでは、文書を追加するときに索引語を記録しておき、検索するときはクエリを索引語に分割して出現文書を求めます。そのため、文書やクエリから索引語を抜き出す方法が重要になります。 .sp トークナイザは、文字列から索引語を抜き出すモジュールです。日本語を対象とする全文検索においては、形態素を索引語として抜き出す方式と文字 N\-gram を抜き出す方式のいずれか、あるいは両方を用いるのが一般的です。形態素方式は検索時間や索引サイズの面で優れているほか、検索結果に不要な文書が含まれにくいという利点を持っています。一方、N\-gram 方式には検索漏れが発生しにくいという利点があり、状況によって適した方式を選択することが望ましいとされています。 .sp Groonga は形態素方式と N\-gram 方式の両方に対応しています。初期状態で利用できるトークナイザは空白を区切り文字として用いる方式と N\-gram 方式のみですが、形態素解析器 MeCab を組み込んだときは MeCab による分かち書きの結果を用いる形態素方式が有効になります。トークナイザはプラグインとして追加できるため、特徴的なキーワードのみを索引語として採用するなど、独自のトークナイザを開発することが可能です。 .SS 共有可能なストレージと参照ロックフリー .sp CPU のマルチコア化が進んでいるため、同時に複数のクエリを実行したり、一つのクエリを複数のスレッドで実行したりすることの重要性はますます高まっています。 .sp Groonga のストレージは、複数のスレッド・プロセスで共有することができます。また、参照ロックフリーなデータ構造を採用しているため、更新クエリを実行している状況でも参照クエリを実行することができます。参照クエリを実行できる状態を維持しながら更新クエリを実行できるので、リアルタイムなシステムに適しています。さらには、MySQL を介して更新クエリを実行している最中に Groonga の HTTP サーバを介して参照クエリを実行するなど、多彩な運用が可能となっています。 .SS 位置情報(緯度・経度)検索 .sp GPS に代表される測位システムを搭載した高機能な携帯端末の普及などによって、位置情報を扱うサービスはますます便利になっています。たとえば、近くにあるレストランを探しているときは、現在地からの距離を基準として検索をおこない、検索結果を地図上に表示してくれるようなサービスが便利です。そのため、位置情報検索を高速に実現できることが重要になっています。 .sp Groonga では転置索引を応用して高速な位置情報検索を実現しています。矩形・円による範囲検索に対応しているほか、基準点の近くを優先的に探索させることができます。また、距離計算をサポートしているので、位置情報検索の結果を基準点からの距離によって整列することも可能です。 .SS Groonga ライブラリ .sp Groonga の基本機能は C ライブラリとして提供されているので、任意のアプリケーションに組み込んで利用することができます。C/C++ 以外については、Ruby から Groonga を利用するライブラリなどが関連プロジェクトにおいて提供されています。詳しくは \fI\%関連プロジェクト\fP を参照してください。 .SS Groonga サーバ .sp Groonga にはサーバ機能があるため、レンタルサーバなどの新しいライブラリをインストールできない環境においても利用できます。対応しているのは HTTP、memcached binary プロトコル、およびGroongaの独自プロトコルであるGroonga Query Transfer Protocol( \fB/spec/gqtp\fP )です。サーバとして利用するときはクエリのキャッシュ機能が有効になるため、同じクエリを受け取ったときは応答時間が短くなるという特徴があります。 .SS Mroonga ストレージエンジン .sp Groonga は独自のカラムストアを持つ列指向のデータベースとしての側面を持っていますが、既存の RDBMS のストレージエンジンとして利用することもできます。たとえば、Groonga をベースとする MySQL のストレージエンジンとして \fI\%Mroonga\fP が開発されています。Mroonga は MySQL のプラグインとして動的にロードすることが可能であり、Groonga のカラムストアをストレージとして利用したり、全文検索エンジンとして Groonga を MyISAM や InnoDB と連携させたりすることができます。Groonga 単体での利用、および MyISAM, InnoDB との連携には一長一短があるので、用途に応じて適切な組み合わせを選ぶことが大切です。詳しくは \fI\%関連プロジェクト\fP を参照してください。 .SH インストール .sp このセクションではGroongaのインストール方法を環境毎に説明します。主要なプラットフォームにはパッケージがあります。自分でGroongaをビルドするよりもパッケージを使うことを推奨します。しかし、心配しないでください。ソースからGroongaをビルドするためのドキュメントもあります。 .sp 32\-bit用と64\-bit用のパッケージを配布していますが、サーバ用途には64\-bitパッケージを利用することをオススメします。32\-bit用パッケージはテスト用か開発用にだけ使って下さい。32\-bit用パッケージを使った場合は、中程度のサイズのデータでもメモリ不足エラーになることがあります。 .SS Windows .sp このセクションではWindows上でGroongaをインストールする方法を説明します。Groongaをインストールするにはzipパッケージを展開する方法とインストーラーを実行する方法があります。 .sp 32\-bit用と64\-bit用のパッケージを配布していますが、サーバ用途には64\-bitパッケージを利用することをオススメします。32\-bit用パッケージはテスト用か開発用にだけ使って下さい。32\-bit用パッケージを使った場合は、中程度のサイズのデータでもメモリ不足エラーになることがあります。 .SS インストーラー .sp 32\-bit環境の場合は、x86のバイナリをpackages.groonga.orgからダウンロードしてください。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%http://packages.groonga.org/windows/groonga/groonga\-5.0.9\-x86.exe\fP .UNINDENT .UNINDENT .UNINDENT .sp その後、バイナリを実行します。 .sp 64\-bit環境の場合は、x64のバイナリをpackages.groonga.orgからダウンロードしてください。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%http://packages.groonga.org/windows/groonga/groonga\-5.0.9\-x64.exe\fP .UNINDENT .UNINDENT .UNINDENT .sp その後、バイナリを実行します。 .sp スタートメニュー内にあるコマンドプロンプトを使って \fB/reference/executables/groonga\fP を起動してください。 .SS zip .sp 32\-bit環境の場合は、x86のzipアーカイブをpackages.groonga.orgからダウンロードしてください。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%http://packages.groonga.org/windows/groonga/groonga\-5.0.9\-x86.zip\fP .UNINDENT .UNINDENT .UNINDENT .sp その後、アーカイブを展開します。 .sp 64\-bit環境の場合は、x64のzipアーカイブをpackages.groonga.orgからダウンロードしてください。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%http://packages.groonga.org/windows/groonga/groonga\-5.0.9\-x64.zip\fP .UNINDENT .UNINDENT .UNINDENT .sp その後、アーカイブを展開します。 .sp \fBbin\fP フォルダーに \fB/reference/executables/groonga\fP があるのでそれを起動してください。 .SS ソースからビルド .sp まずWindows上でGroongaをビルドするために必須のツールをインストールします。以下が必須のツールです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%Microsoft Visual Studio Express 2013 for Windows Desktop\fP .IP \(bu 2 \fI\%CMake\fP .UNINDENT .UNINDENT .UNINDENT .sp zipアーカイブをpackages.groonga.orgからダウンロードしてください。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%http://packages.groonga.org/source/groonga/groonga\-5.0.9.zip\fP .UNINDENT .UNINDENT .UNINDENT .sp その後、アーカイブを展開します。 .sp Groongaのソースフォルダへと移動します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > cd c:\eUsers\e%USERNAME%\eDownloads\egroonga\-5.0.9 .ft P .fi .UNINDENT .UNINDENT .sp \fBcmake\fP でビルドオプションを設定します。以下のコマンドラインは64\-bit用のGroongaをビルドするためのものです。32\-bit用のGroongaをビルドする場合は代わりに \fB\-G "Visual Studio 12 2013"\fP パラメーターを指定してください: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga\-5.0.9> cmake . \-G "Visual Studio 12 2013 Win64" \-DCMAKE_INSTALL_PREFIX=C:\eGroonga .ft P .fi .UNINDENT .UNINDENT .sp ビルド: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga\-5.0.9> cmake \-\-build . \-\-config Release .ft P .fi .UNINDENT .UNINDENT .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga\-5.0.9> cmake \-\-build . \-\-config Release \-\-target Install .ft P .fi .UNINDENT .UNINDENT .sp 以上の手順で \fB/reference/executables/groonga\fP が \fBc:\eGroonga\ebin\egroonga.exe\fP にインストールされます。 .SS Mac OS X .sp このセクションではMac OS X上でGroongaをインストールする方法を説明します。 \fI\%MacPorts\fP か \fI\%Homebrew\fP を使ってインストールできます。 .SS MacPorts .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo port install groonga .ft P .fi .UNINDENT .UNINDENT .SS Homebrew .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % brew install groonga .ft P .fi .UNINDENT .UNINDENT .sp \fI\%MeCab\fP をトークナイザーとして使いたいときは、 \fB\-\-with\-mecab\fP オプションを指定してください。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % brew install groonga \-\-with\-mecab .ft P .fi .UNINDENT .UNINDENT .SS ソースからビルド .sp \fI\%Xcode\fP をインストールしてください。 .sp ソースをダウンロードします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % curl \-O http://packages.groonga.org/source/groonga/groonga\-5.0.9.tar.gz % tar xvzf groonga\-5.0.9.tar.gz % cd groonga\-5.0.9 .ft P .fi .UNINDENT .UNINDENT .sp configureを実行します( \fBconfigure\fP のオプションについては source\-configure を参照してください): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure .ft P .fi .UNINDENT .UNINDENT .sp ビルド: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make \-j$(/usr/sbin/sysctl \-n hw.ncpu) .ft P .fi .UNINDENT .UNINDENT .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo make install .ft P .fi .UNINDENT .UNINDENT .SS Debian GNU/Linux .sp このセクションではDebian GNU/Linux上でGroonga関連のdebパッケージをインストールする方法を説明します。これらのパッケージは \fBapt\fP でインストールできます。 .sp 32\-bit用と64\-bit用のパッケージを配布していますが、サーバ用途には64\-bitパッケージを利用することをオススメします。32\-bit用パッケージはテスト用か開発用にだけ使って下さい。32\-bit用パッケージを使った場合は、中程度のサイズのデータでもメモリ不足エラーになることがあります。 .SS wheezy .sp Groongaのaptリポジトリを追加します。 .sp /etc/apt/sources.list.d/groonga.list: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C deb http://packages.groonga.org/debian/ wheezy main deb\-src http://packages.groonga.org/debian/ wheezy main .ft P .fi .UNINDENT .UNINDENT .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get update % sudo apt\-get install \-y \-\-allow\-unauthenticated groonga\-keyring % sudo apt\-get update % sudo apt\-get install \-y \-V groonga .ft P .fi .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \fBgroonga\fP パッケージは全文検索のための最小構成パッケージです。Groongaをサーバー用途で使うなら、設定済みの追加パッケージをインストールすることができます。 .sp サーバー用途のための2つのパッケージがあります。 .INDENT 0.0 .IP \(bu 2 groonga\-httpd (nginxを元にしたHTTPサーバー) .IP \(bu 2 groonga\-server\-gqtp (GQTPサーバー) .UNINDENT .sp 詳細は \fB/server\fP を参照してください。 .UNINDENT .UNINDENT .sp \fI\%MeCab\fP をトークナイザーとして使いたいときは、groonga\-tokenizer\-mecabパッケージをインストールしてください。 .sp groonga\-tokenizer\-mecabパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get install \-y \-V groonga\-tokenizer\-mecab .ft P .fi .UNINDENT .UNINDENT .sp \fBTokenFilterStem\fP をトークンフィルターとして使いたいときはgroonga\-tokenizer\-filter\-stemパッケージをインストールしてください。 .sp groonga\-token\-filter\-stemパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get install \-y \-V groonga\-token\-filter\-stem .ft P .fi .UNINDENT .UNINDENT .sp \fI\%Munin\fP プラグインを提供するパッケージもあります。MuninでGroongaの状態をモニターしたい場合は、groonga\-munin\-pluginsパッケージをインストールしてください。 .sp groonga\-munin\-pluginsパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get install \-y \-V groonga\-munin\-plugins .ft P .fi .UNINDENT .UNINDENT .sp MySQL互換のノーマライザーをGroongaのプラグインとして提供するパッケージがあります。MySQL互換のノーマライザーを使うには \fBgroonga\-normalizer\-mysql\fP パッケージをインストールしてください。 .sp groonga\-normalizer\-mysqlパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get install \-y \-V groonga\-normalizer\-mysql .ft P .fi .UNINDENT .UNINDENT .SS jessie .sp バージョン 5.0.3 で追加. .sp Groongaのaptリポジトリを追加します。 .sp /etc/apt/sources.list.d/groonga.list: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C deb http://packages.groonga.org/debian/ jessie main deb\-src http://packages.groonga.org/debian/ jessie main .ft P .fi .UNINDENT .UNINDENT .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get update % sudo apt\-get install \-y \-\-allow\-unauthenticated groonga\-keyring % sudo apt\-get update % sudo apt\-get install \-y \-V groonga .ft P .fi .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \fBgroonga\fP パッケージは全文検索のための最小構成パッケージです。Groongaをサーバー用途で使うなら、設定済みの追加パッケージをインストールすることができます。 .sp サーバー用途のための2つのパッケージがあります。 .INDENT 0.0 .IP \(bu 2 groonga\-httpd (nginxを元にしたHTTPサーバー) .IP \(bu 2 groonga\-server\-gqtp (GQTPサーバー) .UNINDENT .sp 詳細は \fB/server\fP を参照してください。 .UNINDENT .UNINDENT .sp \fI\%MeCab\fP をトークナイザーとして使いたいときは、groonga\-tokenizer\-mecabパッケージをインストールしてください。 .sp groonga\-tokenizer\-mecabパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get install \-y \-V groonga\-tokenizer\-mecab .ft P .fi .UNINDENT .UNINDENT .sp \fBTokenFilterStem\fP をトークンフィルターとして使いたいときはgroonga\-tokenizer\-filter\-stemパッケージをインストールしてください。 .sp groonga\-token\-filter\-stemパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get install \-y \-V groonga\-token\-filter\-stem .ft P .fi .UNINDENT .UNINDENT .sp \fI\%Munin\fP プラグインを提供するパッケージもあります。MuninでGroongaの状態をモニターしたい場合は、groonga\-munin\-pluginsパッケージをインストールしてください。 .sp groonga\-munin\-pluginsパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get install \-y \-V groonga\-munin\-plugins .ft P .fi .UNINDENT .UNINDENT .sp MySQL互換のノーマライザーをGroongaのプラグインとして提供するパッケージがあります。MySQL互換のノーマライザーを使うには \fBgroonga\-normalizer\-mysql\fP パッケージをインストールしてください。 .sp groonga\-normalizer\-mysqlパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get install \-y \-V groonga\-normalizer\-mysql .ft P .fi .UNINDENT .UNINDENT .SS ソースからビルド .sp Groongaをビルドするために必要なパッケージをインストールします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get install \-y \-V wget tar build\-essential zlib1g\-dev liblzo2\-dev libmsgpack\-dev libzmq\-dev libevent\-dev libmecab\-dev .ft P .fi .UNINDENT .UNINDENT .sp ソースをダウンロードします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % wget http://packages.groonga.org/source/groonga/groonga\-5.0.9.tar.gz % tar xvzf groonga\-5.0.9.tar.gz % cd groonga\-5.0.9 .ft P .fi .UNINDENT .UNINDENT .sp configureを実行します( \fBconfigure\fP のオプションについては source\-configure を参照してください): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure .ft P .fi .UNINDENT .UNINDENT .sp ビルド: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make \-j$(grep \(aq^processor\(aq /proc/cpuinfo | wc \-l) .ft P .fi .UNINDENT .UNINDENT .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo make install .ft P .fi .UNINDENT .UNINDENT .SS Ubuntu .sp このセクションではUbuntu上でGroonga関連のdebパッケージをインストールする方法を説明します。これらのパッケージは \fBapt\fP でインストールできます。 .sp 32\-bit用と64\-bit用のパッケージを配布していますが、サーバ用途には64\-bitパッケージを利用することをオススメします。32\-bit用パッケージはテスト用か開発用にだけ使って下さい。32\-bit用パッケージを使った場合は、中程度のサイズのデータでもメモリ不足エラーになることがあります。 .SS PPA(Personal Package Archive) .sp Ubuntu用のGroongaのAPTリポジトリーはLaunchpad上のPPA(Personal Package Archive)を使っています。このPPAからAPTでGroongaをインストールできます。 .sp サポートしているUbuntuのバージョンは次の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 12.04 LTS Precise Pangolin .IP \(bu 2 14.04 LTS Trusty Tahr .IP \(bu 2 15.04 Vivid Vervet .UNINDENT .UNINDENT .UNINDENT .sp Groongaをインストールするためにuniverseリポジトリを有効にしてください: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get \-y install software\-properties\-common % sudo add\-apt\-repository \-y universe .ft P .fi .UNINDENT .UNINDENT .sp \fBppa:groonga/ppa\fP PPAをシステムに登録します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo add\-apt\-repository \-y ppa:groonga/ppa % sudo apt\-get update .ft P .fi .UNINDENT .UNINDENT .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get \-y install groonga .ft P .fi .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \fBgroonga\fP パッケージは全文検索のための最小構成パッケージです。Groongaをサーバー用途で使うなら、設定済みの追加パッケージをインストールすることができます。 .sp サーバー用途のための2つのパッケージがあります。 .INDENT 0.0 .IP \(bu 2 groonga\-httpd (nginxを元にしたHTTPサーバー) .IP \(bu 2 groonga\-server\-gqtp (GQTPサーバー) .UNINDENT .sp 詳細は \fB/server\fP を参照してください。 .UNINDENT .UNINDENT .sp \fI\%MeCab\fP をトークナイザーとして使いたいときは、groonga\-tokenizer\-mecabパッケージをインストールしてください。 .sp groonga\-tokenizer\-mecabパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get \-y install groonga\-tokenizer\-mecab .ft P .fi .UNINDENT .UNINDENT .sp \fBTokenFilterStem\fP をトークンフィルターとして使いたいときはgroonga\-tokenizer\-filter\-stemパッケージをインストールしてください。 .sp groonga\-token\-filter\-stemパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get \-y install groonga\-token\-filter\-stem .ft P .fi .UNINDENT .UNINDENT .sp \fI\%Munin\fP プラグインを提供するパッケージもあります。MuninでGroongaの状態をモニターしたい場合は、groonga\-munin\-pluginsパッケージをインストールしてください。 .sp groonga\-munin\-pluginsパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get \-y install groonga\-munin\-plugins .ft P .fi .UNINDENT .UNINDENT .sp MySQL互換のノーマライザーをGroongaのプラグインとして提供するパッケージがあります。MySQL互換のノーマライザーを使うには \fBgroonga\-normalizer\-mysql\fP パッケージをインストールしてください。 .sp groonga\-normalizer\-mysqlパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get \-y install groonga\-normalizer\-mysql .ft P .fi .UNINDENT .UNINDENT .SS ソースからビルド .sp Groongaをビルドするために必要なパッケージをインストールします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get \-V \-y install wget tar build\-essential zlib1g\-dev liblzo2\-dev libmsgpack\-dev libzmq\-dev libevent\-dev libmecab\-dev .ft P .fi .UNINDENT .UNINDENT .sp ソースをダウンロードします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % wget http://packages.groonga.org/source/groonga/groonga\-5.0.9.tar.gz % tar xvzf groonga\-5.0.9.tar.gz % cd groonga\-5.0.9 .ft P .fi .UNINDENT .UNINDENT .sp configureを実行します( \fBconfigure\fP のオプションについては source\-configure を参照してください): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure .ft P .fi .UNINDENT .UNINDENT .sp ビルド: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make \-j$(grep \(aq^processor\(aq /proc/cpuinfo | wc \-l) .ft P .fi .UNINDENT .UNINDENT .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo make install .ft P .fi .UNINDENT .UNINDENT .SS CentOS .sp このセクションではCentOS上でGroonga関連のRPMパッケージをインストールする方法を説明します。これらのパッケージは \fByum\fP でインストールできます。 .sp 32\-bit用と64\-bit用のパッケージを配布していますが、サーバ用途には64\-bitパッケージを利用することをオススメします。32\-bit用パッケージはテスト用か開発用にだけ使って下さい。32\-bit用パッケージを使った場合は、中程度のサイズのデータでもメモリ不足エラーになることがあります。 .SS CentOS 5 .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo rpm \-ivh http://packages.groonga.org/centos/groonga\-release\-1.1.0\-1.noarch.rpm % sudo yum makecache % sudo yum install \-y groonga .ft P .fi .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \fBgroonga\fP パッケージは全文検索のための最小構成パッケージです。Groongaをサーバー用途で使うなら、設定済みの追加パッケージをインストールすることができます。 .sp サーバー用途のための2つのパッケージがあります。 .INDENT 0.0 .IP \(bu 2 groonga\-httpd (nginxを元にしたHTTPサーバー) .IP \(bu 2 groonga\-server\-gqtp (GQTPサーバー) .UNINDENT .sp 詳細は \fB/server\fP を参照してください。 .UNINDENT .UNINDENT .sp \fI\%MeCab\fP をトークナイザーとして使いたいときは、groonga\-tokenizer\-mecabパッケージをインストールしてください。 .sp groonga\-tokenizer\-mecabパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y groonga\-tokenizer\-mecab .ft P .fi .UNINDENT .UNINDENT .sp \fI\%Munin\fP プラグインを提供するパッケージもあります。MuninでGroongaの状態をモニターしたい場合は、groonga\-munin\-pluginsパッケージをインストールしてください。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 groonga\-munin\-pluginsパッケージはmunin\-nodeパッケージを必要としますが、munin\-nodeパッケージはCentOSの公式リポジトリには含まれていません。munin\-nodeパッケージを \fByum\fP でインストールするために \fI\%Repoforge (RPMforge)\fP リポジトリか \fI\%EPEL\fP リポジトリを有効にする必要があります。 .sp i386環境でRepoforge (RPMforge)リポジトリを有効にする: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % wget http://pkgs.repoforge.org/rpmforge\-release/rpmforge\-release\-0.5.3\-1.el5.rf.i386.rpm % sudo rpm \-ivh rpmforge\-release\-0.5.2\-2.el5.rf.i386.rpm .ft P .fi .UNINDENT .UNINDENT .sp x86_64環境でRepoforge (RPMforge)リポジトリを有効にする: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % wget http://pkgs.repoforge.org/rpmforge\-release/rpmforge\-release\-0.5.3\-1.el5.rf.x86_64.rpm % sudo rpm \-ivh rpmforge\-release\-0.5.2\-2.el5.rf.x86_64.rpm .ft P .fi .UNINDENT .UNINDENT .sp EPELリポジトリを有効にする(環境非依存): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % wget http://download.fedoraproject.org/pub/epel/5/i386/epel\-release\-5\-4.noarch.rpm % sudo rpm \-ivh epel\-release\-5\-4.noarch.rpm .ft P .fi .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp groonga\-munin\-pluginsパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y groonga\-munin\-plugins .ft P .fi .UNINDENT .UNINDENT .sp MySQL互換のノーマライザーをGroongaのプラグインとして提供するパッケージがあります。MySQL互換のノーマライザーを使うには \fBgroonga\-normalizer\-mysql\fP パッケージをインストールしてください。 .sp groonga\-normalizer\-mysqlパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y groonga\-normalizer\-mysql .ft P .fi .UNINDENT .UNINDENT .SS CentOS 6 .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo rpm \-ivh http://packages.groonga.org/centos/groonga\-release\-1.1.0\-1.noarch.rpm % sudo yum makecache % sudo yum install \-y groonga .ft P .fi .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \fBgroonga\fP パッケージは全文検索のための最小構成パッケージです。Groongaをサーバー用途で使うなら、設定済みの追加パッケージをインストールすることができます。 .sp サーバー用途のための2つのパッケージがあります。 .INDENT 0.0 .IP \(bu 2 groonga\-httpd (nginxを元にしたHTTPサーバー) .IP \(bu 2 groonga\-server\-gqtp (GQTPサーバー) .UNINDENT .sp 詳細は \fB/server\fP を参照してください。 .UNINDENT .UNINDENT .sp \fI\%MeCab\fP をトークナイザーとして使いたいときは、groonga\-tokenizer\-mecabパッケージをインストールしてください。 .sp groonga\-tokenizer\-mecabパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y groonga\-tokenizer\-mecab .ft P .fi .UNINDENT .UNINDENT .sp \fI\%Munin\fP プラグインを提供するパッケージもあります。MuninでGroongaの状態をモニターしたい場合は、groonga\-munin\-pluginsパッケージをインストールしてください。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 groonga\-munin\-pluginsパッケージはmunin\-nodeパッケージを必要としますが、munin\-nodeパッケージはCentOSの公式リポジトリには含まれていません。munin\-nodeパッケージを \fByum\fP でインストールするために \fI\%EPEL\fP リポジトリを有効にする必要があります。 .sp EPELリポジトリを有効にする(環境非依存): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo rpm \-ivh http://download.fedoraproject.org/pub/epel/6/i386/epel\-release\-6\-8.noarch.rpm .ft P .fi .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp groonga\-munin\-pluginsパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y groonga\-munin\-plugins .ft P .fi .UNINDENT .UNINDENT .sp MySQL互換のノーマライザーをGroongaのプラグインとして提供するパッケージがあります。MySQL互換のノーマライザーを使うには \fBgroonga\-normalizer\-mysql\fP パッケージをインストールしてください。 .sp groonga\-normalizer\-mysqlパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y groonga\-normalizer\-mysql .ft P .fi .UNINDENT .UNINDENT .SS CentOS 7 .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo rpm \-ivh http://packages.groonga.org/centos/groonga\-release\-1.1.0\-1.noarch.rpm % sudo yum makecache % sudo yum install \-y groonga .ft P .fi .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \fBgroonga\fP パッケージは全文検索のための最小構成パッケージです。Groongaをサーバー用途で使うなら、設定済みの追加パッケージをインストールすることができます。 .sp サーバー用途のための2つのパッケージがあります。 .INDENT 0.0 .IP \(bu 2 groonga\-httpd (nginxを元にしたHTTPサーバー) .IP \(bu 2 groonga\-server\-gqtp (GQTPサーバー) .UNINDENT .sp 詳細は \fB/server\fP を参照してください。 .UNINDENT .UNINDENT .sp \fI\%MeCab\fP をトークナイザーとして使いたいときは、groonga\-tokenizer\-mecabパッケージをインストールしてください。 .sp groonga\-tokenizer\-mecabパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y groonga\-tokenizer\-mecab .ft P .fi .UNINDENT .UNINDENT .sp \fI\%Munin\fP プラグインを提供するパッケージもあります。MuninでGroongaの状態をモニターしたい場合は、groonga\-munin\-pluginsパッケージをインストールしてください。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 groonga\-munin\-pluginsパッケージはmunin\-nodeパッケージを必要としますが、munin\-nodeパッケージはCentOSの公式リポジトリには含まれていません。munin\-nodeパッケージを \fByum\fP でインストールするために \fI\%EPEL\fP リポジトリを有効にする必要があります。 .sp EPELリポジトリを有効にする: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y epel\-release .ft P .fi .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp groonga\-munin\-pluginsパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y groonga\-munin\-plugins .ft P .fi .UNINDENT .UNINDENT .sp MySQL互換のノーマライザーをGroongaのプラグインとして提供するパッケージがあります。MySQL互換のノーマライザーを使うには \fBgroonga\-normalizer\-mysql\fP パッケージをインストールしてください。 .sp groonga\-normalizer\-mysqlパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y groonga\-normalizer\-mysql .ft P .fi .UNINDENT .UNINDENT .SS ソースからビルド .sp Groongaをビルドするために必要なパッケージをインストールします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y wget tar gcc\-c++ make mecab\-devel .ft P .fi .UNINDENT .UNINDENT .sp ソースをダウンロードします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % wget http://packages.groonga.org/source/groonga/groonga\-5.0.9.tar.gz % tar xvzf groonga\-5.0.9.tar.gz % cd groonga\-5.0.9 .ft P .fi .UNINDENT .UNINDENT .sp configureを実行します( \fBconfigure\fP のオプションについては source\-configure を参照してください): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure .ft P .fi .UNINDENT .UNINDENT .sp ビルド: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make \-j$(grep \(aq^processor\(aq /proc/cpuinfo | wc \-l) .ft P .fi .UNINDENT .UNINDENT .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo make install .ft P .fi .UNINDENT .UNINDENT .SS Fedora .sp このセクションではFedora上でGroonga関連のRPMパッケージをインストールする方法を説明します。これらのパッケージは \fByum\fP でインストールできます。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 3.0.2のリリースから、Groonga関連のRPMパッケージはFedoraの公式yumリポジトリでリリースしています。GroongaのyumリポジトリのかわりにFedoraの公式リポジトリを使います。ただ、いくつか例外があって、MeCabの辞書( \fBmecab\-ipadic\fP や \fBmecab\-jumandic\fP )パッケージを使うにはGroongaのyumリポジトリを使います。 .UNINDENT .UNINDENT .sp 32\-bit用と64\-bit用のパッケージを配布していますが、サーバ用途には64\-bitパッケージを利用することをオススメします。32\-bit用パッケージはテスト用か開発用にだけ使って下さい。32\-bit用パッケージを使った場合は、中程度のサイズのデータでもメモリ不足エラーになることがあります。 .SS Fedora 21 .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y groonga .ft P .fi .UNINDENT .UNINDENT .sp \fBmecab\-ipadic\fP 、 \fBmecab\-jumandic\fP といったパッケージを使うには Groongaのyumリポジトリを提供する \fBgroonga\-release\fP パッケージをあらかじめインストールします。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo rpm \-ivh http://packages.groonga.org/fedora/groonga\-release\-1.1.0\-1.noarch.rpm % sudo yum update .ft P .fi .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \fBgroonga\fP パッケージは全文検索のための最小構成パッケージです。Groongaをサーバー用途で使うなら、設定済みの追加パッケージをインストールすることができます。 .sp サーバー用途のための2つのパッケージがあります。 .INDENT 0.0 .IP \(bu 2 groonga\-httpd (nginxを元にしたHTTPサーバー) .IP \(bu 2 groonga\-server\-gqtp (GQTPサーバー) .UNINDENT .sp 詳細は \fB/server\fP を参照してください。 .UNINDENT .UNINDENT .sp \fI\%MeCab\fP をトークナイザーとして使いたいときは、groonga\-tokenizer\-mecabパッケージをインストールしてください。 .sp groonga\-tokenizer\-mecabパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y groonga\-tokenizer\-mecab .ft P .fi .UNINDENT .UNINDENT .sp それからMeCabの辞書をインストールします。(mecab\-ipadicもしくはmecab\-jumandic) .sp IPA辞書をインストールします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y mecab\-ipadic .ft P .fi .UNINDENT .UNINDENT .sp あるいはJuman辞書をインストールします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y mecab\-jumandic .ft P .fi .UNINDENT .UNINDENT .sp \fI\%Munin\fP プラグインを提供するパッケージもあります。MuninでGroongaの状態をモニターしたい場合は、groonga\-munin\-pluginsパッケージをインストールしてください。 .sp groonga\-munin\-pluginsパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y groonga\-munin\-plugins .ft P .fi .UNINDENT .UNINDENT .sp MySQL互換のノーマライザーをGroongaのプラグインとして提供するパッケージがあります。MySQL互換のノーマライザーを使うには \fBgroonga\-normalizer\-mysql\fP パッケージをインストールしてください。 .sp groonga\-normalizer\-mysqlパッケージのインストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y install groonga\-normalizer\-mysql .ft P .fi .UNINDENT .UNINDENT .SS ソースからビルド .sp Groongaをビルドするために必要なパッケージをインストールします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y wget tar gcc\-c++ make mecab\-devel libedit\-devel .ft P .fi .UNINDENT .UNINDENT .sp ソースをダウンロードします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % wget http://packages.groonga.org/source/groonga/groonga\-5.0.9.tar.gz % tar xvzf groonga\-5.0.9.tar.gz % cd groonga\-5.0.9 .ft P .fi .UNINDENT .UNINDENT .sp configureを実行します( \fBconfigure\fP のオプションについては source\-configure を参照してください): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure .ft P .fi .UNINDENT .UNINDENT .sp ビルド: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make \-j$(grep \(aq^processor\(aq /proc/cpuinfo | wc \-l) .ft P .fi .UNINDENT .UNINDENT .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo make install .ft P .fi .UNINDENT .UNINDENT .SS Oracle Solaris .sp このセクションではOracle Solaris上でGroongaをソースコードからインストールする方法を説明します。 .SS Oracle Solaris 11 .sp Groongaをビルドするために必要なパッケージをインストールします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo pkg install gnu\-tar gcc\-45 system/header .ft P .fi .UNINDENT .UNINDENT .sp ソースをダウンロードします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % wget http://packages.groonga.org/source/groonga/groonga\-5.0.9.tar.gz % gtar xvzf groonga\-5.0.9.tar.gz % cd groonga\-5.0.9 .ft P .fi .UNINDENT .UNINDENT .sp \fBCFLAGS="\-m64" CXXFLAGS="\-m64"\fP 変数付きでconfigureを実行します。これらの変数は64\-bit版をビルドするために必要です。32\-bit版をビルドする場合はこれらの変数を指定しないでしてください。 ( \fBconfigure\fP のオプションについては source\-configure を参照してください): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure CFLAGS="\-m64" CXXFLAGS="\-m64" .ft P .fi .UNINDENT .UNINDENT .sp ビルド: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make .ft P .fi .UNINDENT .UNINDENT .sp インストール: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo make install .ft P .fi .UNINDENT .UNINDENT .SS その他 .sp このセクションではUNIX系の環境でGroongaをソースコードからインストールする方法を説明します。 .sp \fB/install\fP にある特定環境用のドキュメントに、その環境向けのより詳細な情報があります。特定環境用のドキュメントがある場合は、まずそちらを参照してください。 .SS 依存関係 .sp Groongaは特別なライブラリを必要としませんが、いくつかビルドに必要なツールがあります。 .SS ツール .sp 以下が必要なツールです: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBwget\fP 、 \fBcurl\fP または Web ブラウザ(ソースアーカイブをダウンロードするため) .IP \(bu 2 \fBtar\fP と \fBgzip\fP (ソースアーカイブを展開するため) .IP \(bu 2 シェル( \fBdash\fP 、 \fBbash\fP 、 \fBzsh\fP など、どのようなシェルでもたぶん大丈夫) .IP \(bu 2 CコンパイラーとC++コンパイラー ( \fBgcc\fP と \fBg++\fP がサポート対象だが、他のコンパイラーでもたぶん大丈夫) .IP \(bu 2 \fBmake\fP (GNU makeがサポート対象だが、BSD makeなど他のmakeでもたぶん大丈夫) .UNINDENT .UNINDENT .UNINDENT .sp これらを用意してください。 .sp シェルの代わりに \fI\%CMake\fP を使うこともできますが、このドキュメントではCMakeを使ってビルドする方法については説明しません。 .sp 以下はあるとよいツールです: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%pkg\-config\fP (ライブラリを検出するため) .IP \(bu 2 \fI\%sudo\fP (ビルドしたGroongaをインストールするため) .UNINDENT .UNINDENT .UNINDENT .sp 追加のライブラリを使いたい場合はこれらのツールを用意しておかなければいけません。 .SS ライブラリ .sp どのライブラリも必須ではありません。以下はオプションとして使えるライブラリです: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%MeCab\fP (全文検索対象のドキュメントを形態素解析でトークナイズするため) .IP \(bu 2 \fI\%KyTea\fP (全文検索対象のドキュメントを形態素解析でトークナイズするため) .IP \(bu 2 \fI\%ZeroMQ\fP ( \fB/reference/suggest\fP 用) .IP \(bu 2 \fI\%libevent\fP ( \fB/reference/suggest\fP 用) .IP \(bu 2 \fI\%MessagePack\fP (MessagePack出力サポート用および \fB/reference/suggest\fP 用) .IP \(bu 2 \fI\%libedit\fP ( \fB/reference/executables/groonga\fP のコマンドライン編集用) .IP \(bu 2 \fI\%zlib\fP (カラム値の圧縮用) .IP \(bu 2 \fI\%LZ4\fP (カラム値の圧縮用) .UNINDENT .UNINDENT .UNINDENT .sp これらのライブラリを使いたい場合は、Groongaをインストールする前にライブラリをインストールしてください。 .SS ソースからビルド .sp GroongaはGNUビルドシステムを使っています。以下は一番簡単なビルド手順です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % wget http://packages.groonga.org/source/groonga/groonga\-5.0.9.tar.gz % tar xvzf groonga\-5.0.9.tar.gz % cd groonga\-5.0.9 % ./configure % make % sudo make install .ft P .fi .UNINDENT .UNINDENT .sp 上記の手順を実行すると \fB/usr/local/bin/groonga\fP に \fB/reference/executables/groonga\fP がインストールされます。 .sp デフォルトのビルドでもうまく動くでしょうが、 \fBconfigure\fP のときにGroongaをカスタマイズすることができます。 .sp 以下、それぞれの手順の詳細を説明します。 .SS \fBconfigure\fP .sp まず \fBconfigure\fP を実行します。重要な \fBconfigure\fP のオプションは以下の通りです: .SS \fB\-\-prefix=PATH\fP .sp インストール先となるディレクトリを指定します。Groonga関連のファイルは \fB${PATH}/\fP ディレクトリ以下にインストールされます。 .sp デフォルトは \fB/usr/local\fP 。デフォルトの場合は \fB/reference/executables/groonga\fP は \fB/usr/local/bin/groonga\fP にインストールされます。 .sp 以下はシステム全体にGroongaをインストールするのではなく、ユーザーが個人で使う目的で \fB~/local\fP にインストールする例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-prefix=$HOME/local .ft P .fi .UNINDENT .UNINDENT .SS \fB\-\-localstatedir=PATH\fP .sp ログファイル、PIDファイル、データベースなど頻繁に変更されるファイルを置くディレクトリを指定します。たとえば、ログファイルは \fB${PATH}/log/groonga.log\fP に置かれます。 .sp デフォルトは \fB/usr/local/var\fP です。 .sp 以下は頻繁に変更されるファイルをシステム全体で使う領域である \fB/var\fP に置く例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-localstatedir=/var .ft P .fi .UNINDENT .UNINDENT .SS \fB\-\-with\-log\-path=PATH\fP .sp ログファイルのデフォルトのパスを指定します。ログファイルのデフォルトのパスは \fB/reference/executables/groonga\fP の \fB\-\-log\-path\fP コマンドラインオプションで変更できます。そのため、このオプションはそんなに重要なビルドオプションではありません。少し便利にするためのオプションです。 .sp デフォルトは \fB/usr/local/var/log/groonga.log\fP です。 \fB/usr/local/var\fP の部分は \fB\-\-localstatedir\fP オプションで変更できます。 .sp 以下はログファイルを共有しているNFSディレクトリ \fB/nfs/log/groonga.log\fP に置く例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-with\-log\-path=/nfs/log/groonga.log .ft P .fi .UNINDENT .UNINDENT .SS \fB\-\-with\-default\-encoding=ENCODING\fP .sp デフォルトのエンコーディングを指定します。有効なエンコーディングは \fBeuc_jp\fP 、 \fBsjis\fP 、 \fButf8\fP 、 \fBlatin1\fP 、 \fBkoi8r\fP 、 \fBnone\fP です。 .sp デフォルトは \fButf\-8\fP です。 .sp 以下はデフォルトのエンコーディングとしてShift_JISを使う例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-with\-default\-encoding=sjis .ft P .fi .UNINDENT .UNINDENT .SS \fB\-\-with\-match\-escalation\-threshold=NUMBER\fP .sp マッチ演算でエスカレーションをするかどうかのデフォルトの閾値を指定します。この閾値については select\-match\-escalation\-threshold を参照してください。\-1はマッチ演算でエスカレーションしないという意味です。 .sp デフォルトは0です。 .sp 以下はデフォルトではマッチエスカレーションをしないという例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-with\-match\-escalation\-threshold=\-1 .ft P .fi .UNINDENT .UNINDENT .SS \fB\-\-with\-zlib\fP .sp zlibを使ってカラム値を圧縮する機能を有効にします。 .sp デフォルトでは無効です。 .sp 以下はzlibを使ってカラム値を圧縮する機能を有効にする例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-with\-zlib .ft P .fi .UNINDENT .UNINDENT .SS \fB\-\-with\-lz4\fP .sp LZ4を使ってカラム値を圧縮する機能を有効にします。 .sp デフォルトでは無効です。 .sp 以下はLZ4を使ってカラム値を圧縮する機能を有効にする例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-with\-lz4 .ft P .fi .UNINDENT .UNINDENT .SS \fB\-\-with\-message\-pack=MESSAGE_PACK_INSTALL_PREFIX\fP .sp MessagePackがどこにインストールされているかを指定します。MessagePackを \fB\-\-prefix=/usr\fP という \fBconfigure\fP オプションでインストールしていない場合は、MessagePackをビルドするときに指定したパスをこのオプションで指定してください。 .sp もし、MessagePackを \fB\-\-prefix=$HOME/local\fP という \fBconfigure\fP オプションでインストールした場合は、Groongaの \fBconfigure\fP では \fB\-\-with\-message\-pack=$HOME/local\fP と指定してください。 .sp デフォルトは \fB/usr\fP です。 .sp 以下はMessagePackが \fB\-\-prefix=$HOME/local\fP という \fBconfigure\fP オプションでインストールされている場合の例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-with\-message\-pack=$HOME/local .ft P .fi .UNINDENT .UNINDENT .SS \fB\-\-with\-munin\-plugins\fP .sp Groonga用のMuninプラグインをインストールします。プラグインは \fB${PREFIX}/share/groonga/munin/plugins/\fP 以下にインストールされます。 .sp デフォルトではプラグインはインストールされません。 .sp 以下はGroonga用のMuninプラグインをインストールする例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-with\-munin\-plugins .ft P .fi .UNINDENT .UNINDENT .SS \fB\-\-with\-package\-platform=PLATFORM\fP .sp initスクリプトなどプラットフォーム依存のシステム管理ファイルをインストールします。利用可能なプラットフォームは \fBredhat\fP と \fBfedora\fP です。 \fBredhat\fP はRed HatおよびCentOSなどのRed Hatクローンのディストリビューション用です。 \fBfedora\fP はFedora用です。 .sp デフォルトではシステム管理ファイルはインストールされません。 .sp 以下はCentOS用のシステム管理ファイルをインストールする例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-with\-package\-platform=redhat .ft P .fi .UNINDENT .UNINDENT .SS \fB\-\-help\fP .sp すべての \fBconfigure\fP オプションを表示します。 .SS \fBmake\fP .sp \fBconfigure\fP が成功したら \fBmake\fP でGroongaをビルドします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make .ft P .fi .UNINDENT .UNINDENT .sp マルチコアCPUを使っている場合は \fB\-j\fP オプションを使うとより速くmakeを実行できます。もし、4コアのCPUを使っている場合は、 \fB\-j4\fP オプションを使うともっと速くビルドできます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make \-j4 .ft P .fi .UNINDENT .UNINDENT .sp \fBmake\fP で何かエラーが発生した場合は、そのエラーをレポートしてください: \fB/contribution/report\fP .SS \fBmake install\fP .sp これでビルドしたGroongaをインストールできます!: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo make install .ft P .fi .UNINDENT .UNINDENT .sp \fB${PREFIX}\fP への書き込み権限がある場合は \fBsudo\fP を使う必要はありません。例えば、 \fB\-\-prefix=$HOME/local\fP と指定した場合です。この場合は \fBmake install\fP を使ってください: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make install .ft P .fi .UNINDENT .UNINDENT .SH コミュニティ .sp Groongaに関する情報を共有するための場所がいくつかあります。あなたの参加をお待ちしています! .SS メーリングリスト .sp Groongaに関する話題を扱うメーリングリストがあります。 .INDENT 0.0 .TP .B 英語 \fI\%groonga\-talk@lists.sourceforge.net\fP .TP .B 日本語 \fI\%groonga\-dev@lists.osdn.me\fP .UNINDENT .SS チャットルーム .sp \fI\%Gitterにあるgroonga/publicチャットルーム\fP に参加してください。(英語です。) .SS Twitter .sp \fI\%@groonga\fP がGroonga関連情報をツイートしています。 .sp このアカウントをフォローして最新のGroonga関連情報をゲットしてください! .SS Facebook .sp \fI\%FacebookのGroongaページ\fP ではGroonga関連情報をシェアしています。 .sp このページをいいね!して最新のGroonga関連情報をゲットしてください! .SH チュートリアル .SS 基本的な操作 .sp Groongaには、Cのライブラリとして使用する方法と、groonga実行ファイルを通して使用する方法があります。本チュートリアルでは、groonga実行ファイルを使用する方法について説明します。groonga実行ファイルを使って、データベースの作成・操作・サーバの起動・サーバへの接続などの操作が行えます。 .SS データベースの作成 .sp Groongaユーザへの第一歩はデータベースの作成です。まずは以下の書式をご覧ください。 .sp 書式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga \-n DB_PATH .ft P .fi .UNINDENT .UNINDENT .sp \fB\-n\fP オプションは、データベースの作成を指示します。DB_PATHは、新しく作成するデータベースのパスを指定します。データベースは複数のファイルによって構成されるため、正確には、データベースの入り口となるファイルのパスとして使用されます。また、データベースを構成する他のファイルについては、DB_PATHがパスのプレフィックスとして使用されます。指定されたパスにファイルが存在しているときは失敗するので注意してください(失敗例: \fBdb open failed (DB_PATH): syscall error \(aqDB_PATH\(aq (ファイルが存在します)\fP。 次の章で、既存のデータベースを開く方法を説明します)。 .sp 上記のコマンドは、データベースを作成してから、コマンドの入力を受け付ける対話モードに入ります。Ctrlキーを押しながらdキーを押すと、対話モードから抜けることができます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-n /tmp/groonga\-databases/introduction.db .ft P .fi .UNINDENT .UNINDENT .sp データベースの作成に成功すれば、/tmp/groonga\-databases以下にデータベースを構成するファイルが配置されます。 .SS データベースの操作 .sp 以下の書式は、既存のデータベースを操作する方法を示しています。 .sp 書式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga DB_PATH [COMMAND] .ft P .fi .UNINDENT .UNINDENT .sp DB_PATHには操作対象のデータベースを指定します。指定したデータベースが存在しないときは失敗します。 .sp COMMAND が指定された場合、COMMAND を実行した後、実行結果を返します。指定されなかった場合には、対話モードに入ります。対話モードでは、標準入力からコマンドを読み込み、順次実行します。本チュートリアルでは、対話モードを主に使用します。 .sp それでは、 \fB/reference/commands/status\fP コマンドを実行して、Groongaの実行状態を確認してみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga /tmp/groonga\-databases/introduction.db status # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "uptime": 0, # "max_command_version": 2, # "n_queries": 0, # "cache_hit_rate": 0.0, # "version": "5.0.6\-128\-g8029ddb", # "alloc_count": 206, # "command_version": 1, # "starttime": 1439995916, # "default_command_version": 1 # } # ] .ft P .fi .UNINDENT .UNINDENT .sp 以上のように、コマンドの実行結果は基本的にjson形式の配列として返却されます。配列の先頭には、エラーコードや実行時間などの情報が入ります。2番目の要素には、指示された操作の実行結果が入ります。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 他のツールを使うことで、JSONを整形できます。例えば、 \fI\%grnwrap\fP や \fI\%Grnline\fP 、 \fI\%jq\fP などが使えます。 .UNINDENT .UNINDENT .SS コマンドの書式 .sp データベースを操作するコマンドには、以下の書式で引数を与えます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C Form_1: COMMAND VALUE_1 VALUE_2 .. Form_2: COMMAND \-\-NAME_1 VALUE_1 \-\-NAME_2 VALUE_2 .. .ft P .fi .UNINDENT .UNINDENT .sp 書式1では値を適切な順番で渡す必要があります。このような引数は、位置によって値の意味が決まるため、位置固定引数などと呼ばれることもあります。 .sp 書式2では値を名前と一緒に渡します。そのため、任意の順序で引数を指定することができます。このような引数は、名前付き引数やキーワード引数と呼ばれることもあります。 .sp 空白や特殊な記号(ダブルクォート、シングルクォート、および丸括弧)を含む値を指定したいときは、シングルクォート(\(aq)かダブルクォート(")で値を囲むようにしてください。 .sp 詳しくは、 \fB/reference/executables/groonga\fP のコマンドの項を参考にしてください。 .SS 主なコマンド .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .TP .B \fB/reference/commands/status\fP Groongaプロセスの状態を表示します。 .TP .B \fB/reference/commands/table_list\fP データベースに定義されているテーブルのリストを表示します。 .TP .B \fB/reference/commands/column_list\fP テーブルに定義されているカラムのリストを表示します。 .TP .B \fB/reference/commands/table_create\fP データベースにテーブルを追加します。 .TP .B \fB/reference/commands/column_create\fP テーブルにカラムを追加します。 .TP .B \fB/reference/commands/select\fP テーブルに含まれるレコードを検索して表示します。 .TP .B \fB/reference/commands/load\fP テーブルにレコードを挿入します。 .UNINDENT .UNINDENT .UNINDENT .SS テーブルの作成 .sp \fB/reference/commands/table_create\fP コマンドを使用してテーブルを作成します。 .sp Groongaのテーブルには基本的に主キーが必要であり、テーブルを作成する際には型と格納方法も併せて指定する必要があります。 .sp 型には数値や文字列などがあります。ここではデータの種類を表しているものという程度に考えてください。詳細は \fB/reference/types\fP に記述されています。主キーの格納方法は、主キーを条件とする検索にかかる時間や、前方一致検索の可否などを左右します。こちらも後で説明します。 .sp それでは、テーブルを作成してみましょう。以下の例では、主キーのあるテーブルを作成します。 \fBname\fP 引数はテーブルの名前を指定します。 \fBflags\fP 引数は主キーの格納方法を指定するために使っています。 \fBkey_type\fP 引数は主キーの型を指定します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name Site \-\-flags TABLE_HASH_KEY \-\-key_type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 実行結果の第2要素は、操作が成功したことを示しています。 .SS テーブルの表示 .sp \fB/reference/commands/select\fP コマンドを用いて、テーブルの中身を表示することができます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 0 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ] # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB/reference/commands/select\fP に \fBtable\fP 引数のみを指定すると、指定したテーブルの中身を10件まで表示します。実行結果の[0]はテーブルに含まれるレコードの数を示しています。今回は何も登録されていないため0件です。レコード数の次に表示されている配列はテーブルの構成を示しています。["_id","Uint32"]はUInt32型の値を持つ_idという名前のカラム、["_key","ShortText"]はShortText型の値を持つ_keyという名前のカラムをそれぞれ表しています。 .sp 上記の_idカラムと_keyカラムの2つのカラムは必須のカラムです。_idカラムはGroongaが自動的に割り当てるIDを格納します。_keyカラムは主キーを格納します。これらのカラム名を変更することはできません。 .SS カラムの作成 .sp \fB/reference/commands/column_create\fP コマンドを用いて、カラムを作成することができます。 .sp それでは、カラムを作成してみましょう。以下の例では、新しいカラムをSiteテーブルに追加します。 \fBtable\fP 引数はテーブルの名前を指定します。 \fBname\fP 引数は新しいカラムの名前を指定します。 \fBtype\fP 引数はカラムに格納する値の型を指定します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create \-\-table Site \-\-name title \-\-type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] select \-\-table Site # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 0 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "title", # "ShortText" # ] # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS データのロード .sp \fB/reference/commands/load\fP コマンドは、JSON形式のレコードを受け取り、テーブルに格納します。 .sp 以下の例では9つのレコードをSiteテーブルに格納します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .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, 1337566253.89858, 0.000355720520019531], 9] .ft P .fi .UNINDENT .UNINDENT .sp 実行結果の第2要素はロードされたレコードの数を示しています。上記の操作では、すべてのレコードを問題なくロードできています。 .sp 念のため、データが入っていることを確認してみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 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 .UNINDENT .UNINDENT .SS レコードの取得 .sp \fB/reference/commands/select\fP コマンドを用いて、テーブルの中身を表示することができます。 .sp \fBquery\fP 引数を使って検索条件が指定された場合、 \fB/reference/commands/select\fP コマンドは検索条件に適合するレコードを検索し、検索結果を出力します。 .sp それでは、IDを指定してレコードを取り出してみましょう。以下の例では、Siteテーブルの先頭レコードを取り出します。正確には、 \fBquery\fP 引数を使って _id カラムに1が格納されているレコードを要求しています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-query _id:1 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "title", # "ShortText" # ] # ], # [ # 1, # "http://example.org/", # "This is test record 1!" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 次に、主キーを指定してレコードを取り出してみましょう。以下の例では、主キーが "\fI\%http://example.org/\fP" のキーを取り出します。正確には、 \fBquery\fP 引数を使って _key カラムに "\fI\%http://example.org/\fP" が格納されているレコードを要求しています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-query \(aq_key:"http://example.org/"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "title", # "ShortText" # ] # ], # [ # 1, # "http://example.org/", # "This is test record 1!" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 全文検索用の語彙表の作成 .sp そろそろ全文検索の使い方について見ていきましょう。 .sp Groongaでは転置インデックスを使って高速な全文検索を実現しています。そのため、まずは転置インデックスとして用いるテーブルを作成する必要があります。テーブルの内容は、文書に含まれる単語やN\-gramなどの索引語を主キーとして、各カラムに索引語の位置情報を格納するという構成になります。結果として、主キーのカラムは全文検索における語彙表の役割を果たします。 .sp 以下の例では、Termsという名前のテーブルを転置インデックスの語彙表として作成しています。索引語を格納するため、主キーの型はShortTextです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name Terms \-\-flags TABLE_PAT_KEY \-\-key_type ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fB/reference/commands/table_create\fP には多くの引数が指定されているものの、本チュートリアルではすべてを理解する必要はありません。以下に簡単な説明を述べますが、読み飛ばしてもらってかまいません。 .sp TABLE_PAT_KEYフラグは、主キーをパトリシア木に格納することを指示しています。 \fBdefault_tokenizer\fP 引数には、検索対象の文書をトークナイズする方式を指定するようになっています。上記の例では、一般的にN\-gramと呼ばれるインデックス方式に対応するTokenBigramを指定しています。 .sp \fBnormalizer\fP 引数はインデックスの単語をノーマライズするかどうかを指定しています。 .SS 全文検索用のインデックスカラムの作成 .sp 次に必要なのは、インデックス型のカラムを作成することです。このカラムは、関連付けられたカラムに対する全文検索に利用されます。つまり、全文検索を行いたいカラムに対してインデックスを作成することに相当します。 .sp それでは、インデックスカラムを作成してみましょう。以下の例では、Siteテーブルのカラムに対するインデックスカラムを作成します。それでは、Siteテーブルのtitleカラムを全文検索の対象とするべく、インデックス型のカラムを作成してみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create \-\-table Terms \-\-name blog_title \-\-flags COLUMN_INDEX|WITH_POSITION \-\-type Site \-\-source title # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fBtable\fP 引数は語彙表を指定し、 \fBname\fP 引数はインデックスカラムを指定します。また、 \fBtype\fP 引数はインデックスの対象となるテーブルを指定し、 \fBsource\fP 引数はインデックスの対象となるカラムを指定します。COLUMN_INDEXフラグはインデックスカラムの作成を指示し、WITH_POSITIONフラグは各索引語の位置情報をインデックスに含めることを指示します。一般的な全文検索インデックスを作成したいときは、COLUMN_INDEX|WITH_POSITIONを指定してください。索引語の位置情報については、本チュートリアルでは触れません。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 語彙表とインデックスカラムを作成するタイミングは、データをロードする前後のどちらでも問題ありません。データをロードした後でインデックスを作成し、さらに新しいデータをロードすることもできます。インデックスの作成を指示したタイミングでレコードが既に存在するときは、静的にインデックスを作成します。一方、インデックスを作成した後で追加されたレコードについては、動的にインデックスを更新します。 .UNINDENT .UNINDENT .SS 全文検索 .sp インデックスを作成したことにより、 \fB/reference/commands/select\fP コマンドによる全文検索が可能になります。 .sp 全文検索のクエリは \fBquery\fP 引数により指定することができます。以下の例では、titleカラムに "this" という文字列が含まれているレコードを検索します。 \fBquery\fP 引数に含まれる \(aq@\(aq は、全文検索を指示しています。語彙表の作成において NormalizerAuto を指定したときは、全角・半角や大文字・小文字などの違いが吸収されることに注意してください。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-query title:@this # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "title", # "ShortText" # ] # ], # [ # 1, # "http://example.org/", # "This is test record 1!" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 上記の例では、"This" という単語を含む先頭レコードのみが検索条件に適合します。 .sp \fB/reference/commands/select\fP コマンドには、 \fImatch_columns\fP という引数が存在します。このパラメータはデフォルトで検索対象にするカラムを指定するもので、カラム名を指定しない検索条件にのみ適用されます。 [1] .sp "\fI\-\-match_columns\fP title" と "\fI\-\-query\fP this" の組み合わせを指定すると、 "\fI\-\-query\fP title:@this" を指定したときと同じ検索条件になります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-match_columns title \-\-query this # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "title", # "ShortText" # ] # ], # [ # 1, # "http://example.org/", # "This is test record 1!" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 出力カラムの指定 .sp \fB/reference/commands/select\fP コマンドにおいて \fBoutput_columns\fP 引数を用いることで、検索結果に含めるカラムを指定することができます。複数のカラムを指定するときは、カンマ(,)区切りでカラムを列挙します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-output_columns _key,title,_score \-\-query title:@test # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 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 .UNINDENT .UNINDENT .sp 上記の例では、_scoreカラムを含む3つのカラムを指定しています。_scoreカラムはGroongaの検索結果に含まれるカラムであり、全文検索の条件に合致するレコードほど高い数値が入ります。 .SS 表示範囲指定 .sp \fB/reference/commands/select\fP コマンドにおいて \fBoffset\fP 引数と \fBlimit\fP 引数を用いることで、検索結果の一部のみを表示することができます。大量の検索結果を分割してページ単位で表示したい場合などに有用です。 .sp \fBoffset\fP 引数には、検索結果における始点を指定します。検索結果の1件目が必要な場合、 \fBoffset\fP 引数を省略するか、0を指定するようにしてください。 \fBlimit\fP 引数には、検索結果の表示件数を指定します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-offset 0 \-\-limit 3 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 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, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 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, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 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 .UNINDENT .UNINDENT .SS 検索結果の並べ替え .sp \fB/reference/commands/select\fP コマンドに \fBsortby\fP 引数を渡すことにより、検索結果を並べ替えることができます。 .sp \fBsortby\fP 引数には、整列の基準として用いるカラムを指定します。検索結果は指定したカラムの値が昇順になるように並べ替えられます。 \fBsortby\fP 引数の中でカラム名の前にハイフン(\-)を付けることにより、降順に並べ替えることもできます。 .sp 以下の例では、Siteテーブルのレコードを逆順に表示しています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-sortby \-_id # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 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 .UNINDENT .UNINDENT .sp 次の例では、_scoreカラムを整列の基準とすることにより、検索結果のランキングをおこなっています。検索結果はクエリとの関連性が高い順に並べ替えられます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-query title:@test \-\-output_columns _id,_score,title \-\-sortby \-_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 9 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_score", # "Int32" # ], # [ # "title", # "ShortText" # ] # ], # [ # 6, # 4, # "test test test test record six." # ], # [ # 5, # 3, # "test test test record five." # ], # [ # 7, # 3, # "test test test record seven." # ], # [ # 8, # 2, # "test test record eight." # ], # [ # 3, # 2, # "test test record three." # ], # [ # 9, # 2, # "test test record nine." # ], # [ # 1, # 1, # "This is test record 1!" # ], # [ # 4, # 1, # "test record four." # ], # [ # 2, # 1, # "test record 2." # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 整列の基準となるカラムを複数指定したいときは、カンマ(,)区切りでカラムを列挙します。複数のカラムを指定したときは、最初のカラムを基準として整列した後、最初のカラムに同じ値が格納されているレコードを次のカラムを基準として整列します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-query title:@test \-\-output_columns _id,_score,title \-\-sortby \-_score,_id # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 9 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_score", # "Int32" # ], # [ # "title", # "ShortText" # ] # ], # [ # 6, # 4, # "test test test test record six." # ], # [ # 5, # 3, # "test test test record five." # ], # [ # 7, # 3, # "test test test record seven." # ], # [ # 3, # 2, # "test test record three." # ], # [ # 8, # 2, # "test test record eight." # ], # [ # 9, # 2, # "test test record nine." # ], # [ # 1, # 1, # "This is test record 1!" # ], # [ # 2, # 1, # "test record 2." # ], # [ # 4, # 1, # "test record four." # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT 脚注 .IP [1] 5 現在のバージョンでは、全文検索インデックスが存在する場合にのみ、 \fBmatch_columns\fP 引数を利用することができます。通常のカラムでの絞り込みには利用できません。 .SS リモートアクセス .sp Groongaをサーバとして起動することにより、ネットワークを介してデータベースにアクセスできるようになります。Groongaがサポートしているプロトコルは、Groongaの専用プロトコルであるGQTP、memcachedバイナリプロトコル、HTTPの三種類です。 .SS HTTP .SS HTTPサーバの起動 .sp GroongaはHTTPをサポートしています。以下の書式はHTTPサーバをデーモンとして起動する方法を示しています。 .sp 書式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [\-p PORT_NUMBER] \-d \-\-protocol http DB_PATH .ft P .fi .UNINDENT .UNINDENT .sp \fI\-\-protocol\fP オプションとその引数により、サーバのプロトコルを指定することができます。"http"はHTTPサーバの起動を指示しています。\fI\-p\fP オプションを省略した場合は10041のポート番号が使用されます。 .sp 以下のコマンドは、ポート番号80で待ち受けるHTTPサーバをデーモンとして起動します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo groonga \-p 80 \-d \-\-protocol http /tmp/groonga\-databases/introduction.db % .ft P .fi .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 80番ポートで待ち受けるにはroot権限が必須です。1024番以降のポート番号にはそのような制限はありません。 .UNINDENT .UNINDENT .SS HTTPサーバへのコマンド送信 .sp GroongaがHTTPサーバとして起動されているときは、/d/COMMAND_NAME というURLにアクセスすることにより、コマンドを実行することができます。コマンドの引数は、HTTPのGETパラメータとして渡します。引数の書式は "?NAME_1=VALUE_1&NAME_2=VALUE_2&..." となります。 .sp 以下の例は、HTTPサーバに対するコマンドの送り方を示しています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C http://HOST_NAME_OR_IP_ADDRESS[:PORT_NUMBER]/d/status Executed command: status # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "uptime": 0, # "max_command_version": 2, # "n_queries": 0, # "cache_hit_rate": 0.0, # "version": "5.0.6\-128\-g8029ddb", # "alloc_count": 185, # "command_version": 1, # "starttime": 1439995935, # "default_command_version": 1 # } # ] http://HOST_NAME_OR_IP_ADDRESS[:PORT_NUMBER]/d/select?table=Site&query=title:@this Executed command: select \-\-table Site \-\-query title:@this # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "country", # "SiteCountry" # ], # [ # "domain", # "SiteDomain" # ], # [ # "link", # "Site" # ], # [ # "links", # "Site" # ], # [ # "location", # "WGS84GeoPoint" # ], # [ # "title", # "ShortText" # ] # ], # [ # 1, # "http://example.org/", # "japan", # ".org", # "http://example.net/", # [ # "http://example.net/", # "http://example.org/", # "http://example.com/" # ], # "128452975x503157902", # "This is test record 1!" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS ブラウザベースの管理ツール .sp GroongaをHTTPサーバとして起動しているときは、ブラウザベースの管理ツールを使うことにより、データベースを簡単に管理することができます。管理ツールを使いたいときは、ブラウザを使って \fI\%http://HOST_NAME_OR_IP_ADDRESS[:PORT_NUMBER]/\fP へとアクセスしてください。管理ツールの使用には、JavaScriptの実行が有効になっている必要があります。 .SS セキュリティ .sp Groongaのサーバには認証機能がありません。誰でもデータベースの内容を閲覧・修正することができます。iptablesなどを用いてアクセス元IPアドレスを制限することを推奨します。 .SS いろいろなデータの保存 .sp Groongaは全文検索エンジンを起源として独自のカラムストアを持つに至るわけですが、索引語や文書を保存するだけでなく、数値や文字列、日時や経緯度など、いろいろなデータを保存することができます。本チュートリアルでは、Groongaで保存できるデータの種類、および保存の方法を説明します。 .SS データの種類 .sp Groongaにおいて利用できる基本型は、真偽値、数値、文字列、日時、経緯度の5種類に大別できます。基本型において、数値は整数・浮動小数点数の違い、符号の有無と割り当てるビット数によって細分化できるほか、文字列は長さの上限によって細分化できます。また、経緯度には測地系による分類があります。詳しくは \fB/reference/types\fP を参照してください。 .sp 拡張型としては、別テーブルを参照するための情報であるテーブル参照を保存することができます。また、基本型もしくはテーブル参照を複数まとめて保存できるように、ベクターカラムをサポートしています。 .sp それでは、本チュートリアルで使用するテーブルを作成しておきましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name ToyBox \-\-flags TABLE_HASH_KEY \-\-key_type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .SS 真偽値 .sp ブール型は真偽値(true/false)を表現するための型です。ブール型のカラムを作成するには、 \fB/reference/commands/column_create\fP コマンドの \fItype\fP 引数に Bool を指定します。ブール型のデフォルト値はfalseです。 .sp 以下の例では、ブール型のカラムを作成し、3つのレコードを追加します。3番目のレコードについては、値を省略しているため、デフォルト値が格納されます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create \-\-table ToyBox \-\-name is_animal \-\-type Bool # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table ToyBox [ {"_key":"Monkey","is_animal":true} {"_key":"Flower","is_animal":false} {"_key":"Block"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] select \-\-table ToyBox \-\-output_columns _key,is_animal # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "is_animal", # "Bool" # ] # ], # [ # "Monkey", # true # ], # [ # "Flower", # false # ], # [ # "Block", # false # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 数値 .sp 数値型は、整数と浮動小数点数に分けることができます。整数は、符号付き整数と符号なし整数に分けることができるだけでなく、割り当てるビット数によっても分けることができます。割り当てるビット数を大きくすると、カラムのサイズは大きくなってしまいますが、表現できる整数の範囲を大きくすることができます。詳しくは \fB/reference/types\fP を参照してください。数値型のデフォルト値はいずれも0です。 .sp 以下の例では、Int8型のカラムとFloat型のカラムを作成し、既存のレコードを更新します。 \fB/reference/commands/load\fP コマンドはweightカラムの値を期待したとおりに更新しています。一方、priceカラムに指定した小数については、小数点以下を切り捨てた値が格納されています。また、表現できる範囲を超える値を格納しようとした2番目のレコードについては、指定した値とは異なる値が格納されています。このように、表現できる範囲を超える値を指定すると、操作後の値は未定義になるので注意してください。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create \-\-table ToyBox \-\-name price \-\-type Int8 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table ToyBox \-\-name weight \-\-type Float # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table ToyBox [ {"_key":"Monkey","price":15.9} {"_key":"Flower","price":200,"weight":0.13} {"_key":"Block","weight":25.7} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] select \-\-table ToyBox \-\-output_columns _key,price,weight # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "price", # "Int8" # ], # [ # "weight", # "Float" # ] # ], # [ # "Monkey", # 15, # 0.0 # ], # [ # "Flower", # \-56, # 0.13 # ], # [ # "Block", # 0, # 25.7 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 文字列 .sp 文字列型は、長さの上限によって分けることができます。詳しくは \fB/reference/types\fP を参照してください。文字列型のデフォルト値は長さ0の文字列です。 .sp 以下の例では、 \fBShortText\fP 型のカラムを作成し、既存のレコードを更新します。3つ目のレコード(キーが \fB"Block"\fP のレコード)は更新していないのでデフォルト値(長さが0の文字列)になります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create \-\-table ToyBox \-\-name name \-\-type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table ToyBox [ {"_key":"Monkey","name":"Grease"} {"_key":"Flower","name":"Rose"} ] # [[0, 1337566253.89858, 0.000355720520019531], 2] select \-\-table ToyBox \-\-output_columns _key,name # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ] # ], # [ # "Monkey", # "Grease" # ], # [ # "Flower", # "Rose" # ], # [ # "Block", # "" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 日時 .sp 日時を表現するための型はTimeです。内部では1970年1月1日0時0分0秒を基準とする経過時間をマイクロ秒単位で表現します。符号付きの整数を用いるため、1970年以前の日時も表現することができます。内部表現はマイクロ秒単位の整数ですが、 \fB/reference/commands/load\fP コマンドおよび \fB/reference/commands/select\fP コマンドでは、経過秒数による指定・表示となります。デフォルト値は1970年1月1日0時0分0秒のことを表す0.0です。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 Groonga内部では経過秒数を整数のペアで保持しています。最初の整数で秒を表現し、もう一方でマイクロ秒を表現します。それゆえGroongaでは小数で経過秒数を表示します。整数部が秒数で、小数部はマイクロ秒の値です。 .UNINDENT .UNINDENT .sp 以下の例では、 \fBTime\fP 型のカラムを作成し、既存のレコードを更新します。1つ目のレコード(キーが \fB"Monkey"\fP のレコード)は更新していないのでデフォルト値( \fB0.0\fP )になります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create \-\-table ToyBox \-\-name time \-\-type Time # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table ToyBox [ {"_key":"Flower","time":1234567890.1234569999} {"_key":"Block","time":\-1234567890} ] # [[0, 1337566253.89858, 0.000355720520019531], 2] select \-\-table ToyBox \-\-output_columns _key,time # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "time", # "Time" # ] # ], # [ # "Monkey", # 0.0 # ], # [ # "Flower", # 1234567890.12346 # ], # [ # "Block", # \-1234567890.0 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 経緯度 .sp 経緯度を表現するための型は、測地系によって分けることができます。詳しくは \fB/reference/types\fP を参照してください。経緯度の指定・表示には、以下に示す形式の文字列を使います。 .INDENT 0.0 .IP \(bu 2 "経度のミリ秒表記x緯度のミリ秒表記" (例: "128452975x503157902") .IP \(bu 2 "経度の度数表記x緯度の度数表記" (例: "35.6813819x139.7660839") .UNINDENT .sp 小数点を含んでいなければミリ秒表記、小数点を含んでいれば度数表記として扱われます。ミリ秒表記と度数表記を混ぜたときの動作は未定義なので注意してください。経度と緯度の区切りとしては、\(aqx\(aq のほかに \(aq,\(aq を使うことができます。経緯度のデフォルト値は "0x0" です。 .sp 以下の例では、世界測地系を用いる \fBWGS84GeoPoint\fP 型のカラムを作成し、既存のレコードを更新します。2つ目のレコード(キーが \fB"Flower"\fP のレコード)は更新していないのでデフォルト値( \fB"0x0"\fP )になります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create \-\-table ToyBox \-\-name location \-\-type WGS84GeoPoint # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table ToyBox [ {"_key":"Monkey","location":"128452975x503157902"} {"_key":"Block","location":"35.6813819x139.7660839"} ] # [[0, 1337566253.89858, 0.000355720520019531], 2] select \-\-table ToyBox \-\-output_columns _key,location # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "location", # "WGS84GeoPoint" # ] # ], # [ # "Monkey", # "128452975x503157902" # ], # [ # "Flower", # "0x0" # ], # [ # "Block", # "128452975x503157902" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS テーブル参照 .sp Groongaでは、テーブル参照のカラム、すなわち関連付けたテーブルを参照するカラムを作成できます。より正確には、カラム作成時に参照先となるテーブルとの関連付けをおこない、参照先テーブルにおけるレコードIDを格納しておくことにより、参照先のレコードにアクセスできるようにします。 .sp テーブル参照のカラムがあるときは、 \fB/reference/commands/select\fP コマンドの \fBoutput_columns\fP 引数に \fB参照元カラム.参照先カラム\fP と指定することにより、参照先カラムの値を取り出すことができます。参照元カラムのみを指定したときは、 \fB参照元カラム名._key\fP と同様の扱いとなり、参照先レコードの主キーが取り出されます。テーブル参照が有効なレコードを指していないときは、 \fB/reference/commands/select\fP コマンドは参照先カラムのデフォルト値を取り出すようになっています。 .sp ここでは、 tutorial\-introduction\-create\-table で作成した \fBSite\fP テーブルに参照カラムを作成します。作成する参照カラムは \fBlink\fP という名前にします。このカラムには \fBSite\fP テーブルのレコード間でのリンク関係を保存します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create \-\-table Site \-\-name link \-\-type Site # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Site [ {"_key":"http://example.org/","link":"http://example.net/"} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] select \-\-table Site \-\-output_columns _key,title,link._key,link.title \-\-query title:@this # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 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 .UNINDENT .UNINDENT .sp テーブル参照のカラムを作成するときは、 \fB/reference/commands/column_create\fP コマンドの \fItype\fP 引数に参照先テーブルを指定します。この例では、同じテーブルに含まれる別のレコードを参照させたいので、Siteを指定することになります。次に、 \fB/reference/commands/load\fP コマンドで "\fI\%http://example.org/\fP" から "\fI\%http://example.net/\fP" へのリンクを登録しています。テーブル参照を作成するときは、IDではなく主キーを指定することに注意してください。最後に、 \fB/reference/commands/select\fP コマンドでリンクの内容を確認しています。この例では、 \fIoutput_columns\fP 引数に link._key と link.title を指定しているので、参照先の主キーとタイトルが表示されています。 .SS ベクターカラム .sp \fB/reference/commands/column_create\fP コマンドでカラムを作成するとき、 \fIflags\fP 引数にCOLUMN_VECTORフラグを指定すると、 \fItype\fP 引数に指定した型の配列を格納するカラムになります。このようなカラムのことを、ベクターカラムと呼びます。ベクターカラムは、各レコードに複数の値を格納できるため、一対多の参照関係を表すのに便利です。 .sp さきほどテーブル参照の例として作成したカラムでは、各サイトに一つのリンクしか保存できませんでした。通常は一つのサイトから多くのサイトにリンクが張られているので、これでは残念な仕様になってしまいます。そこで、ベクターカラムを使って、複数のリンクを保存できるようにしてみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create \-\-table Site \-\-name links \-\-flags COLUMN_VECTOR \-\-type Site # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Site [ {"_key":"http://example.org/","links":["http://example.net/","http://example.org/","http://example.com/"]}, ] # [[0, 1337566253.89858, 0.000355720520019531], 1] select \-\-table Site \-\-output_columns _key,title,links._key,links.title \-\-query title:@this # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 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 .UNINDENT .UNINDENT .sp 新たなカラムにはSiteテーブルに対する参照の配列を格納するので、 \fItype\fP 引数にSiteを指定するとともに、 \fIflags\fP 引数にCOLUMN_VECTORフラグを指定しています。 \fB/reference/commands/column_create\fP コマンドの \fItype\fP パラメーターは前の例と同じです。次に、 \fB/reference/commands/load\fP コマンドによる更新では、 "\fI\%http://example.org/\fP" から "\fI\%http://example.net/\fP" へのリンクに加えて、 "\fI\%http://example.org/\fP" と "\fI\%http://example.com/\fP" へのリンクも登録しています。そして、最後に \fB/reference/commands/select\fP コマンドでリンクの内容を確認しています。この例では、 \fIoutput_columns\fP 引数に links._key と links.title を指定しているので、参照先の主キーとタイトルをそれぞれ配列にしたものが表示されています。 .SS さまざまな検索条件 .sp Groongaは、JavaScriptに似た文法での条件絞込や、計算した値を用いたソートを行うことができます。また、位置情報(緯度・経度)を用いた絞込・ソートを行うことができます。 .SS JavaScriptに似た文法での絞込・全文検索 .sp \fBselect\fP コマンドの \fBfilter\fP パラメータは、レコードの検索条件を指定します。 \fBfilter\fP パラメータと \fBquery\fP パラメータでは、 \fBfilter\fP パラメータにはJavaScriptの式に似た文法で条件を指定する点が違います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-filter "_id <= 1" \-\-output_columns _id,_key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ] # ], # [ # 1, # "http://example.org/" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 上記クエリの詳細をみてみましょう。 \fBfilter\fP パラメータではこのように条件が指定されています: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C _id <= 1 .ft P .fi .UNINDENT .UNINDENT .sp このケースでは、 \fB_id\fP の値が1以下であるという条件に合致するレコードを返します。 .sp また、 \fB&&\fP や \fB||\fP を使って、条件のAND・OR指定をすることもできます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-filter "_id >= 4 && _id <= 6" \-\-output_columns _id,_key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 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, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 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 .UNINDENT .UNINDENT .sp \fBquery\fP パラメータと \fBfilter\fP パラメータを同時に指定すると、両者の条件をともに満たすレコードが結果として返ります。 .SS \fBscorer\fP を利用したソート .sp \fBselect\fP コマンドの \fBscorer\fP パラメータは、 全文検索を行った結果の各レコードに対して処理を行うためのパラメータです。 .sp \fBfilter\fP パラメータと同様に、 JavaScriptの式に似た文法で様々な条件を指定することができます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-filter "true" \-\-scorer "_score = rand()" \-\-output_columns _id,_key,_score \-\-sortby _score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 9 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # 6, # "http://example.com/rab", # 424238335 # ], # [ # 9, # "http://example.com/vdw", # 596516649 # ], # [ # 7, # "http://example.net/atv", # 719885386 # ], # [ # 2, # "http://example.net/", # 846930886 # ], # [ # 8, # "http://example.org/gat", # 1649760492 # ], # [ # 3, # "http://example.com/", # 1681692777 # ], # [ # 4, # "http://example.net/afr", # 1714636915 # ], # [ # 1, # "http://example.org/", # 1804289383 # ], # [ # 5, # "http://example.org/aba", # 1957747793 # ] # ] # ] # ] select \-\-table Site \-\-filter "true" \-\-scorer "_score = rand()" \-\-output_columns _id,_key,_score \-\-sortby _score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 9 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # 4, # "http://example.net/afr", # 783368690 # ], # [ # 2, # "http://example.net/", # 1025202362 # ], # [ # 5, # "http://example.org/aba", # 1102520059 # ], # [ # 1, # "http://example.org/", # 1189641421 # ], # [ # 3, # "http://example.com/", # 1350490027 # ], # [ # 8, # "http://example.org/gat", # 1365180540 # ], # [ # 9, # "http://example.com/vdw", # 1540383426 # ], # [ # 7, # "http://example.net/atv", # 1967513926 # ], # [ # 6, # "http://example.com/rab", # 2044897763 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \(aq_score\(aqは仮想的なカラムです。全文検索のスコアが代入されています。仮想的なカラムの詳細については、 \fB/reference/columns/pseudo\fP を参照してください。 .sp 上記のクエリでは \fBscorer\fP パラメータの条件はこのとおりです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C _score = rand() .ft P .fi .UNINDENT .UNINDENT .sp このケースでは、rand()という乱数を返す関数を用いて、全文検索のスコアを乱数で上書きしています。 .sp \fBsortby\fP パラメータの条件は次のとおりです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C _score .ft P .fi .UNINDENT .UNINDENT .sp これは、スコア順に検索結果を昇順にソートすることを意味しています。 .sp よって、上記のクエリは実行されるたびに検索結果の並び順がランダムに変わります。 .SS 位置情報を用いた絞込・ソート .sp Groongaでは、位置情報(経緯度)を保存することができます。また、保存した経緯度を用いて絞込やソートができます。 .sp Groongaでは位置情報を保存するためのカラムの型として、TokyoGeoPoint/WGS84GeoPointの2つの型があります。前者は日本測地系、後者は世界測地系(WGS84相当)の経緯度を保存します。 .sp 以下のようにして経緯度を指定します: .INDENT 0.0 .IP \(bu 2 "経度のミリ秒表記x緯度のミリ秒表記" (例: "128452975x503157902") .IP \(bu 2 "経度のミリ秒表記,緯度のミリ秒表記" (例: "128452975,503157902") .IP \(bu 2 "経度の度数表記x緯度の度数表記" (例: "35.6813819x139.7660839") .IP \(bu 2 "経度の度数表記,緯度の度数表記" (例: "35.6813819,139.7660839") .UNINDENT .sp ここでは、ためしに東京駅と新宿駅とついて、世界測地系での位置情報を保存してみましょう。東京駅は緯度が35度40分52.975秒、経度が139度45分57.902秒です。新宿駅は緯度が35度41分27.316秒、経度が139度42分0.929秒です。よって、ミリ秒表記の場合はそれぞれ"128452975x503157902"/"128487316x502920929"となります。度数表記の場合はそれぞれ"35.6813819x139.7660839"/"35.6909211x139.7002581"となります。 .sp ミリ秒表記で位置情報を登録してみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create \-\-table Site \-\-name location \-\-type WGS84GeoPoint # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Site [ {"_key":"http://example.org/","location":"128452975x503157902"} {"_key":"http://example.net/","location":"128487316x502920929"}, ] # [[0, 1337566253.89858, 0.000355720520019531], 2] select \-\-table Site \-\-query "_id:1 OR _id:2" \-\-output_columns _key,location # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "location", # "WGS84GeoPoint" # ] # ], # [ # "http://example.org/", # "128452975x503157902" # ], # [ # "http://example.net/", # "128487316x502920929" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBscorer\fP パラメータに \fB/reference/functions/geo_distance\fP を使って計算した距離を設定します。 .sp ここでは、秋葉原駅からの距離を表示させてみましょう。世界測地系では、秋葉原駅の位置は緯度が35度41分55.259秒、経度が139度46分27.188秒です。よって、geo_distance関数に与える文字列は"128515259x503187188"となります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .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, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "location", # "WGS84GeoPoint" # ], # [ # "_score", # "Int32" # ] # ], # [ # "http://example.org/", # "128452975x503157902", # 2054 # ], # [ # "http://example.net/", # "128487316x502920929", # 6720 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 結果から、東京駅と秋葉原駅は2054m、秋葉原駅と新宿駅は6720m離れているようです。 .sp \fBgeo_distance\fP 関数は、\fB_score\fP に値を設定することで、\fBsortby\fP パラメータによるソートでも用いることができます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .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, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "location", # "WGS84GeoPoint" # ], # [ # "_score", # "Int32" # ] # ], # [ # "http://example.net/", # "128487316x502920929", # 6720 # ], # [ # "http://example.org/", # "128452975x503157902", # 2054 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp Groongaでは、「ある地点から何m以内に存在する」といった絞込も可能です。 .sp その場合には、 \fBfilter\fP パラメータで \fB/reference/functions/geo_in_circle\fP を指定します。 .sp たとえば、秋葉原駅から5000m以内にあるレコードを検索してみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-output_columns _key,location \-\-filter \(aqgeo_in_circle(location, "128515259x503187188", 5000)\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "location", # "WGS84GeoPoint" # ] # ], # [ # "http://example.org/", # "128452975x503157902" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 経緯度が指定の矩形領域内であるかどうかを判定する \fB/reference/functions/geo_in_rectangle\fP も存在します。 .SS ドリルダウン .sp これまでのセクションで検索方法と検索結果をどのようにソートするかを学びました。思うがままに検索できるようになりましたね。それでは、次のことをするにはどうすればよいでしょか。まず、あるカラムに注目します。そして、そのカラムの値が同じレコードを集め、それぞれの値毎に集まったレコードの数を数えます。 .sp 素朴な実現方法は、カラムのそれぞれの値で検索する方法です。結果として、すべてのカラムの値についてレコード数を求めることができます。シンプルな方法ですが、たくさんのレコードがある場合には現実的ではありません。 .sp SQLに慣れている人は、「GroongaにはSQLでいう \fBGROUP BY\fP 相当の機能はないの?」と思うでしょう。 .sp もちろん、Groongaはそのような機能を提供しています。それが \fBdrilldown\fP と呼んでいる機能です。 .sp \fBdrilldown\fP はカラムの値ごとにレコード数を数える機能を提供します。値ごとに別々のクエリーになるのではなく、1回のクエリーですべての値に対してレコード数を数えます。 .sp この機能を説明するために次のケースを考えます。ドメインで分類し、ドメインが属している国ごとにグループ化する、というケースです。 .sp この機能を使った具体的な例を示します。 .sp この例では、 \fBSite\fP テーブルに2つのカラムを追加しています。 \fBdomain\fP カラムはTLD(トップレベルドメイン)に使います。 \fBcountry\fP カラムは国名に使います。これらのカラムの型はドメイン名を主キーとする \fBSiteDomain\fP テーブルと国名を主キーとする \fBSiteCountry\fP テーブルです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name SiteDomain \-\-flags TABLE_HASH_KEY \-\-key_type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create \-\-name SiteCountry \-\-flags TABLE_HASH_KEY \-\-key_type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table Site \-\-name domain \-\-flags COLUMN_SCALAR \-\-type SiteDomain # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table Site \-\-name country \-\-flags COLUMN_SCALAR \-\-type SiteCountry # [[0, 1337566253.89858, 0.000355720520019531], 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, 1337566253.89858, 0.000355720520019531], 9] .ft P .fi .UNINDENT .UNINDENT .sp \fBdomain\fP カラムでドリルダウンする例を示します。 3つの値が \fBdomain\fP カラムでは使われています。".org"、".net"そして".com"です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-limit 0 \-\-drilldown domain # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 9 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "country", # "SiteCountry" # ], # [ # "domain", # "SiteDomain" # ], # [ # "link", # "Site" # ], # [ # "links", # "Site" # ], # [ # "location", # "WGS84GeoPoint" # ], # [ # "title", # "ShortText" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # ".org", # 3 # ], # [ # ".net", # 3 # ], # [ # ".com", # 3 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 上記のクエリの集計結果です。 .SS \fBdomain\fP カラムによるドリルダウン .TS center; |l|l|l|. _ T{ グループ化するカラムの値 T} T{ グループ化されたレコード数 T} T{ グループ化されたレコードは次のとおり T} _ T{ \&.org T} T{ 3 T} T{ .INDENT 0.0 .IP \(bu 2 \fI\%http://example.org/\fP .IP \(bu 2 \fI\%http://example.org/aba\fP .IP \(bu 2 \fI\%http://example.org/gat\fP .UNINDENT T} _ T{ \&.net T} T{ 3 T} T{ .INDENT 0.0 .IP \(bu 2 \fI\%http://example.net/\fP .IP \(bu 2 \fI\%http://example.net/afr\fP .IP \(bu 2 \fI\%http://example.net/atv\fP .UNINDENT T} _ T{ \&.com T} T{ 3 T} T{ .INDENT 0.0 .IP \(bu 2 \fI\%http://example.com/\fP .IP \(bu 2 \fI\%http://example.com/rab\fP .IP \(bu 2 \fI\%http://example.com/vdw\fP .UNINDENT T} _ .TE .sp ドリルダウン結果は \fB_nsubrecs\fP カラムの値として返ります。この場合は、\fBSite\fP テーブルは ".org"、".net"、".com"ドメインでグループ化されています。 \fB_nsubrecs\fP はグループ化されたドメインが3つのレコードをそれぞれもつことを意味します。 .sp テーブル型を持つカラムに対してドリルダウンを行った場合、参照先のテーブルに存在するカラム値を取得することもできます。ドリルダウンを行ったテーブルには、 \fB_nsubrecs\fP という仮想的なカラムが追加されます。このカラムには、グループ化されたレコード数が入ります。 .sp では、参照されているテーブルの詳細を調べてみましょう。 \fBSite\fP テーブルは \fBSiteDomain\fP テーブルを \fBdomain\fP カラムの型として使っています。 \fB\-\-drilldown_output_columns\fP を参照されているカラムの詳細を知るのに使えます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-limit 0 \-\-drilldown domain \-\-drilldown_output_columns _id,_key,_nsubrecs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 9 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "country", # "SiteCountry" # ], # [ # "domain", # "SiteDomain" # ], # [ # "link", # "Site" # ], # [ # "links", # "Site" # ], # [ # "location", # "WGS84GeoPoint" # ], # [ # "title", # "ShortText" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # 1, # ".org", # 3 # ], # [ # 2, # ".net", # 3 # ], # [ # 3, # ".com", # 3 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp これでグループ化されたドメインの詳細がわかります。 \fBdomain\fP の値が".org"であるレコードに対して \fBcountry\fP カラムを使ってドリルダウンしてみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-limit 0 \-\-filter "domain._id == 1" \-\-drilldown country # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "country", # "SiteCountry" # ], # [ # "domain", # "SiteDomain" # ], # [ # "link", # "Site" # ], # [ # "links", # "Site" # ], # [ # "location", # "WGS84GeoPoint" # ], # [ # "title", # "ShortText" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "japan", # 1 # ], # [ # "korea", # 1 # ], # [ # "usa", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 複数のカラムでドリルダウン .sp ドリルダウンでは複数のカラムをサポートしています。 \fBdrilldown\fP パラメータの引数にカンマ区切りの値を指定します。すると一度にまとめてドリルダウン結果を取得できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-limit 0 \-\-drilldown domain,country # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 9 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "country", # "SiteCountry" # ], # [ # "domain", # "SiteDomain" # ], # [ # "link", # "Site" # ], # [ # "links", # "Site" # ], # [ # "location", # "WGS84GeoPoint" # ], # [ # "title", # "ShortText" # ] # ] # ], # [ # [ # 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 .UNINDENT .UNINDENT .SS ドリルダウン結果をソートする .sp ドリルダウン結果をソートしたい場合には \fB\-\-drilldown_sortby\fP を使います。指定した \fB_nsubrecs\fP カラムを昇順でソートします。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-limit 0 \-\-drilldown country \-\-drilldown_sortby _nsubrecs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 9 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "country", # "SiteCountry" # ], # [ # "domain", # "SiteDomain" # ], # [ # "link", # "Site" # ], # [ # "links", # "Site" # ], # [ # "location", # "WGS84GeoPoint" # ], # [ # "title", # "ShortText" # ] # ] # ], # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "brazil", # 1 # ], # [ # "korea", # 1 # ], # [ # "usa", # 2 # ], # [ # "china", # 2 # ], # [ # "japan", # 3 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS ドリルダウン結果の制限 .sp ドリルダウン結果はデフォルト10件に制限されています。 \fBdrilldown_limit\fP と \fBdrilldown_offset\fP パラメータをドリルダウン結果をカスタマイズするのに使います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Site \-\-limit 0 \-\-drilldown country \-\-drilldown_sortby _nsubrecs \-\-drilldown_limit 2 \-\-drilldown_offset 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 9 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "country", # "SiteCountry" # ], # [ # "domain", # "SiteDomain" # ], # [ # "link", # "Site" # ], # [ # "links", # "Site" # ], # [ # "location", # "WGS84GeoPoint" # ], # [ # "title", # "ShortText" # ] # ] # ], # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "usa", # 2 # ], # [ # "china", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 文字列を格納しているカラムのドリルダウンは、他の型のカラムのドリルダウンよりも遅くなることに注意してください。文字列型のカラムでドリルダウンするときは、主キーの方が文字列のテーブルを作って、そのテーブルを参照するカラムにしてください。 .SS タグ検索・参照関係の逆引き .sp Groongaはカラム値として他のテーブルへの参照の配列を持つことができます。実は、テーブルへの参照の配列データを用いることによって、いわゆるタグ検索を行うことが可能となります。 .sp タグ検索はGroongaの転置インデックスというデータ構造を用いて高速に行われます。 .SS タグ検索 .sp 動画共有サイトの検索エンジンを作ることを想定します。1つの動画には、その動画の特徴を表す、複数の語句が付与されています。「ある語句が付与されている動画の一覧を取得する」検索を行いたいとします。 .sp 実際に、動画情報のテーブルを作成し、検索をしてみましょう。 .sp 動画の情報を保存する、Videoテーブルを作成します。Videoテーブルでは、動画のタイトルをtitleカラムに、動画のタグ情報をtagsカラムにTagテーブル型で複数格納しています。 .sp タグの情報を保存する、Tagテーブルを作成します。Tagテーブルでは、タグ文字列を主キーに格納し、Videoテーブルのtagsカラムに対するインデックスをindex_tagsカラムに格納しています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name Video \-\-flags TABLE_HASH_KEY \-\-key_type UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] table_create \-\-name Tag \-\-flags TABLE_HASH_KEY \-\-key_type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table Video \-\-name title \-\-flags COLUMN_SCALAR \-\-type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table Video \-\-name tags \-\-flags COLUMN_VECTOR \-\-type Tag # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table Tag \-\-name index_tags \-\-flags COLUMN_INDEX \-\-type Video \-\-source tags # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Video [ {"_key":1,"title":"Soccer 2010","tags":["Sports","Soccer"]}, {"_key":2,"title":"Zenigata Kinjirou","tags":["Variety","Money"]}, {"_key":3,"title":"groonga Demo","tags":["IT","Server","groonga"]}, {"_key":4,"title":"Moero!! Ultra Baseball","tags":["Sports","Baseball"]}, {"_key":5,"title":"Hex Gone!","tags":["Variety","Quiz"]}, {"_key":6,"title":"Pikonyan 1","tags":["Animation","Pikonyan"]}, {"_key":7,"title":"Draw 8 Month","tags":["Animation","Raccoon"]}, {"_key":8,"title":"K.O.","tags":["Animation","Music"]} ] # [[0, 1337566253.89858, 0.000355720520019531], 8] .ft P .fi .UNINDENT .UNINDENT .sp インデックスカラムを作成すると、全文検索が高速に行えるようになります。インデックスカラムは、対象のカラムに保存されたデータに更新があったとき、自動的に更新されます。 .sp 「ある語句が付与されている動画の一覧を取得する」検索を行いましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Video \-\-query tags:@Variety \-\-output_columns _key,title # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "UInt32" # ], # [ # "title", # "ShortText" # ] # ], # [ # 2, # "Zenigata Kinjirou" # ], # [ # 5, # "Hex Gone!" # ] # ] # ] # ] select \-\-table Video \-\-query tags:@Sports \-\-output_columns _key,title # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "UInt32" # ], # [ # "title", # "ShortText" # ] # ], # [ # 1, # "Soccer 2010" # ], # [ # 4, # "Moero!! Ultra Baseball" # ] # ] # ] # ] select \-\-table Video \-\-query tags:@Animation \-\-output_columns _key,title # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_key", # "UInt32" # ], # [ # "title", # "ShortText" # ] # ], # [ # 6, # "Pikonyan 1" # ], # [ # 7, # "Draw 8 Month" # ], # [ # 8, # "K.O." # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このように、「Variety」、「Sports」、「Animation」のようなタグで検索を行うことができました。 .SS 参照関係の逆引き .sp Groongaはテーブル間の参照関係の逆引きを高速に行うためのインデックスを付与することができます。タグ検索は、その1例にすぎません。 .sp 例えば、ソーシャルネットワーキングサイトにおける友人関係を逆引き検索することができます。 .sp 以下の例では、ユーザー情報を格納するUserテーブルを作成し、ユーザー名を格納するusernameカラム、ユーザーの友人一覧を配列で格納するfriendsカラムとそのインデックスのindex_friendsカラムを追加しています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name User \-\-flags TABLE_HASH_KEY \-\-key_type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table User \-\-name username \-\-flags COLUMN_SCALAR \-\-type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table User \-\-name friends \-\-flags COLUMN_VECTOR \-\-type User # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table User \-\-name index_friends \-\-flags COLUMN_INDEX \-\-type User \-\-source friends # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table User [ {"_key":"ken","username":"健作","friends":["taro","jiro","tomo","moritapo"]} {"_key":"moritapo","username":"森田","friends":["ken","tomo"]} {"_key":"taro","username":"ぐるんが太郎","friends":["jiro","tomo"]} {"_key":"jiro","username":"ぐるんが次郎","friends":["taro","tomo"]} {"_key":"tomo","username":"トモちゃん","friends":["ken","hana"]} {"_key":"hana","username":"花子","friends":["ken","taro","jiro","moritapo","tomo"]} ] # [[0, 1337566253.89858, 0.000355720520019531], 6] .ft P .fi .UNINDENT .UNINDENT .sp 指定したユーザーを友人リストに入れているユーザーの一覧を表示してみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table User \-\-query friends:@tomo \-\-output_columns _key,username # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "username", # "ShortText" # ] # ], # [ # "ken", # "健作" # ], # [ # "taro", # "ぐるんが太郎" # ], # [ # "jiro", # "ぐるんが次郎" # ], # [ # "moritapo", # "森田" # ], # [ # "hana", # "花子" # ] # ] # ] # ] select \-\-table User \-\-query friends:@jiro \-\-output_columns _key,username # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "username", # "ShortText" # ] # ], # [ # "ken", # "健作" # ], # [ # "taro", # "ぐるんが太郎" # ], # [ # "hana", # "花子" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp さらに、ドリルダウンを使って、友人リストに入っている数の一覧を表示してみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table User \-\-limit 0 \-\-drilldown friends # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 6 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "friends", # "User" # ], # [ # "index_friends", # "UInt32" # ], # [ # "username", # "ShortText" # ] # ] # ], # [ # [ # 6 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "taro", # 3 # ], # [ # "jiro", # 3 # ], # [ # "tomo", # 5 # ], # [ # "moritapo", # 2 # ], # [ # "ken", # 3 # ], # [ # "hana", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このように、テーブルの参照関係を逆にたどる検索ができました。 .SS インデックス付きジオサーチ .sp Groongaでは位置情報のカラムに対して、インデックスを付与することが出来ます。大量の位置情報レコードを検索する場合に、検索速度が速くなります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name GeoSite \-\-flags TABLE_HASH_KEY \-\-key_type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table GeoSite \-\-name location \-\-type WGS84GeoPoint # [[0, 1337566253.89858, 0.000355720520019531], true] table_create \-\-name GeoIndex \-\-flags TABLE_PAT_KEY \-\-key_type WGS84GeoPoint # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table GeoIndex \-\-name index_point \-\-type GeoSite \-\-flags COLUMN_INDEX \-\-source location # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table GeoSite [ {"_key":"http://example.org/","location":"128452975x503157902"}, {"_key":"http://example.net/","location":"128487316x502920929"} ] # [[0, 1337566253.89858, 0.000355720520019531], 2] select \-\-table GeoSite \-\-filter \(aqgeo_in_circle(location, "128515259x503187188", 5000)\(aq \-\-output_columns _key,location # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "location", # "WGS84GeoPoint" # ] # ], # [ # "http://example.org/", # "128452975x503157902" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp これらのインデックスは、位置情報レコードを用いてソートする場合に使われます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table GeoSite \-\-filter \(aqgeo_in_circle(location, "128515259x503187188", 50000)\(aq \-\-output_columns _key,location,_score \-\-sortby \(aq\-geo_distance(location, "128515259x503187188")\(aq \-\-scorer \(aq_score = geo_distance(location, "128515259x503187188")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "location", # "WGS84GeoPoint" # ], # [ # "_score", # "Int32" # ] # ], # [ # "http://example.org/", # "128452975x503157902", # 2054 # ], # [ # "http://example.net/", # "128487316x502920929", # 6720 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS match_columnsパラメータ .SS 複数のカラムに対する全文検索 .sp Groongaでは、複数のカラムを対象とした全文検索を行うことができます。例えば、ブログのテーブルで、タイトルと内容とがそれぞれ別のカラムに入ったものがあるとしましょう。「タイトルもしくは内容に特定の単語を含む」検索を行いたいとします。 .sp この場合、2つのインデックス作成方式があります。1つは、それぞれのカラムに1つずつインデックスを付与する方式です。もう1つは、複数のカラムに対して1つのインデックスを付与する方式です。Groongaでは、どちらの形式のインデックスが存在している場合でも、同一の記法で全文検索を行うことができます。 .SS カラムごとにインデックスを付与する場合 .sp カラムごとにインデックスを作成する方法はこの通りです。 .sp まず、 \fBBlog1\fP テーブルを作成し、 \fBtitle\fP カラムと \fBmessage\fP カラムを追加します。 \fBtitle\fP カラムにブログのタイトルを保存し、 \fBmessage\fP カラムにブログの本文を保存します。 .sp インデックス用の \fBIndexBlog1\fP テーブルも作り、 \fBtitle\fP カラムのインデックス用に \fBindex_title\fP カラム、 \fBmessage\fP カラムのインデックス用に \fBindex_message\fP カラムと、それぞれ1カラムごとに1つずつ追加しています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name Blog1 \-\-flags TABLE_HASH_KEY \-\-key_type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table Blog1 \-\-name title \-\-flags COLUMN_SCALAR \-\-type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table Blog1 \-\-name message \-\-flags COLUMN_SCALAR \-\-type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create \-\-name IndexBlog1 \-\-flags TABLE_PAT_KEY \-\-key_type ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table IndexBlog1 \-\-name index_title \-\-flags COLUMN_INDEX|WITH_POSITION \-\-type Blog1 \-\-source title # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table IndexBlog1 \-\-name index_message \-\-flags COLUMN_INDEX|WITH_POSITION \-\-type Blog1 \-\-source message # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Blog1 [ {"_key":"grn1","title":"Groonga test","message":"Groonga message"}, {"_key":"grn2","title":"baseball result","message":"rakutan eggs 4 \- 4 Groonga moritars"}, {"_key":"grn3","title":"Groonga message","message":"none"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] .ft P .fi .UNINDENT .UNINDENT .sp \fBmatch_columns\fP オプションで、検索対象のカラムを複数指定することが出来ます。検索する文字列は \fBquery\fP オプションで指定します。これを使うことで、タイトルと本文を全文検索することができます。 .sp 実際にブログエントリを検索してみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Blog1 \-\-match_columns title||message \-\-query groonga # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "message", # "ShortText" # ], # [ # "title", # "ShortText" # ] # ], # [ # 1, # "grn1", # "Groonga message", # "Groonga test" # ], # [ # 3, # "grn3", # "none", # "Groonga message" # ], # [ # 2, # "grn2", # "rakutan eggs 4 \- 4 Groonga moritars", # "baseball result" # ] # ] # ] # ] select \-\-table Blog1 \-\-match_columns title||message \-\-query message # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "message", # "ShortText" # ], # [ # "title", # "ShortText" # ] # ], # [ # 3, # "grn3", # "none", # "Groonga message" # ], # [ # 1, # "grn1", # "Groonga message", # "Groonga test" # ] # ] # ] # ] select \-\-table Blog1 \-\-match_columns title \-\-query message # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "message", # "ShortText" # ], # [ # "title", # "ShortText" # ] # ], # [ # 3, # "grn3", # "none", # "Groonga message" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 複数のカラムにまたがったインデックスを付与する場合 .sp Groongaでは複数のカラムにまたがったインデックスもサポートしています。 .sp インデックスカラムが1つしかないというのが違いです。 \fBtitle\fP と \fBmessage\fP の2つのカラムに対するインデックスが共通になっています。 .sp 共通のインデックスを用いても、 \fBtitle\fP カラムのみでの検索、 \fBmessage\fP カラムのみでの検索、 \fBtitle\fP もしくは \fBmessage\fP カラムでの検索、全ての検索を行うことができます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name Blog2 \-\-flags TABLE_HASH_KEY \-\-key_type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table Blog2 \-\-name title \-\-flags COLUMN_SCALAR \-\-type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table Blog2 \-\-name message \-\-flags COLUMN_SCALAR \-\-type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create \-\-name IndexBlog2 \-\-flags TABLE_PAT_KEY \-\-key_type ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table IndexBlog2 \-\-name index_blog \-\-flags COLUMN_INDEX|WITH_POSITION|WITH_SECTION \-\-type Blog2 \-\-source title,message # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Blog2 [ {"_key":"grn1","title":"Groonga test","message":"Groonga message"}, {"_key":"grn2","title":"baseball result","message":"rakutan eggs 4 \- 4 Groonga moritars"}, {"_key":"grn3","title":"Groonga message","message":"none"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] .ft P .fi .UNINDENT .UNINDENT .sp 実際に前と同じ例で検索してみましょう。結果は上の例と同じになります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Blog2 \-\-match_columns title||message \-\-query groonga # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "message", # "ShortText" # ], # [ # "title", # "ShortText" # ] # ], # [ # 1, # "grn1", # "Groonga message", # "Groonga test" # ], # [ # 2, # "grn2", # "rakutan eggs 4 \- 4 Groonga moritars", # "baseball result" # ], # [ # 3, # "grn3", # "none", # "Groonga message" # ] # ] # ] # ] select \-\-table Blog2 \-\-match_columns title||message \-\-query message # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "message", # "ShortText" # ], # [ # "title", # "ShortText" # ] # ], # [ # 1, # "grn1", # "Groonga message", # "Groonga test" # ], # [ # 3, # "grn3", # "none", # "Groonga message" # ] # ] # ] # ] select \-\-table Blog2 \-\-match_columns title \-\-query message # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "message", # "ShortText" # ], # [ # "title", # "ShortText" # ] # ], # [ # 3, # "grn3", # "none", # "Groonga message" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 "インデックスはどちらがよい方法なのか"と疑問に思うかもしれません。それは場合によります。 .INDENT 0.0 .IP \(bu 2 カラムごとのインデックス \- マルチカラムインデックスよりも更新性能が良い傾向があります。一方、ディスク使用効率はあまり良くありません。 .IP \(bu 2 マルチカラムインデックス \- バッファを共有するためディスク使用効率が良いです。一方、更新性能があまり良くありません。 .UNINDENT .UNINDENT .UNINDENT .SS インデックス名を指定した全文検索 .sp 執筆中です。 .SS カラムインデックスによる関連テーブルをまたぐ検索 .sp 複数のテーブルがカラムインデックスで関連付けられているなら、参照カラム名を指定して複数のテーブルにまたがって検索することができます。 .sp 具体的な例を示します。 .sp ブログ記事や記事のコメントを保存するテーブルがあります。記事を保存するテーブルには記事とコメントのためのカラムがあります。そしてそのコメントカラムはCommentsテーブルを参照しています。コメントを保存するテーブルにはコメントと記事テーブルに対するカラムインデックスが設定されています。 .sp 特定のキーワードをコメントに含む記事を探すには、コメントテーブルを全文検索する必要があり、全文検索結果を含むレコードをさらに検索する必要があります。 .sp しかし、カラムインデックスを指定することで一度にレコードを検索することができます。 .sp サンプルのスキーマ定義はこちらです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Comments TABLE_HASH_KEY UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Comments content COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Articles TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Articles content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Articles comment COLUMN_SCALAR Comments # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Lexicon TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Lexicon articles_content COLUMN_INDEX|WITH_POSITION Articles content # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Lexicon comments_content COLUMN_INDEX|WITH_POSITION Comments content # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Comments article COLUMN_INDEX Articles comment # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp サンプルデータはこちらです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Comments [ {"_key": 1, "content": "I\(aqm using Groonga too!"}, {"_key": 2, "content": "I\(aqm using Groonga and Mroonga!"}, {"_key": 3, "content": "I\(aqm using Mroonga too!"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] load \-\-table Articles [ {"content": "Groonga is fast!", "comment": 1}, {"content": "Groonga is useful!"}, {"content": "Mroonga is fast!", "comment": 3} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] .ft P .fi .UNINDENT .UNINDENT .sp 特定のキーワードをコメントに含むレコードを検索するクエリを書くことができ、それによりレコードを参照する記事を取得します。 .sp これまでに記述したレコードを検索するクエリ: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Articles \-\-match_columns comment.content \-\-query groonga \-\-output_columns "_id, _score, *" .ft P .fi .UNINDENT .UNINDENT .sp ArticlesテーブルのcommentカラムとCommentsテーブルのcontentカラムをピリオド( \fB\&.\fP )で連結し \fB\-\-match_columns\fP の引数とする必要があります。 .sp 最初に、このクエリはCommentsテーブルのcontentを全文検索し、次にCommentsテーブルを検索した結果のレコードを参照するArticlesテーブルのレコードを取得します。(これにより、Commentsテーブルの \fBarticle\fP インデックスカラムを生成するクエリをコメントアウトすると、意図した検索結果が得られません。) .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Articles \-\-match_columns comment.content \-\-query groonga \-\-output_columns "_id, _score, *" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_score", # "Int32" # ], # [ # "comment", # "Comments" # ], # [ # "content", # "Text" # ] # ], # [ # 1, # 1, # 1, # "Groonga is fast!" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp これで、特定のキーワードをコメントとして含む記事を検索できます。 .sp このネストしたインデックスの検索という特徴には関連するテーブルが2つだけに制限されません。 .sp 前のものと似たサンプルのスキーマ定義です。違いは\(aq返信\(aqを表現するテーブルの追加と関連するテーブルが3つに増えたことです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Replies2 TABLE_HASH_KEY UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Replies2 content COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Comments2 TABLE_HASH_KEY UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Comments2 content COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Comments2 comment COLUMN_SCALAR Replies2 # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Articles2 TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Articles2 content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Articles2 comment COLUMN_SCALAR Comments2 # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Lexicon2 TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Lexicon2 articles_content COLUMN_INDEX|WITH_POSITION Articles2 content # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Lexicon2 comments_content COLUMN_INDEX|WITH_POSITION Comments2 content # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Lexicon2 replies_content COLUMN_INDEX|WITH_POSITION Replies2 content # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Comments2 article COLUMN_INDEX Articles2 comment # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Replies2 reply_to COLUMN_INDEX Comments2 comment # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp サンプルデータはこちらです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Replies2 [ {"_key": 1, "content": "I\(aqm using Rroonga too!"}, {"_key": 2, "content": "I\(aqm using Groonga and Mroonga and Rroonga!"}, {"_key": 3, "content": "I\(aqm using Nroonga too!"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] load \-\-table Comments2 [ {"_key": 1, "content": "I\(aqm using Groonga too!", "comment": 1}, {"_key": 2, "content": "I\(aqm using Groonga and Mroonga!", "comment": 2}, {"_key": 3, "content": "I\(aqm using Mroonga too!"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] load \-\-table Articles2 [ {"content": "Groonga is fast!", "comment": 1}, {"content": "Groonga is useful!", "comment": 2}, {"content": "Mroonga is fast!", "comment": 3} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] .ft P .fi .UNINDENT .UNINDENT .sp これまでに記述したレコードを検索するクエリ: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Articles2 \-\-match_columns comment.content \-\-query mroonga \-\-output_columns "_id, _score, *" select Articles2 \-\-match_columns comment.comment.content \-\-query mroonga \-\-output_columns "_id, _score, *" .ft P .fi .UNINDENT .UNINDENT .sp 最初のクエリは \fBComments2\fP テーブルから \fBmroonga\fP を検索します。2つめのクエリは \fBReplies2\fP と \fBComments2\fP テーブルからカラムインデックスによる参照を用いて\(ga\(gamroonga\(ga\(gaを検索します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Articles2 \-\-match_columns comment.content \-\-query mroonga \-\-output_columns "_id, _score, *" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_score", # "Int32" # ], # [ # "comment", # "Comments2" # ], # [ # "content", # "Text" # ] # ], # [ # 2, # 1, # 2, # "Groonga is useful!" # ], # [ # 3, # 1, # 3, # "Mroonga is fast!" # ] # ] # ] # ] select Articles2 \-\-match_columns comment.comment.content \-\-query mroonga \-\-output_columns "_id, _score, *" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_score", # "Int32" # ], # [ # "comment", # "Comments2" # ], # [ # "content", # "Text" # ] # ], # [ # 2, # 1, # 2, # "Groonga is useful!" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 結果として、最初のクエリは \fBComments2\fP テーブルに \fBmroonga\fP をキーワードとして含むレコードが2つあるので、該当する記事2つにマッチします。 .sp 一方、2つめのクエリは \fBReplies2\fP テーブルに \fBmroonga\fP というキーワードにマッチするレコードが1つしかなく、 \fBComments2\fP テーブルでそのキーワードを含むレコードを参照するコメントが1つなので、該当する記事は1つだけとなります。 .SS インデックスの重み .sp 執筆中です。 .SS パトリシア木による前方一致検索 .sp Groongaのテーブルは、テーブル作成時にパトリシア木オプションを指定すると、前方一致検索を行うことができます。 .sp また、追加のオプションを指定することにより、主キーの後方一致検索をも行うことができます。 .SS 主キーによる前方一致検索 .sp table_createコマンドのflagsオプションにTABLE_PAT_KEYを指定することで、主キーによる前方一致検索ができるようになります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name PatPrefix \-\-flags TABLE_PAT_KEY \-\-key_type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table PatPrefix [ {"_key":"James"} {"_key":"Jason"} {"_key":"Jennifer"}, {"_key":"Jeff"}, {"_key":"John"}, {"_key":"Joseph"}, ] # [[0, 1337566253.89858, 0.000355720520019531], 6] select \-\-table PatPrefix \-\-query _key:^Je # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ] # ], # [ # 3, # "Jennifer" # ], # [ # 4, # "Jeff" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 主キーによる後方一致検索 .sp table_createコマンドのflagsオプションにTABLE_PAT_KEYとKEY_WITH_SISを指定することで、主キーによる前方一致検索・後方一致検索の両方が可能となります。 .sp KEY_WITH_SISフラグを付与すると、データを追加する際に後方一致用のレコードも追加されてしまいます。そのため、単純に検索すると、元のレコードに加えて自動的に追加されたレコードまでヒットしてしまいます。元のレコードのみ検索するために、一工夫必要になります。 .sp 例えば、元のレコードと自動的に追加されたレコードとの区別をつけるために、元のレコードであることを示すoriginalカラムを追加して、検索時にはoriginalカラムが \fBtrue\fP も検索条件に加えます。 \fB\-\-query\fP オプションでは \fBBool\fP 型の値を直感的に指定することができないので \fB\-\-filter\fP オプションを使っていることに注意してください。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name PatSuffix \-\-flags TABLE_PAT_KEY|KEY_WITH_SIS \-\-key_type ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create \-\-table PatSuffix \-\-name original \-\-type Bool # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table PatSuffix [ {"_key":"ひろゆき","original":true}, {"_key":"まろゆき","original":true}, {"_key":"ひろあき","original":true}, {"_key":"ゆきひろ","original":true} ] # [[0, 1337566253.89858, 0.000355720520019531], 4] select \-\-table PatSuffix \-\-query _key:$ゆき # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 4 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "original", # "Bool" # ] # ], # [ # 3, # "ゆき", # false # ], # [ # 2, # "ろゆき", # false # ], # [ # 5, # "まろゆき", # true # ], # [ # 1, # "ひろゆき", # true # ] # ] # ] # ] select \-\-table PatSuffix \-\-filter \(aq_key @$ "ゆき" && original == true\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "original", # "Bool" # ] # ], # [ # 5, # "まろゆき", # true # ], # [ # 1, # "ひろゆき", # true # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 全文検索用の語彙表の作成 .sp Groongaでは、全文検索に用いるための語彙表がテーブルとして扱えます。よって、語彙ごとに複数の情報を保持することができます。例えば、語彙の出現数や検索ストップワードのフラグ、単語の重要度などを保持することができます。 .sp TODO: この項目については、現在執筆中です。 .SS マイクロブログ検索システムの作成 .sp これまで学んだGroongaの機能を用いて、マイクロブログの検索システムを作成してみましょう。マイクロブログとは、Twitterのような短いメッセージを投稿するブログです。 .SS テーブルの作成 .sp まずは、テーブルを作成します。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name Users \-\-flags TABLE_HASH_KEY \-\-key_type ShortText table_create \-\-name Comments \-\-flags TABLE_HASH_KEY \-\-key_type ShortText table_create \-\-name HashTags \-\-flags TABLE_HASH_KEY \-\-key_type ShortText table_create \-\-name Bigram \-\-flags TABLE_PAT_KEY \-\-key_type ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto table_create \-\-name GeoIndex \-\-flags TABLE_PAT_KEY \-\-key_type WGS84GeoPoint column_create \-\-table Users \-\-name name \-\-flags COLUMN_SCALAR \-\-type ShortText column_create \-\-table Users \-\-name follower \-\-flags COLUMN_VECTOR \-\-type Users column_create \-\-table Users \-\-name favorites \-\-flags COLUMN_VECTOR \-\-type Comments column_create \-\-table Users \-\-name location \-\-flags COLUMN_SCALAR \-\-type WGS84GeoPoint column_create \-\-table Users \-\-name location_str \-\-flags COLUMN_SCALAR \-\-type ShortText column_create \-\-table Users \-\-name description \-\-flags COLUMN_SCALAR \-\-type ShortText column_create \-\-table Users \-\-name followee \-\-flags COLUMN_INDEX \-\-type Users \-\-source follower column_create \-\-table Comments \-\-name comment \-\-flags COLUMN_SCALAR \-\-type ShortText column_create \-\-table Comments \-\-name last_modified \-\-flags COLUMN_SCALAR \-\-type Time column_create \-\-table Comments \-\-name replied_to \-\-flags COLUMN_SCALAR \-\-type Comments column_create \-\-table Comments \-\-name replied_users \-\-flags COLUMN_VECTOR \-\-type Users column_create \-\-table Comments \-\-name hash_tags \-\-flags COLUMN_VECTOR \-\-type HashTags column_create \-\-table Comments \-\-name location \-\-flags COLUMN_SCALAR \-\-type WGS84GeoPoint column_create \-\-table Comments \-\-name posted_by \-\-flags COLUMN_SCALAR \-\-type Users column_create \-\-table Comments \-\-name favorited_by \-\-flags COLUMN_INDEX \-\-type Users \-\-source favorites column_create \-\-table HashTags \-\-name hash_index \-\-flags COLUMN_INDEX \-\-type Comments \-\-source hash_tags column_create \-\-table Bigram \-\-name users_index \-\-flags COLUMN_INDEX|WITH_POSITION|WITH_SECTION \-\-type Users \-\-source name,location_str,description column_create \-\-table Bigram \-\-name comment_index \-\-flags COLUMN_INDEX|WITH_POSITION \-\-type Comments \-\-source comment column_create \-\-table GeoIndex \-\-name users_location \-\-type Users \-\-flags COLUMN_INDEX \-\-source location column_create \-\-table GeoIndex \-\-name comments_location \-\-type Comments \-\-flags COLUMN_INDEX \-\-source location .ft P .fi .UNINDENT .UNINDENT .SS Usersテーブル .sp ユーザーの名前や自己紹介文、フォローしているユーザー一覧など、ユーザー情報を格納するためのテーブルです。 .INDENT 0.0 .TP .B \fB_key\fP ユーザーID .TP .B \fBname\fP ユーザー名 .TP .B \fBfollower\fP フォローしているユーザーの一覧 .TP .B \fBfavorites\fP お気に入りのコメント一覧 .TP .B \fBlocation\fP ユーザーの現在地(緯度経度座標) .TP .B \fBlocation_str\fP ユーザーの現在地(文字列) .TP .B \fBdescription\fP ユーザーの自己紹介 .TP .B \fBfollowee\fP \fBUsers\fP テーブルの \fBfollower\fP カラムに対するインデックス。 このインデックスを作ることで、あるユーザーをフォローしているユーザーを検索できるようになります。 .UNINDENT .SS Commentsテーブル .sp コメント内容や投稿日時、返信先情報など、コメントに関する内容を格納するテーブルです。 .INDENT 0.0 .TP .B \fB_key\fP コメントID .TP .B \fBcomment\fP コメント内容 .TP .B \fBlast_modified\fP 投稿日時 .TP .B \fBreplied_to\fP 返信元のコメント内容 .TP .B \fBreplied_users\fP 返信先のユーザーの一覧 .TP .B \fBhash_tags\fP コメントのハッシュタグの一覧 .TP .B \fBlocation\fP 投稿場所(緯度経度座標のため) .TP .B \fBposted_by\fP コメントを書いたユーザー .TP .B \fBfavorited_by\fP \fBUsers\fP テーブルの \fBfavorites\fP カラムに対するインデックス。 このインデックスを作ることで、指定したコメントを誰がお気に入りに入れているのかを検索できるようになります。 .UNINDENT .SS HashTagsテーブル .sp コメントのハッシュタグを一覧で保存するためのテーブルです。 .INDENT 0.0 .TP .B \fB_key\fP ハッシュタグ .TP .B \fBhash_index\fP 「Comments.hash_tags」のインデックス。 このインデックスを作ることで、指定したハッシュタグのついているコメントの一覧を出すことが出来るようになります。 .UNINDENT .SS Bigramテーブル .sp ユーザー情報・コメントで全文検索が出来るようにするためのインデックスを格納するテーブルです。 .INDENT 0.0 .TP .B \fB_key\fP 単語 .TP .B \fBusers_index\fP ユーザー情報のインデックス。 このカラムは、ユーザー名「Users.name」、現在地「Users.location_str」、自己紹介文「Users.description」のインデックスになっています。 .TP .B \fBcomment_index\fP コメント内容「Comments.comment」のインデックス .UNINDENT .SS GeoIndexテーブル .sp 位置情報検索を効果的に行うための locationカラムのインデックスを保持するテーブルです。 .INDENT 0.0 .TP .B \fBusers_location\fP Usersテーブルのlocationカラムに対するインデックス .TP .B \fBcomments_location\fP Commentsテーブルのlocationカラムに対するインデックス .UNINDENT .SS データのロード .sp つづいて、テスト用データをロードします。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Users [ { "_key": "alice", "name": "Alice", "follower": ["bob"], "favorites": [], "location": "152489000x\-255829000", "location_str": "Boston, Massachusetts", "description": "Groonga developer" }, { "_key": "bob", "name": "Bob", "follower": ["alice","charlie"], "favorites": ["alice:1","charlie:1"], "location": "146249000x\-266228000", "location_str": "Brooklyn, New York City", "description": "" }, { "_key": "charlie", "name": "Charlie", "follower": ["alice","bob"], "favorites": ["alice:1","bob:1"], "location": "146607190x\-267021260", "location_str": "Newark, New Jersey", "description": "Hmm,Hmm" } ] load \-\-table Comments [ { "_key": "alice:1", "comment": "I\(aqve created micro\-blog!", "last_modified": "2010/03/17 12:05:00", "posted_by": "alice", }, { "_key": "bob:1", "comment": "First post. test,test...", "last_modified": "2010/03/17 12:00:00", "posted_by": "bob", }, { "_key": "alice:2", "comment": "@bob Welcome!!!", "last_modified": "2010/03/17 12:05:00", "replied_to": "bob:1", "replied_users": ["bob"], "posted_by": "alice", }, { "_key": "bob:2", "comment": "@alice Thanks!", "last_modified": "2010/03/17 13:00:00", "replied_to": "alice:2", "replied_users": ["alice"], "posted_by": "bob", }, { "_key": "bob:3", "comment": "I\(aqve just used \(aqTry\-Groonga\(aq now! #groonga", "last_modified": "2010/03/17 14:00:00", "hash_tags": ["groonga"], "location": "146566000x\-266422000", "posted_by": "bob", }, { "_key": "bob:4", "comment": "I\(aqm come at city of New York for development camp! #groonga #travel", "last_modified": "2010/03/17 14:05:00", "hash_tags": ["groonga", "travel"], "location": "146566000x\-266422000", "posted_by": "bob", }, { "_key": "charlie:1", "comment": "@alice @bob I\(aqve tried to register!", "last_modified": "2010/03/17 15:00:00", "replied_users": ["alice", "bob"], "location": "146607190x\-267021260", "posted_by": "charlie", } { "_key": "charlie:2", "comment": "I\(aqm at the Museum of Modern Art in NY now!", "last_modified": "2010/03/17 15:05:00", "location": "146741340x\-266319590", "posted_by": "charlie", } ] .ft P .fi .UNINDENT .UNINDENT .sp \fBUsers\fP テーブルの \fBfollower\fP カラムと \fBfavorites\fP カラム、そして \fBComments\fP テーブルの \fBreplied_users\fP カラムは、ベクターカラムです。そのため、これらのカラムは配列で値を指定します。 .sp \fBUsers\fP テーブルの \fBlocation\fP カラムと、\fBComments\fP テーブルの \fBlocation\fP カラムは、 \fBGeoPoint\fP 型です。この型での値の指定は、"[緯度]x[経度]"と記述して指定します。 .sp \fBComments\fP テーブルの \fBlast_modified\fP カラムは、Time型です。 .sp この型での値を指定する方法は2つあります。1つ目の方法は、1970年1月1日0時0分0秒からの経過秒数の値を直接指定する方法です。このとき、小数部分を指定することでマイクロ秒数での指定が可能です。指定した値は、データのロードの際にマイクロ秒を単位とする整数値に変換後、格納されます。 2つ目の方法は、文字列で日時と時刻を指定する方法です。"年/月/日 時:分:秒"というフォーマットで記述することで、データロードの際に文字列からキャストされ、マイクロ秒数の値が格納されます。 .SS 検索 .sp マイクロブログを検索してみましょう。 .SS キーワードでユーザー検索 .sp ここでは、 \fBmatch_columns\fP で扱った、複数カラムを対象とした検索を行います。 .sp 指定された文字列で、ユーザー名・現在地・自己紹介文を対象に検索をします。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Users \-\-match_columns name,location_str,description \-\-query "New York" \-\-output_columns _key,name # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], true] # [[0, 1337566253.89858, 0.000355720520019531], 3] # [[0, 1337566253.89858, 0.000355720520019531], 8] # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ] # ], # [ # "bob", # "Bob" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 「New York」をキーワードにユーザー検索した結果、New Yorkに住んでいる「Bob」がヒットしました。 .SS 位置情報(GeoPoint)でユーザー検索 .sp ここでは、GeoPoint型のカラムで検索をします。GeoPoint型については \fBsearch\fP を参照してください。 .sp 次の例では、特定の場所から20km以内に住んでいる人を検索します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Users \-\-filter \(aqgeo_in_circle(location,"146710080x\-266315480",20000)\(aq \-\-output_columns _key,name # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ] # ], # [ # "charlie", # "Charlie" # ], # [ # "bob", # "Bob" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 「Bob」と「Charlie」が「Grand Central Terminal」から20km以内に住んでいることがわかります。 .SS あるユーザーをフォローしてるユーザーの検索 .sp ここでは、 \fBindex\fP の参照関係の逆引きをします。 .sp 次の例は、 \fBUsers\fP テーブルの \fBfollower\fP カラムにあるフォローリストを逆引きします。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Users \-\-query follower:@bob \-\-output_columns _key,name # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ] # ], # [ # "alice", # "Alice" # ], # [ # "charlie", # "Charlie" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 「Alice」と「Charlie」が「Bob」をフォローしていることがわかります。 .SS GeoPointでコメント検索 .sp ある範囲内で書かれたコメントを検索します。 .sp また、 \fBdrilldown\fP をおこないます。検索結果をハッシュタグとユーザーでドリルダウンし、ユーザー別・ハッシュタグ別のカウントを出します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Comments \-\-filter \(aqgeo_in_circle(location,"146867000x\-266280000",20000)\(aq \-\-output_columns posted_by.name,comment \-\-drilldown hash_tags,posted_by # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 4 # ], # [ # [ # "posted_by.name", # "ShortText" # ], # [ # "comment", # "ShortText" # ] # ], # [ # "Charlie", # "I\(aqm at the Museum of Modern Art in NY now!" # ], # [ # "Bob", # "I\(aqve just used \(aqTry\-Groonga\(aq now! #groonga" # ], # [ # "Bob", # "I\(aqm come at city of New York for development camp! #groonga #travel" # ], # [ # "Charlie", # "@alice @bob I\(aqve tried to register!" # ] # ], # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "groonga", # 2 # ], # [ # "travel", # 1 # ] # ], # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "charlie", # 2 # ], # [ # "bob", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このクエリは、ニューヨークのセントラルパークから20km圏内で投稿されたコメントを検索します。 .sp 指定した範囲が20kmなので、位置情報を含むすべてのコメントが検索されました。#groongaというハッシュタグが2件、#travelというハッシュタグが1件で、BobとCharlieがコメントしているのは2件あります。 .SS キーワードでコメント検索 .sp あるキーワードを含むコメントを検索します。そして、 \fBsearch\fP で言及している \fI_score\fP を出してみます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Comments \-\-query comment:@Now \-\-output_columns comment,_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "comment", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "I\(aqve just used \(aqTry\-Groonga\(aq now! #groonga", # 1 # ], # [ # "I\(aqm at the Museum of Modern Art in NY now!", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \(aqNow\(aqをキーワードに使っているので、このクエリは2件のコメントを返します。 \fI_score\fP の値として \(aqNow\(aqのカウントを含んでいます。 .SS キーワードと位置情報で検索 .sp あるキーワードと位置情報の両方でコメントを検索します。 \fI\-\-query\fP と \fI\-\-filter\fP オプションの両方を使用した場合、両方の条件に一致するレコードを返します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Comments \-\-query comment:@New \-\-filter \(aqgeo_in_circle(location,"146867000x\-266280000",20000)\(aq \-\-output_columns posted_by.name,comment \-\-drilldown hash_tags,posted_by # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "posted_by.name", # "ShortText" # ], # [ # "comment", # "ShortText" # ] # ], # [ # "Bob", # "I\(aqm come at city of New York for development camp! #groonga #travel" # ] # ], # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "groonga", # 1 # ], # [ # "travel", # 1 # ] # ], # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "bob", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 両方の条件をみたすコメントが1件あります。ドリルダウンの結果も含まれ、Bobによるコメントであることがわかります。 .SS ハッシュタグでコメントを検索 .sp あるハッシュタグのついているコメントを検索します。テーブルの参照関係を逆にたどってみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Comments \-\-query hash_tags:@groonga \-\-output_columns posted_by.name,comment \-\-drilldown posted_by # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "posted_by.name", # "ShortText" # ], # [ # "comment", # "ShortText" # ] # ], # [ # "Bob", # "I\(aqve just used \(aqTry\-Groonga\(aq now! #groonga" # ], # [ # "Bob", # "I\(aqm come at city of New York for development camp! #groonga #travel" # ] # ], # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "bob", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このクエリは#groongaハッシュタグを含む2件のコメントを返します。投稿者のドリルダウン結果を2件含んでいて、Bobが投稿したことがわかります。 .SS ユーザーIDでコメントを検索 .sp あるユーザーが投稿したコメントを検索します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Comments \-\-query posted_by:bob \-\-output_columns comment \-\-drilldown hash_tags # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 4 # ], # [ # [ # "comment", # "ShortText" # ] # ], # [ # "First post. test,test..." # ], # [ # "@alice Thanks!" # ], # [ # "I\(aqve just used \(aqTry\-Groonga\(aq now! #groonga" # ], # [ # "I\(aqm come at city of New York for development camp! #groonga #travel" # ] # ], # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "groonga", # 2 # ], # [ # "travel", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このクエリはBobによる4件のコメントを返します。ハッシュタグによるドリルダウン結果も含まれ、#groongaが2件、#travelが1件であることがわかります。 .SS ユーザーのお気に入りのコメント一覧 .sp あるユーザーのお気に入りコメントを検索します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-table Users \-\-query _key:bob \-\-output_columns favorites.posted_by,favorites.comment # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "favorites.posted_by", # "Users" # ], # [ # "favorites.comment", # "ShortText" # ] # ], # [ # [ # "alice", # "charlie" # ], # [ # "I\(aqve created micro\-blog!", # "@alice @bob I\(aqve tried to register!" # ] # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このクエリはBobのお気に入りのコメント一覧を返します。 .SS 投稿時間でコメントを検索 .sp コメントの投稿時間で検索をします。\fITime\fP 型については \fBdata\fP を参照してください。 .sp ある時刻よりも古いコメントを検索します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Comments \-\-filter \(aqlast_modified<=1268802000\(aq \-\-output_columns posted_by.name,comment,last_modified \-\-drilldown hash_tags,posted_by # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "posted_by.name", # "ShortText" # ], # [ # "comment", # "ShortText" # ], # [ # "last_modified", # "Time" # ] # ], # [ # "Alice", # "I\(aqve created micro\-blog!", # 1268795100.0 # ], # [ # "Bob", # "First post. test,test...", # 1268794800.0 # ], # [ # "Alice", # "@bob Welcome!!!", # 1268795100.0 # ], # [ # "Bob", # "@alice Thanks!", # 1268798400.0 # ], # [ # "Bob", # "I\(aqve just used \(aqTry\-Groonga\(aq now! #groonga", # 1268802000.0 # ] # ], # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "groonga", # 1 # ] # ], # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "alice", # 2 # ], # [ # "bob", # 3 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このクエリは2010/03/17 14:00:00以前の5件のコメントを返します。投稿者によるドリルダウン結果も含まれ、Aliceが2件、Bobが3件であることがわかります。 .SS クエリ拡張 .sp Groongaの \fB/reference/commands/select\fP コマンドは \fBquery_expander\fP 引数を受付ます。これを使うとクエリ文字列を拡張することができます。 .sp 例えば、"theater"ではなく"theatre"で検索したとしましょう。クエリ拡張では"theater OR theatre"の結果を返します。このようなやりかたで検索漏れを減らせます。これはユーザーが本当にやりたかったことです。 .SS 準備 .sp クエリ拡張を使うには、文書を格納するテーブルと検索文字列と置換文字列のペアを格納する置換テーブルを作る必要があります。置換テーブルでは主キーが元の文字列、ShortText型のカラムが置換後の文字列をあらわします。 .sp それでは文書テーブルと置換テーブルを作成しましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Doc TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Doc body COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Term TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Term Doc_body COLUMN_INDEX|WITH_POSITION Doc body # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Synonym TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Synonym body COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Doc [ {"_key": "001", "body": "Play all night in this theater."}, {"_key": "002", "body": "theatre is British spelling."}, ] # [[0, 1337566253.89858, 0.000355720520019531], 2] load \-\-table Synonym [ {"_key": "theater", "body": "(theater OR theatre)"}, {"_key": "theatre", "body": "(theater OR theatre)"}, ] # [[0, 1337566253.89858, 0.000355720520019531], 2] .ft P .fi .UNINDENT .UNINDENT .sp このようにすると、検索漏れは起こりません。これは置換テーブルがクエリ文字列として"theater"も"theatre"のいずれも受け付けるからです。 .SS 検索 .sp では、準備した置換テーブルを使ってみます。まずは \fBquery_expander\fP を使わずに \fBselect\fP コマンドを実行してみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Doc \-\-match_columns body \-\-query "theater" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "body", # "ShortText" # ] # ], # [ # 1, # "001", # "Play all night in this theater." # ] # ] # ] # ] select Doc \-\-match_columns body \-\-query "theatre" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "body", # "ShortText" # ] # ], # [ # 2, # "002", # "theatre is British spelling." # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このクエリではクエリ文字列に完全に一致するレコードを返します。 .sp では、 \fBquery_expander\fP を \fBSynonym\fP テーブルの \fBbody\fP カラムに対して使ってみましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Doc \-\-match_columns body \-\-query "theater" \-\-query_expander Synonym.body # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "body", # "ShortText" # ] # ], # [ # 1, # "001", # "Play all night in this theater." # ], # [ # 2, # "002", # "theatre is British spelling." # ] # ] # ] # ] select Doc \-\-match_columns body \-\-query "theatre" \-\-query_expander Synonym.body # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "body", # "ShortText" # ] # ], # [ # 1, # "001", # "Play all night in this theater." # ], # [ # 2, # "002", # "theatre is British spelling." # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この場合、クエリ文字列は "theater OR theatre" へと置き換えられます。つまり、検索時に表記揺れを考慮して検索できます。 .SH サーバー .SS サーバーパッケージ .sp \fBgroonga\fP パッケージは全文検索を行うための最小構成のパッケージです。サーバー用途で使うために、設定済みのパッケージを追加でインストールすることができます。 .sp サーバー用途の2つのパッケージがあります。 .INDENT 0.0 .IP \(bu 2 \fBgroonga\-httpd\fP (nginxをベースにしたHTTPサーバー) .IP \(bu 2 \fBgroonga\-server\-gqtp\fP (\fB/spec/gqtp\fP サーバー) .UNINDENT .sp groongaがGQTPだけでなく、2つのHTTPサーバーパッケージをサポートしているのには理由があります。 \fB/spec/gqtp\fP \- Groonga Query Transfer Protocol はオーバーヘッドを低減し、パフォーマンスを向上させるように設計されていますが、HTTPプロトコルほどクライアントライブラリのサポートがありません。HTTPは枯れたプロトコルなので既存のツールを活用できたり、多くのクライアントライブラリが存在します。(詳細は \fI\%関連プロジェクト\fP を参照) \fBgroonga\-httpd\fP パッケージを使うと nginxの機能の恩恵を受けることができます。 .sp 最初は \fBgroonga\-httpd\fP パッケージを使うことをおすすめします。プロトコルのオーバーヘッドがパフォーマンス上問題となったら \fBgroonga\-server\-gqtp\fP を検討してください。 .INDENT 0.0 .INDENT 3.5 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 In the previous versions, there is a \fBgroonga\-server\-http\fP package (simple HTTP protocol based server package). It is now marked as obsolete, please use \fBgroonga\-httpd\fP packages instead. \fBgroonga\-server\-http\fP package became a transitional package for \fBgroonga\-httpd\fP\&. .UNINDENT .UNINDENT .UNINDENT .UNINDENT .SS groonga\-httpd .sp \fBgroonga\-httpd\fP はnginxをベースにしたHTTPサーバーパッケージです。 .sp 設定済みの内容: .TS center; |l|l|. _ T{ 項目 T} T{ 既定値 T} _ T{ ポート番号 T} T{ 10041 T} _ T{ アクセスログ T} T{ /var/log/groonga/httpd/acccess.log T} _ T{ エラーログ T} T{ /var/log/groonga/http\-query.log T} _ T{ データベース T} T{ /var/lib/groonga/db/* T} _ T{ 設定ファイル T} T{ /etc/groonga/httpd/groonga\-httpd.conf T} _ .TE .SS HTTPサーバーを起動 .sp groonga HTTPサーバーを起動(Debian/Ubuntu/CentOS): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo service groonga\-httpd start .ft P .fi .UNINDENT .UNINDENT .sp groonga HTTPサーバーを起動(Fedora): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo systemctl start groonga\-httpd .ft P .fi .UNINDENT .UNINDENT .SS HTTPサーバーを終了 .sp groonga HTTPサーバーを終了(Debian/Ubuntu/CentOS): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo service groonga\-httpd stop .ft P .fi .UNINDENT .UNINDENT .sp groonga HTTPサーバーを起動(Fedora): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo systemctl stop groonga\-httpd .ft P .fi .UNINDENT .UNINDENT .SS HTTPサーバーを再起動 .sp groonga HTTPサーバーを再起動(Debian/Ubuntu/CentOS): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo service groonga\-httpd restart .ft P .fi .UNINDENT .UNINDENT .sp groonga HTTPサーバーを再起動(Fedora): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo systemctl restart groonga\-httpd .ft P .fi .UNINDENT .UNINDENT .SS groonga\-server\-gqtp .sp \fBgroonga\-server\-gqtp\fP は \fB/spec/gqtp\fP サーバーパッケージです。 .TS center; |l|l|. _ T{ 項目 T} T{ 既定値 T} _ T{ ポート番号 T} T{ 10043 T} _ T{ process\-log T} T{ /var/log/groonga/groonga\-gqtp.log T} _ T{ query\-log T} T{ /var/log/groonga/gqtp\-query.log T} _ T{ データベース T} T{ /var/lib/groonga/db/* T} _ .TE .sp サーバー設定ファイル (Debian/Ubuntu): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C /etc/default/groonga/groonga\-server\-gqtp .ft P .fi .UNINDENT .UNINDENT .sp サーバー設定ファイル(CentOS): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C /etc/sysconfig/groonga\-server\-gqtp .ft P .fi .UNINDENT .UNINDENT .SS GQTPサーバーを起動 .sp groonga GQTPサーバーを起動(Debian/Ubuntu/CentOS): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo service groonga\-server\-gqtp start .ft P .fi .UNINDENT .UNINDENT .sp groonga GQTPサーバーを起動(Fedora): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo systemctl start groonga\-server\-gqtp .ft P .fi .UNINDENT .UNINDENT .SS GQTPサーバーを終了 .sp groonga GQTPサーバーを終了(Debian/Ubuntu/CentOS): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo service groonga\-server\-http stop .ft P .fi .UNINDENT .UNINDENT .sp groonga GQTPサーバーを終了(Fedora): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo systemctl stop groonga\-server\-gqtp .ft P .fi .UNINDENT .UNINDENT .SS GQTPサーバーを再起動 .sp groonga HTTPサーバーを再起動(Debian/Ubuntu/CentOS): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo service groonga\-server\-gqtp restart .ft P .fi .UNINDENT .UNINDENT .sp groonga HTTPサーバーを再起動(Fedora): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo systemctl restart groonga\-server\-gqtp .ft P .fi .UNINDENT .UNINDENT .SS groonga\-server\-http .sp \fBgroonga\-server\-http\fP は簡易HTTPサーバーパッケージです。 .INDENT 0.0 .INDENT 3.5 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \fBgroonga\-server\-http\fP package is the transitional package since Groonga 4.0.8. Please use \fBgroonga\-httpd\fP instead. .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp 設定済みの内容: .TS center; |l|l|. _ T{ 項目 T} T{ 既定値 T} _ T{ ポート番号 T} T{ 10041 T} _ T{ process\-log T} T{ /var/log/groonga/groonga\-http.log T} _ T{ query\-log T} T{ /var/log/groonga/http\-query.log T} _ T{ データベース T} T{ /var/lib/groonga/db/* T} _ .TE .sp サーバー設定ファイル (Debian/Ubuntu): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C /etc/default/groonga/groonga\-server\-http .ft P .fi .UNINDENT .UNINDENT .sp サーバー設定ファイル(CentOS): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C /etc/sysconfig/groonga\-server\-http .ft P .fi .UNINDENT .UNINDENT .SS HTTPサーバーを起動 .sp groonga HTTPサーバーを起動(Debian/Ubuntu/CentOS): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo service groonga\-server\-http start .ft P .fi .UNINDENT .UNINDENT .sp groonga HTTPサーバーを起動(Fedora): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo systemctl start groonga\-server\-http .ft P .fi .UNINDENT .UNINDENT .SS HTTPサーバーを終了 .sp groonga HTTPサーバーを終了(Debian/Ubuntu/CentOS): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo service groonga\-server\-http stop .ft P .fi .UNINDENT .UNINDENT .sp groonga HTTPサーバーを終了(Fedora): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo systemctl stop groonga\-server\-http .ft P .fi .UNINDENT .UNINDENT .SS HTTPサーバーを再起動 .sp groonga HTTPサーバーを再起動(Debian/Ubuntu/CentOS): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo service groonga\-server\-http restart .ft P .fi .UNINDENT .UNINDENT .sp groonga HTTPサーバーを再起動(Fedora): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo systemctl restart groonga\-server\-http .ft P .fi .UNINDENT .UNINDENT .SS HTTP .sp Groongaは2つのHTTPサーバー実装を提供しています。 .INDENT 0.0 .IP \(bu 2 \fBhttp/groonga\fP .IP \(bu 2 \fBhttp/groonga\-httpd\fP .UNINDENT .sp \fBhttp/groonga\fP はシンプルな実装です。高速に動作しますがHTTPの機能の多くは実装されていません。コマンドラインオプションをいくつか指定するだけで動くのでGroongaを簡単に試すことができます。 .sp \fBhttp/groonga\-httpd\fP は \fI\%nginx\fP をベースにした実装です。この実装も高速に動作します。しかも多くのHTTPの機能を使えます。 .SS 比較 .sp \fBgroonga\fP と \fBgroonga\-httpd\fP にはたくさんの違いがあります。以下はそれらの違いを示す比較表です。 .TS center; |l|l|l|. _ T{ T} T{ groonga T} T{ groonga\-httpd T} _ T{ 性能 T} T{ ○ T} T{ ○ T} _ T{ 複数CPUコア対応 T} T{ ○(マルチスレッドで対応) T} T{ ○(マルチプロセスで対応) T} _ T{ 設定ファイル T} T{ なくてもよい T} T{ 必須 T} _ T{ プレフィックスパスの変更 T} T{ × T} T{ ○ T} _ T{ コマンドバージョンの変更 T} T{ ○ T} T{ ○ T} _ T{ 複数データベース T} T{ × T} T{ ○ T} _ T{ 認証 T} T{ × T} T{ ○ T} _ T{ gzip圧縮 T} T{ × T} T{ ○ T} _ T{ POST T} T{ ○ T} T{ ○ T} _ T{ HTTPS T} T{ × T} T{ ○ T} _ T{ アクセスログ T} T{ × T} T{ ○ T} _ T{ ダウンタイムなしでのアップグレード T} T{ × T} T{ ○ T} _ .TE .SS 性能 .sp \fBgroonga\fP と \fBgroonga\-httpd\fP はどちらも非常に高速です。どちらも同じスループットで動きます。 .SS 複数CPUコア対応 .sp Groongaは複数のCPUコアを使って性能を向上できます。 \fBgroonga\fP はマルチスレッドを使って性能を向上させます。 \fBgroonga\-httpd\fP はマルチプロセスを使って性能を向上させます。 .sp \fBgroonga\fP はデフォルトでCPUコアと同じ数のスレッドを使います。もし、CPUコアが8個あった場合は、デフォルトで8個のスレッドを使います。 .sp \fBgroonga\-httpd\fP はデフォルトで1つのプロセスを使います。複数のCPUコアを使う場合は \fI\%worker_processes\fP ディレクティブを設定する必要があります。CPUコアが8個ある場合は、以下のように設定ファイルに \fBworker_processes 8\fP と指定します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C worker_processes 8; http { # ... } .ft P .fi .UNINDENT .UNINDENT .SS 設定ファイル .sp \fBgroonga\fP は設定ファイルがなくても動きます。ポート番号や最大スレッド数などといった設定項目はすべてコマンドラインから指定できます。設定ファイルを使っても設定項目を指定することができます。 .sp \fBgroonga\fP はいくつかのオプションを指定するだけで実行できるので、非常に簡単にgroonga用のHTTPサーバーを起動することができます。以下は \fBgroonga\fP でHTTPサーバーを起動する一番簡単なコマンドラインです。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-\-protocol http \-d /PATH/TO/DATABASE .ft P .fi .UNINDENT .UNINDENT .sp \fBgroonga\-httpd\fP を実行するには設定ファイルが必須です。以下は \fBgroonga\-httpd\fP でHTTPサーバーを実行する一番簡単な設定ファイルです。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C events { } http { server { listen 10041; location /d/ { groonga on; groonga_database /PATH/TO/DATABASE; } } } .ft P .fi .UNINDENT .UNINDENT .SS プレフィックスパスの変更 .sp \fBgroonga\fP は \fB/d/\fP から始まるパスをコマンドURLとして受け付けます。例えば、 \fBhttp://localhost:10041/d/status\fP となります。この \fB/d/\fP というプレフィックスパスを変更することはできません。 .sp \fBgroonga\-httpd\fP はプレフィックスパスを変更することができます。例えば、 \fBhttp://localhost:10041/api/status\fP というコマンドURLを使うことができます。以下は \fB/api/\fP をプレフィックスパスとして使う設定例です。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C events { } http { server { listen 10041; location /api/ { # <\- change this groonga on; groonga_database /PATH/TO/DATABASE; } } } .ft P .fi .UNINDENT .UNINDENT .SS コマンドバージョンの変更 .sp Groongaには \fB/reference/command/command_version\fP という仕組みがあります。これは後方互換性を維持したままgroongaコマンドをアップグレードするための仕組みです。 .sp \fBgroonga\fP は \fB\-\-default\-command\-version\fP オプションでデフォルトのコマンドバージョンを変更できます。以下はデフォルトのコマンドバージョンとしてコマンドバージョン2を使うコマンドライン例です。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-\-protocol http \-\-default\-command\-version 2 \-d /PATH/TO/DATABASE .ft P .fi .UNINDENT .UNINDENT .sp \fBgroonga\-httpd\fP はまだデフォルトのコマンドバージョンを変更できません。しかし、すぐにサポートする予定です。サポートされたら、同じ \fBgroonga\-httpd\fP プロセス内で異なったコマンドバージョンのgroongaコマンドを提供できます。以下はコマンドバージョン1のコマンドを \fB/api/1/\fP 以下で、コマンドバージョン2のコマンドを \fB/api/2/\fP 以下で提供するための設定例です。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C events { } http { server { listen 10041; groonga_database /PATH/TO/DATABASE; location /api/1/ { groonga on; groogna_default_command_version 1; } location /api/2/ { groonga on; groogna_default_command_version 2; } } } .ft P .fi .UNINDENT .UNINDENT .SS 複数データベース .sp \fBgroonga\fP は1つのプロセスで1つのデータベースしか使うことができません。 .sp \fBgroonga\-httpd\fP は同一プロセス内で複数のデータベースを使うことができます。以下は \fB/tmp/db1\fP にあるデータベースを \fB/db1/\fP 以下で、 \fB/tmp/db2\fP にあるデータベースを \fB/db2/\fP 以下で提供する設定例です。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C events { } http { server { listen 10041; location /db1/ { groonga on; groonga_database /tmp/db1; } location /db2/ { groonga on; groonga_database /tmp/db2; } } } .ft P .fi .UNINDENT .UNINDENT .SS 認証 .sp HTTPではベーシック認証やダイジェスト認証などの認証方法をサポートしています。認証することにより \fB/reference/commands/shutdown\fP などのように危険なコマンドの実行を制限することができます。 .sp \fBgroonga\fP では認証できません。危険なコマンドの使用を制限するためには、iptablesやリバースプロキシなど他のツールを使う必要があります。 .sp \fBgroonga\-httpd\fP はベーシック認証をサポートしています。以下は \fB/reference/commands/shutdown\fP コマンドの使用を制限する設定例です。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C events { } http { server { listen 10041; groonga_database /PATH/TO/DATABASE; location /d/shutdown { groonga on; auth_basic "manager is required!"; auth_basic_user_file "/etc/managers.htpasswd"; } location /d/ { groonga on; } } } .ft P .fi .UNINDENT .UNINDENT .SS gzip圧縮 .sp HTTPは \fBContent\-Encoding: gzip\fP レスポンスヘッダーを付けてgzipでレスポンスを圧縮する機能をサポートしています。これはネットワーク流量を小さくすることができます。大きな検索結果を返すときに有用です。 .sp \fBgroonga\fP は圧縮をサポートしていません。圧縮をサポートするためには、リバースプロキシを使う必要があります。 .sp \fBgroonga\-httpd\fP はgzip圧縮をサポートしています。以下はレスポンスをgzipで圧縮する設定例です。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C events { } http { server { listen 10041; groonga_database /PATH/TO/DATABASE; location /d/ { groonga on; gzip on; gzip_types *; } } } .ft P .fi .UNINDENT .UNINDENT .sp \fIgzip_types *\fP を指定していることに注意してください。この設定はとても重要な設定です。 \fIgzip_types\fP はgzip対象のデータフォーマットをMIMEタイプで指定します。 \fBgroonga\-httpd\fP は JSON、XML、MessagePackのどれかのフォーマットでデータを返します。しかし、これらのフォーマットは \fIgzip_types\fP のデフォルト値に含まれていません。 \fIgzip_types\fP のデフォルト値は \fItext/html\fP です。 .sp \fBgroonga\-httpd\fP のレスポンスデータをgzip圧縮するには、明示的に \fIgzip_types *\fP または \fIgzip_types application/json text/xml application/x\-msgpack\fP と指定する必要があります。 \fIgzip_types *\fP の方がおすすめです。理由は2つあります。1つは、groongaが、将来、他のフォーマットもサポートする可能性もあるからという理由です。2つめは、この \fIlocation\fP のすべてのリクエストはgroongaが処理するので、他のモジュールのことについて考えなくてもよいからという理由です。 .SS POST .sp JSONデータをPOSTすることでデータをロードすることができます。POSTでロードする場合は以下のルールに従ってください。 .INDENT 0.0 .IP \(bu 2 \fIContent\-Type\fP ヘッダーの値を \fIapplication/json\fP にする。 .IP \(bu 2 JSONデータはbodyとして送る。 .IP \(bu 2 テーブル名は \fBtable=名前\fP というようにクエリーパラメーターで指定する。 .UNINDENT .sp 以下はcurlを使って \fIalice\fP と \fIbob\fP という2人のユーザーを \fIUsers\fP テーブルにロードするコマンドラインの例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % curl \-\-data\-binary \(aq[{"_key": "alice"}, {"_key": "bob"}]\(aq \-H "Content\-Type: application/json" "http://localhost:10041/d/load?table=Users" .ft P .fi .UNINDENT .UNINDENT .SS HTTPS .sp TODO .SS アクセスログ .sp TODO .SS ダウンタイムなしでのアップグレード .sp TODO .SS groonga .sp TODO .SS groonga\-httpd .sp TODO .SS GQTP .SS Summary .sp GQTP is the acronym standing for "Groonga Query Transfer Protocol". .sp GQTP is a protocol designed for Groonga. It\(aqs a stateful protocol. You can send multiple commands in one session. .sp GQTP will be faster rather than \fB/server/http\fP when you send many light commands like \fB/reference/commands/status\fP\&. GQTP will be almost same performance as HTTP when you send heavy commands like \fB/reference/commands/select\fP\&. .sp We recommend that you use HTTP for many cases. Because there are many HTTP client libraries. .sp If you want to use GQTP, you can use the following libraries: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 Ruby: \fI\%groonga\-client\fP .IP \(bu 2 Python: \fI\%poyonga\fP .IP \(bu 2 Go: \fI\%goroo\fP .IP \(bu 2 PHP: \fI\%proonga\fP .IP \(bu 2 C/C++: Groonga (Groonga can be also used as library) .UNINDENT .UNINDENT .UNINDENT .sp ライブラリではありませんが、\fB/reference/executables/groonga\fP をGQTPクライアントとして使えます。 .SS How to run .sp \fB/reference/executables/groonga\fP is a GQTP server implementation. You can run a Groonga server by the following command line: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga \-\-protocol gqtp \-s [options] DB_PATH .ft P .fi .UNINDENT .UNINDENT .sp You can run a Groonga server as a daemon by the following command line: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga \-\-protocol gqtp \-d [options] DB_PATH .ft P .fi .UNINDENT .UNINDENT .sp 利用可能なオプションについては、 \fB/reference/executables/groonga\fP を参照してください。 .SS Memcachedバイナリプロトコル .sp Groongaはmemcachedバイナリプロトコルをサポートしています。以下の書式はmemcachedバイナリプロトコルのサーバをデーモンとして起動する方法を示しています。 .sp Form: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [\-p PORT_NUMBER] \-d \-\-protocol memcached DB_PATH .ft P .fi .UNINDENT .UNINDENT .sp \fI\-\-protocol\fP オプションとその引数により、サーバのプロトコルを指定することができます。"memcached"はmemcachedバイナリプロトコルを示しています。 .SH クライアント .sp Groongaは、Groongaの専用プロトコルである \fB/spec/gqtp\fP 、memcachedバイナリプロトコル、HTTPの三種類をサポートしています。 .sp HTTPとmemcachedバイナリプロトコルは、枯れたプロトコルなので既存のクライアントライブラリを利用することができます。 .sp いくつかのプログラミング言語ではGroongaサーバーに接続するための便利なAPIを提供するクライアントライブラリがあります。詳細は、\fI\%クライアントライブラリ\fP を参照して下さい。 .SH リファレンスマニュアル .SS 実行ファイル .sp groongaパッケージが提供する実行ファイルについて説明します。 .SS \fBgrndb\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 この実行ファイルは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 4.0.9 で追加. .sp \fBgrndb\fP はGroongaのデータベースを管理します。 .sp 機能は次の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 データベースが壊れているかどうかをチェックする。 .IP \(bu 2 壊れたデータベースが復旧可能なら自動でデータベースを復旧する。 .UNINDENT .UNINDENT .UNINDENT .SS 構文 .sp \fBgrndb\fP にはコマンドとデータベースのパスを渡します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C grndb COMMAND [OPTIONS] DATABASE_PATH .ft P .fi .UNINDENT .UNINDENT .sp 利用可能なコマンドは以下の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBcheck\fP \- データベースが壊れているかどうかをチェックします。 .IP \(bu 2 \fBrecover\fP \- データベースを復旧します。 .UNINDENT .UNINDENT .UNINDENT .SS 使い方 .sp 以下は \fB/var/lib/groonga/db/db\fP にあるデータベースをチェックする例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ grndb check /var/lib/groonga/db/db .ft P .fi .UNINDENT .UNINDENT .sp 以下は \fB/var/lib/groonga/db/db\fP にあるデータベースを復旧する例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ grndb recover /var/lib/groonga/db/db .ft P .fi .UNINDENT .UNINDENT .SS コマンド一覧 .sp このセクションでは利用可能なコマンドについて説明します。 .SS \fBcheck\fP .sp 既存のGroongaデータベースをチェックします。もし、データベースが壊れていたら \fBgrndb\fP は詳細を報告し、 \fB0\fP 以外の終了ステータスで終了します。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドを他のプロセスが開いているデータベースに対しては使ってはいけません。もし、データベースが他のプロセスから開かれていると、このコマンドは間違った結果を報告する可能性があります。 .UNINDENT .UNINDENT .SS \fBrecover\fP .sp 既存の壊れたGroongaデータベースを復旧します。 .sp もしデータベースが壊れていなかったら、 \fBgrndb\fP は何もせず終了ステータス \fB0\fP で終了します。 .sp もしデータベースが壊れていて、壊れているのがインデックスカラムだけなら、 \fBgrndb\fP は壊れているインデックスカラムを復旧して終了ステータス \fB0\fP で終了します。インデックス対象のデータが大きい場合は復旧に長時間かかることもあります。 .sp もしデータベースが壊れていて、壊れているのがテーブルまたはデータカラムの場合は、 \fBgrndb\fP は壊れている原因を報告して \fB0\fP 以外の終了ステータスで終了します。データベースを復旧可能かどうかは \fBcheck\fP コマンドで確認できます。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドを他のプロセスが開いているデータベースに対しては使ってはいけません。もし、データベースが他のプロセスから開かれていると、このコマンドはデータベースを壊してしまう可能性があります。 .UNINDENT .UNINDENT .SS grnslap .SS 名前 .sp grnslap \- groongaプロセスの通信層のパフォーマンスをチェックするツール .SS 書式 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C grnslap [options] [dest] .ft P .fi .UNINDENT .UNINDENT .SS 説明 .sp grnslapは、groongaプロセスに対してリクエストを多重に行い、パフォーマンスをチェックするためのツールです。 .sp Groonga独自プロトコルであるGQTPと、httpの両プロトコルでリクエストを行うことができます。また、リクエストの多重度を指定することができます。 .sp クエリの内容を標準入力から与えることができます。実稼動環境でのクエリパタンに近いクエリを標準入力に与えることによって、実稼動環境に近い状態での検証を行うことができます。 .sp 現在は、make installしてもインストールは行われない。 .SS オプション .INDENT 0.0 .TP .B \-P リクエストのプロトコルを指定します。 .sp \fIhttp\fP .INDENT 7.0 .INDENT 3.5 httpでリクエストします。対象のhttpのパス群(GETパラメータを含む)をLF区切り形式で標準入力に与えると、それらのパスに順次アクセスします。 .UNINDENT .UNINDENT .sp \fIgqtp\fP .INDENT 7.0 .INDENT 3.5 gqtpでリクエストします。gqtpのリクエストをLF区切り形式で標準入力に与えると、それらのリクエストを順次行います。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B \-m リクエストの多重度を指定します。初期値は10です。 .UNINDENT .SS 引数 .INDENT 0.0 .TP .B dest 接続先のホスト名とポート番号をを指定します(デフォルト値は\(aqlocalhost:10041\(aq)。ポート番号を指定しない場合には、10041が指定されたものとします。 .UNINDENT .SS サンプル .sp \fI\%http://localhost:10041/d/status\fP に、多重度100でリクエストを行う。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > yes /d/status | head \-n 100 | grnslap \-P http \-m 100 localhost:10041 2009\-11\-12 19:34:09.998696|begin: max_concurrency=100 max_tp=10000 2009\-11\-12 19:34:10.011208|end : n=100 min=46 max=382 avg=0 qps=7992.966190 etime=0.012511 .ft P .fi .UNINDENT .UNINDENT .SS \fBgroonga\fP executable file .SS 概要 .sp \fBgroonga\fP 実行ファイルは以下の機能を提供します。: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 全文検索(サーバー) .IP \(bu 2 全文検索(シェル) .IP \(bu 2 Client for Groonga fulltext search server .UNINDENT .UNINDENT .UNINDENT .sp Groonga can be used as a library. If you want to use Groonga as a library, you need to write a program in C, C++ and so on. Library use is useful for embedding fulltext search feature to your application, but it\(aqs not easy to use. .sp You can use \fBgroonga\fP executable file to get fulltext search feature. .sp If you want to try Groonga, fulltext search shell usage is useful. You don\(aqt need any server and client. You just need one terminal. You can try Groonga like the following: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-n db > status [[0,1429687763.70845,0.000115633010864258],{"alloc_count":195,...}] > quit % .ft P .fi .UNINDENT .UNINDENT .sp If you want to create an application that has fulltext search feature, fulltext search server usage is useful. You can use Groonga as a server like RDBMS (Relational DataBase Management System). Client\-server model is a popular architecture. .sp Normally, client for Groonga fulltext server usage isn\(aqt used. .SS 構文 .sp \fBgroonga\fP 実行ファイルには以下の4つのモードがあります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 Standalone mode .IP \(bu 2 Server mode .IP \(bu 2 Daemon mode .IP \(bu 2 Client mode .UNINDENT .UNINDENT .UNINDENT .sp There are common options in these modes. These common options is described later section. .SS Standalone mode .sp In standalone mode, \fBgroonga\fP executable file runs one or more Groonga \fB/reference/command\fP against a local Groonga database. .sp Here is the syntax to run shell that executes Groonga command against temporary database: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [options] .ft P .fi .UNINDENT .UNINDENT .sp Here is the syntax to create a new database and run shell that executes Groonga command against the new database: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [options] \-n DB_PATH .ft P .fi .UNINDENT .UNINDENT .sp Here is the syntax to run shell that executes Groonga command against existing database: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [options] DB_PATH .ft P .fi .UNINDENT .UNINDENT .sp Here is the syntax to run Groonga command against existing database and exit: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [options] DB_PATH COMMAND [command arguments] .ft P .fi .UNINDENT .UNINDENT .SS Server mode .sp In server mode, \fBgroonga\fP executable file runs as a server. The server accepts connections from other processes at local machine or remote machine and executes received Groonga \fB/reference/command\fP against a local Groonga database. .sp You can choose one protocol from \fB/server/http\fP and \fB/server/gqtp\fP\&. Normally, HTTP is suitable but GQTP is the default protocol. This section describes only about HTTP protocol usage. .sp In server mode, \fBgroonga\fP executable file runs in the foreground. If you want to run Groonga server in the background, see \fI\%Daemon mode\fP\&. .sp Here is the syntax to run Groonga server with temporary database: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [options] \-\-protocol http \-s .ft P .fi .UNINDENT .UNINDENT .sp Here is the syntax to create a new database and run Groonga server with the new database: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [options] \-\-protocol http \-s \-n DB_PATH .ft P .fi .UNINDENT .UNINDENT .sp Here is the syntax to run Groonga server with existing database: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [options] \-\-protocol http \-s DB_PATH .ft P .fi .UNINDENT .UNINDENT .SS Daemon mode .sp In daemon mode, \fBgroonga\fP executable file runs as a daemon. Daemon is similar to server but it runs in the background. See \fI\%Server mode\fP about server. .sp Here is the syntax to run Groonga daemon with temporary database: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [options] \-\-protocol http \-d .ft P .fi .UNINDENT .UNINDENT .sp Here is the syntax to create a new database and run Groonga daemon with the new database: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [options] \-\-protocol http \-d \-n DB_PATH .ft P .fi .UNINDENT .UNINDENT .sp Here is the syntax to run Groonga daemon with existing database: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [options] \-\-protocol http \-d DB_PATH .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-pid\-file\fP option will be useful for daemon mode. .SS Client mode .sp In client mode, \fBgroonga\fP executable file runs as a client for GQTP protocol Groonga server. Its usage is similar to \fI\%Standalone mode\fP\&. You can run shell and execute one command. You need to specify server address instead of local database. .sp Note that you can use \fBgroonga\fP executable file as a client for HTTP protocol Groonga server. .sp Here is the syntax to run shell that executes Groonga command against Groonga server that is running at \fB192.168.0.1:10043\fP: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [options] \-c \-\-host 192.168.0.1 \-\-port 10043 .ft P .fi .UNINDENT .UNINDENT .sp Here is the syntax to run Groonga command against Groonga server that is running at \fB192.168.0.1:10043\fP and exit: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [options] \-c \-\-host 192.168.0.1 \-\-port 10043 COMMAND [command arguments] .ft P .fi .UNINDENT .UNINDENT .SS Options .INDENT 0.0 .TP .B \-n 新しいデータベースを作成します。 .UNINDENT .INDENT 0.0 .TP .B \-c Executes \fBgroonga\fP command in client mode. .UNINDENT .INDENT 0.0 .TP .B \-s Executes \fBgroonga\fP command in server mode. Use "Ctrl+C" to stop the \fBgroonga\fP process. .UNINDENT .INDENT 0.0 .TP .B \-d Executes \fBgroonga\fP command in daemon mode. In contrast to server mode, \fBgroonga\fP command forks in daemon mode. For example, to stop local daemon process, use "curl \fI\%http://127.0.0.1:10041/d/shutdown\fP". .UNINDENT .INDENT 0.0 .TP .B \-e, \-\-encoding Specifies encoding which is used for Groonga database. This option is effective when you create new Groonga database. This parameter specifies one of the following values: \fBnone\fP, \fBeuc\fP, \fButf8\fP, \fBsjis\fP, \fBlatin\fP or \fBkoi8r\fP\&. .UNINDENT .INDENT 0.0 .TP .B \-l, \-\-log\-level Specifies log level. A integer value between 0 and 8. The meaning of value is: .UNINDENT .TS center; |l|l|. _ T{ log level T} T{ 説明 T} _ T{ 0 T} T{ なし T} _ T{ 1 T} T{ Emergency T} _ T{ 2 T} T{ Alert T} _ T{ 3 T} T{ Critical T} _ T{ 4 T} T{ Error T} _ T{ 5 T} T{ Warning T} _ T{ 6 T} T{ Notice T} _ T{ 7 T} T{ Info T} _ T{ 8 T} T{ Debug T} _ .TE .INDENT 0.0 .TP .B \-a, \-\-address バージョン 1.2.2 で撤廃: Use \fI\%\-\-bind\-address\fP instead. .UNINDENT .INDENT 0.0 .TP .B \-\-bind\-address バージョン 1.2.2 で追加. .sp サーバモードかデーモンモードで実行するとき、listenするアドレスを指定します。(デフォルトは \fIhostname\fP の返すホスト名) .UNINDENT .INDENT 0.0 .TP .B \-p, \-\-port クライアント、サーバ、またはデーモンモードで使用するTCPポート番号。 (クライアントモードのデフォルトは10043番、サーバ、またはデーモンモードのデフォルトは、HTTPの場合、10041番、GQTPの場合、10043番) .UNINDENT .INDENT 0.0 .TP .B \-i, \-\-server\-id サーバモードかデーモンモードで実行するとき、サーバのIDとなるアドレスを指定します。(デフォルトは\(gahostname\(gaの返すホスト名) .UNINDENT .INDENT 0.0 .TP .B \-h, \-\-help ヘルプメッセージを出力します。 .UNINDENT .INDENT 0.0 .TP .B \-\-document\-root httpサーバとしてgroongaを使用する場合に静的ページを格納するディレクトリを指定します。 .sp デフォルトでは、データベースを管理するための汎用的なページに対応するファイルが/usr/share/groonga/admin_html以下にインストールされます。このディレクトリをdocument\-rootオプションの値に指定して起動した場合、ウェブブラウザでhttp://hostname:port/index.htmlにアクセスすると、ウェブベースのデータベース管理ツールを使用できます。 .UNINDENT .INDENT 0.0 .TP .B \-\-protocol http,gqtpのいずれかを指定します。(デフォルトはgqtp) .UNINDENT .INDENT 0.0 .TP .B \-\-log\-path ログを出力するファイルのパスを指定します。(デフォルトは/var/log/groonga/groonga.logです) .UNINDENT .INDENT 0.0 .TP .B \-\-log\-rotate\-threshold\-size バージョン 5.0.3 で追加. .sp ログローテーションの閾値を指定します。ログファイルのサイズが閾値に指定した値以上になると、ローテートされます。(デフォルトは0(無効)です) .UNINDENT .INDENT 0.0 .TP .B \-\-query\-log\-path クエリーログを出力するファイルのパスを指定します。(デフォルトでは出力されません) .UNINDENT .INDENT 0.0 .TP .B \-\-query\-log\-rotate\-threshold\-size バージョン 5.0.3 で追加. .sp クエリーログのローテーションの閾値を指定します。クエリーログファイルのサイズが閾値に指定した値以上になると、ローテートされます。(デフォルトは0(無効)です) .UNINDENT .INDENT 0.0 .TP .B \-t, \-\-max\-threads 最大で利用するスレッド数を指定します。(デフォルトはマシンのCPUコア数と同じ数です) .UNINDENT .INDENT 0.0 .TP .B \-\-pid\-path PIDを保存するパスを指定します。(デフォルトでは保存しません) .UNINDENT .INDENT 0.0 .TP .B \-\-config\-path 設定ファイルのパスを指定します。設定ファイルは以下のようなフォーマットになります。: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C # \(aq#\(aq以降はコメント。 ; \(aq;\(aq以降もコメント。 # \(aqキー = 値\(aqでオプションを指定。 pid\-file = /var/run/groonga.pid # \(aq=\(aqの前後の空白はは無視される。↓は↑と同じ意味。 pid\-file=/var/run/groonga.pid # \(aqキー\(aqは\(aq\-\-XXX\(aqスタイルのオプション名と同じものが使える。 # 例えば、\(aq\-\-pid\-path\(aqに対応するキーは\(aqpid\-path\(aq。 # ただし、キーが\(aqconfig\-path\(aqのオプションは無視される。 .ft P .fi .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B \-\-cache\-limit キャッシュ数の最大値を指定します。(デフォルトは100です) .UNINDENT .INDENT 0.0 .TP .B \-\-default\-match\-escalation\-threshold 検索の挙動をエスカレーションする閾値を指定します。(デフォルトは0です) .UNINDENT .SS コマンドライン引数 .INDENT 0.0 .TP .B dest 使用するデータベースのパス名を指定します。 .sp クライアントモードの場合は接続先のホスト名とポート番号を指定します(デフォルト値は\(aqlocalhost:10043\(aq)。ポート番号を指定しない場合には、10043が指定されたものとします。 .UNINDENT .INDENT 0.0 .TP .B command [args] スタンドアロンおよびクライアントモードの場合は、実行するコマンドとその引数をコマンドライン引数に指定できます。コマンドライン引数にcommandを与えなかった場合は、標準入力から一行ずつEOFに達するまでコマンド文字列を読み取り、順次実行します。 .UNINDENT .SS コマンド .sp groongaコマンドを通してデータベースを操作する命令をコマンドと呼びます。コマンドは主にC言語で記述され、groongaプロセスにロードすることによって使用できるようになります。 それぞれのコマンドは一意な名前と、0個以上の引数を持ちます。 .sp 引数は以下の2種類の方法のいずれかで指定することができます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C 形式1: コマンド名 値1 値2,.. 形式2: コマンド名 \-\-引数名1 値1 \-\-引数名2 値2,.. .ft P .fi .UNINDENT .UNINDENT .sp 形式1でコマンドを実行する場合は、定義された順番で値を指定しなければならず、途中の引数の値を省略することはできません。形式2でコマンドを実行する場合は、「\-\-引数名」のように引数の名前を明示しなければならない代わりに、任意の順番で引数を指定することが可能で、途中の引数の指定を省略することもできます。 .sp 標準入力からコマンド文字列を与える場合は、コマンド名と引数名と値は、空白( )で区切ります。空白や、記号「"\(aq()」のうちいずれかを含む値を指定したい場合は、シングルクォート(\(aq)かダブルクォート(")で値を囲みます。値として指定する文字列の中では、改行文字は\(aqn\(aqに置き換えて指定します。また、引用符に使用した文字を値の中で指定する場合には、その文字の前にバックスラッシュ(\(aq\(aq) を指定します。バックスラッシュ文字自身を値として指定する場合には、その前にバックスラッシュを指定します。 .sp \(aq\e\(aq文字で継続行であることを明示してコマンドリストを記述することができます。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create \-\-name Terms \e \-\-flags TABLE_PAT_KEY \e \-\-key_type ShortText \e \-\-default_tokenizer TokenBigram .ft P .fi .UNINDENT .UNINDENT .SS 組み込みコマンド .sp 以下のコマンドは組み込みコマンドとして予め定義されています。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .TP .B \fBstatus\fP groongaプロセスの状態を表示します。 .TP .B \fBtable_list\fP DBに定義されているテーブルのリストを表示します。 .TP .B \fBcolumn_list\fP テーブルに定義されているカラムのリストを表示します。 .TP .B \fBtable_create\fP DBにテーブルを追加します。 .TP .B \fBcolumn_create\fP テーブルにカラムを追加します。 .TP .B \fBtable_remove\fP DBに定義されているテーブルを削除します。 .TP .B \fBcolumn_remove\fP テーブルに定義されているカラムを削除します。 .TP .B \fBload\fP テーブルにレコードを挿入します。 .TP .B \fBselect\fP テーブルに含まれるレコードを検索して表示します。 .TP .B \fBdefine_selector\fP 検索条件をカスタマイズした新たな検索コマンドを定義します。 .TP .B \fBquit\fP データベースとのセッションを終了します。 .TP .B \fBshutdown\fP サーバ(デーモン)プロセスを停止します。 .TP .B \fBlog_level\fP ログ出力レベルを設定します。 .TP .B \fBlog_put\fP ログ出力を行います。 .TP .B \fBclearlock\fP ロックを解除します。 .UNINDENT .UNINDENT .UNINDENT .SS 使い方 .sp 新しいデータベースを作成します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-n /tmp/hoge.db quit % .ft P .fi .UNINDENT .UNINDENT .sp 作成済みのデータベースにテーブルを定義します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga /tmp/hoge.db table_create Table 0 ShortText [[0]] % .ft P .fi .UNINDENT .UNINDENT .sp サーバを起動します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-d /tmp/hoge.db % .ft P .fi .UNINDENT .UNINDENT .sp httpサーバとして起動します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-d \-p 80 \-\-protocol http \-\-document\-root /usr/share/groonga/admin_html /tmp/hoge.db % .ft P .fi .UNINDENT .UNINDENT .sp サーバに接続し、テーブル一覧を表示します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-c localhost table_list [[0],[["id","name","path","flags","domain"],[256,"Table","/tmp/hoge.db.0000100",49152,14]]] % .ft P .fi .UNINDENT .UNINDENT .SS groonga\-benchmark .SS 名前 .sp groonga\-benchmark \- groongaテストプログラム .SS 書式 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga\-benchmark [options...] [script] [db] .ft P .fi .UNINDENT .UNINDENT .SS 説明 .sp groonga\-benchmarkは、groonga汎用ベンチマークツールです。 .sp groongaを単独のプロセスとして利用する場合はもちろん、サーバプログラムとして利用する場合の動作確認や実行速度測定が可能です。 .sp groonga\-benchmark用のデータファイルは自分で作成することも既存のものを利用することもできます。既存のデータファイルは、ftp.groonga.orgから必要に応じダウンロードします。そのため、groonga及びgroonga\-benchmarkが動作し、インターネットに接続できる環境であればgroongaコマンドの知識がなくてもgroongaの動作を確認できます。 .sp 現在は、Linux 及びWindows上で動作します。make installしてもインストールは行われません。 .SS オプション .INDENT 0.0 .TP .B \-i, \-\-host 接続するgroongaサーバを、ipアドレスまたはホスト名で指定します。指定先にgroongaサーバが立ち上がっていない場合、接続不能となることに注意してください。このオプションを指定しない場合、groonga\-benchmarkは自動的にlocalhostのgroongaサーバを起動して接続します。 .UNINDENT .INDENT 0.0 .TP .B \-p, \-\-port 自動的に起動するgroongaサーバ、または明示的に指定した接続先のgroonga サーバが利用するポート番号を指定します。接続先のgroongaサーバが利用しているポートと、このオプションで指定したポート番号が異なる場合、接続不能となることに注意してください。 .UNINDENT .INDENT 0.0 .TP .B \-\-dir ftp.groonga.org に用意されているスクリプトファイルを表示します。 .UNINDENT .INDENT 0.0 .TP .B \-\-ftp ftp.groonga.orgとFTP通信を行い、scriptファイルの同期やログファイルの送信を行います。 .UNINDENT .INDENT 0.0 .TP .B \-\-log\-output\-dir デフォルトでは、groonga\-benchmark終了後のログファイルの出力先ははカレントディレクトリです。このオプションを利用すると、任意のディレクトリに出力先を変更することができます。 .UNINDENT .INDENT 0.0 .TP .B \-\-groonga groongaコマンドのパスを指定します。デフォルトでは、PATHの中からgroongaコマンドを探します。 .UNINDENT .INDENT 0.0 .TP .B \-\-protocol groongaコマンドが使うプロトコルとして \fIgqtp\fP または \fIhttp\fP を指定します。 .UNINDENT .SS 引数 .INDENT 0.0 .TP .B script groonga\-benchmarkの動作方法(以下、groonga\-benchmark命令と呼びます)を記述したテキストファイルです。拡張子は.scrです。 .UNINDENT .INDENT 0.0 .TP .B db groonga\-benchmarkが利用するgroonga データベースです。指定されたデータベースが存在しない場合、groonga\-benchmarkが新規に作成します。またgroonga サーバを自動的に起動する場合もこの引数で指定したデータベースが利用されます。接続するgroonga サーバを明示的に指定した場合に利用するデータベースは、接続先サーバが使用中のデータベースになることに注意してください。 .UNINDENT .SS 使い方 .sp まず、シェル上(Windowsならコマンドプロンプト上)で: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga\-benchmark test.scr 任意のDB名 .ft P .fi .UNINDENT .UNINDENT .sp とタイプしてください。もしgroonga\-benchmarkが正常に動作すれば、: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C test\-ユーザ名\-数字.log .ft P .fi .UNINDENT .UNINDENT .sp というファイルが作成されるはずです。作成されない場合、このドキュメントの「トラブルシューティング」の章を参照してください。 .SS スクリプトファイル .sp スクリプトファイルは、groonga\-benchmark命令を記述したテキストファイルです。 ";"セミコロンを利用して、一行に複数のgroonga\-benchmark命令を記述することができます。一行に複数のgroonga\-benchmark命令がある場合、各命令は並列に実行されます。 "#"で始まる行はコメントとして扱われます。 .SS groonga\-benchmark命令 .sp 現在サポートされているgroonga\-benchmark命令は以下の11種類です。 .INDENT 0.0 .INDENT 3.5 do_local コマンドファイル [スレッド数] [繰り返し数] .INDENT 0.0 .INDENT 3.5 コマンドファイルをgroonga\-benchmark単体で実行します。スレッド数が指定されている場合、複数のスレッドで同じコマンドファイルを同時に実行します。繰り返し数が指定されてい場合、コマンドファイルの内容を繰り返し実行します。スレッド数、繰り返し数とも省略時は1です。1スレッドで複数回動作させたい場合は、do_local コマンドファイル 1 [繰り返し数]と明示的に指定してください。 .UNINDENT .UNINDENT .sp do_gqpt コマンドファイル [スレッド数] [繰り返し数] .INDENT 0.0 .INDENT 3.5 コマンドファイルをgroongaサーバでGQTP経由で実行します。スレッド数や繰り返し数の意味はdo_localの場合と同じです。 .UNINDENT .UNINDENT .sp do_http コマンドファイル [スレッド数] [繰り返し数] .INDENT 0.0 .INDENT 3.5 コマンドファイルをgroongaサーバでHTTP経由で実行します。スレッド数や繰り返し数の意味はdo_localの場合と同じです。 .UNINDENT .UNINDENT .sp rep_local コマンドファイル [スレッド数] [繰り返し数] .INDENT 0.0 .INDENT 3.5 コマンドファイルをgroonga\-benchmark単体で実行し、より詳細な報告を行います。 .UNINDENT .UNINDENT .sp rep_gqpt コマンドファイル [スレッド数] [繰り返し数] .INDENT 0.0 .INDENT 3.5 コマンドファイルをgroongaサーバでGQTP経由で実行し、より詳細な報告を行います。 スレッド数や繰り返し数の意味はdo_localと 同じです。 .UNINDENT .UNINDENT .sp rep_http コマンドファイル [スレッド数] [繰り返し数] .INDENT 0.0 .INDENT 3.5 コマンドファイルをgroongaサーバでHTTP経由で実行し、より詳細な報告を行います。 スレッド数や繰り返し数の意味はdo_localと 同じです。 .UNINDENT .UNINDENT .sp out_local コマンドファイル 入力ファイル名 .INDENT 0.0 .INDENT 3.5 コマンドファイルをgroonga\-benchmark単体で実行し、各コマンドの実行結果をすべて”出力ファイル"に書きだします。この結果は、test_local, test_gqtp命令で利用します。なおこの命令の「出力ファイル」とは、groonga\-benchmark実行時に自動的に作成されるログとは別のものです。groonga\-benchmarkではコメントが利用できる以外、: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga < コマンドファイル > 出力ファイル .ft P .fi .UNINDENT .UNINDENT .sp とした場合と同じです。 .UNINDENT .UNINDENT .sp out_gqtp コマンドファイル 出力ファイル名 .INDENT 0.0 .INDENT 3.5 コマンドファイルをgroongaサーバでGQTP経由で実行します。その他はout_local命令と同等です。 .UNINDENT .UNINDENT .sp out_http コマンドファイル 出力ファイル名 .INDENT 0.0 .INDENT 3.5 コマンドファイルをgroongaサーバでHTTP経由で実行します。その他はout_local命令と同等です。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B test_local コマンドファイル 入力ファイル名 コマンドファイルをgroonga\-benchmark単体で実行し、各コマンドの実行結果を入力ファイルと比較します。処理時間など本質的要素以外に差分があった場合、差分を、入力ファイル.diffというファイルに書きだします。 .UNINDENT .UNINDENT .UNINDENT .SS コマンドファイル .sp コマンドファイルは、groonga組み込みコマンドを1行に1つずつ記述したテキストファイルです。拡張子に制限はありません。groonga組み込みコマンドに関しては \fB/reference/command\fP を参照してください。 .SS サンプル .sp スクリプトファイルのサンプルです。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # sample script rep_local test.ddl do_local test.load; do_gqtp test.select 10 10; do_local test.status 10 .ft P .fi .UNINDENT .UNINDENT .sp 上記の意味は以下のとおりです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .TP .B 1行目 コメント行。 .TP .B 2行目 test.ddl というコマンドファイルをgroonga単体で実行し、詳細に報告する。 .TP .B 3行目 test.load というコマンドファイルをgroonga単体で実行する。(最後の";"セミコロンは複数のgroonga\-benchmark命令を記述する場合に必要ですが、この例のように1つのgroonga\-benchmark命令を実行する場合に付与しても問題ありません。) .TP .B 4行目 test.select というコマンドファイルをgroongaサーバで10個のスレッドで同時に実行する。各スレッドはtest.selectの中身を10回繰り返す。また同時に、groonga単体でtest.statusというコマンドファイルを10個のスレッドで実行する。 .UNINDENT .UNINDENT .UNINDENT .SS 特殊命令 .sp スクリプトファイルのコメント行には特殊コマンドを埋め込むことが可能です。現在サポートされている特殊命令は以下の二つです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .TP .B #SET_HOST \-i, \-\-hostオプションと同等の機能です。コマンドラインオプションに指定したIPアドレス/ホスト名と、SET_HOSTで指定したIPアドレス/ホスト名が異なる場合、またコマンドラインオプションを指定しなかった場合にもSET_HOSTが優先されます。SET_HOSTを利用した場合、サーバが自動的には起動されないのもコマンドラインオプションで指定した場合と同様です。 .TP .B #SET_PORT \-p, \-\-port オプションと同等の機能です。コマンドラインオプションに指定したポート番号とSET_PORTで指定したポート番号が異なる場合、またコマンドラインオプションを指定しなかった場合にもSET_PORTが優先されます。 .UNINDENT .UNINDENT .UNINDENT .sp 特殊命令はスクリプトファイルの任意の場所に書き込むことができます。同一ファイル内に複数回特殊命令を記述した場合、「最後の」特殊命令が有効となります。 .sp 例えば、 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ ./groonga\-benchmark \-\-port 20010 test.scr testdb .ft P .fi .UNINDENT .UNINDENT .sp とコマンド上でポートを指定した場合でも、もしtest.scrの中身が .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C #SET_PORT 10900 rep_local test.ddl do_local test.load; rep_gqtp test.select 10 10; rep_local test.status 10 #SET_PORT 10400 .ft P .fi .UNINDENT .UNINDENT .sp であれば、自動的に起動されるgroongaサーバはポート番号10400を利用します。 .SS groonga\-benchmark実行結果 .sp groonga\-benchmarkが正常に終了すると、(拡張子を除いた)スクリプト名\-ユーザ名\-実行開始時刻.logという形式のログファイルがカレントディレクトリに作られます。ログファイルは自動的にftp.groonga.org に送信されます。ログファイルは以下のようなjson形式のテキストです。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [{"script": "test.scr", "user": "homepage", "date": "2010\-04\-14 22:47:04", "CPU": Intel(R) Pentium(R) 4 CPU 2.80GHz", "BIT": 32, "CORE": 1, "RAM": "975MBytes", "HDD": "257662232KBytes", "OS": "Linux 2.4.20\-24.7\-i686", "HOST": "localhost", "PORT": "10041", "VERSION": "0.1.8\-100\-ga54c5f8" }, {"jobs": "rep_local test.ddl", "detail": [ [0, "table_create res_table \-\-key_type ShortText", 1490, 3086, [0,1271252824.25846,0.00144 7]], [0, "column_create res_table res_column \-\-type Text", 3137, 5956, [0,1271252824.2601,0.002 741]], [0, "column_create res_table user_column \-\-type Text", 6020, 8935, [0,1271252824.26298,0.0 02841]], [0, "column_create res_table mail_column \-\-type Text", 8990, 11925, [0,1271252824.26595,0. 002861]], [0, "column_create res_table time_column \-\-type Time", 12008, 13192, [0,1271252824.26897,0 \&.001147]], [0, "status", 13214, 13277, [0,1271252824.27018,3.0e\-05]], [0, "table_create thread_table \-\-key_type ShortText", 13289, 14541, [0,1271252824.27025,0. 001213]], [0, "column_create thread_table thread_title_column \-\-type ShortText", 14570, 17380, [0,12 71252824.27153,0.002741]], [0, "status", 17435, 17480, [0,1271252824.2744,2.7e\-05]], [0, "table_create lexicon_table \-\-flags 129 \-\-key_type ShortText \-\-default_tokenizer Token Bigram", 17491, 18970, [0,1271252824.27446,0.001431]], [0, "column_create lexicon_table inv_res_column 514 res_table res_column ", 18998, 33248, [0,1271252824.27596,0.01418]], [0, "column_create lexicon_table inv_thread_column 514 thread_table thread_title_column ", 33285, 48472, [0,1271252824.29025,0.015119]], [0, "status", 48509, 48554, [0,1271252824.30547,2.7e\-05]]], "summary" :[{"job": "rep_local test.ddl", "latency": 48607, "self": 47719, "qps": 272.4281 73, "min": 45, "max": 15187, "queries": 13}]}, {"jobs": "do_local test.load; ", "summary" :[{"job": "do_local test.load", "latency": 68693, "self": 19801, "qps": 1010.049 997, "min": 202, "max": 5453, "queries": 20}]}, {"jobs": "do_gqtp test.select 10 10; do_local test.status 10", "summary" :[{"job": " do_local test.status 10", "latency": 805990, "self": 737014, "qps": 54.273053, "min": 24, "max": 218, "queries": 40},{"job": "do_gqtp test.select 10 10", "lat ency": 831495, "self": 762519, "qps": 1967.164097, "min": 73, "max": 135631, "queries": 15 00}]}, {"total": 915408, "qps": 1718.359464, "queries": 1573}] .ft P .fi .UNINDENT .UNINDENT .SS 制限事項 .INDENT 0.0 .IP \(bu 2 スクリプトファイルの一行には複数のgroonga\-benchmark命令を記述できますが、すべてのスレッド数の合計は最大64までに制限されます。 .IP \(bu 2 コマンドファイル中のgroongaコマンドの長さは最長5000000byteです。 .UNINDENT .SS トラブルシューティング .sp もし、groonga\-benchmarkが正常に動作しない場合、まず以下を確認してください。 .INDENT 0.0 .IP \(bu 2 インターネットに接続しているか? \fI\-\-ftp\fP オプションを指定すると、groonga\-benchmarkは動作のたびにftp.groonga.orgと通信します。ftp.groonga.orgと通信可能でない場合、groonga\-benchmarkは正常に動作しません。 .IP \(bu 2 groonga サーバが動作していないか? groonga\-benchmarkは、\-i, \-\-host オプションで明示的にサーバを指定しないかぎり、自動的にlocalhostのgroongaサーバを立ち上げます。すでにgroongaサーバが動作している場合、groonga\-benchmarkは正常に動作しない可能性があります。 .IP \(bu 2 指定したDBが適切か? groonga\-benchmarkは、引数で指定したDBの中身はチェックしません。もし指定されたDBが存在しなければ自動的にDBを作成しますが、もしファイルとして存在する場合は中身に関わらず動作を続けてしまい、結果が異常になる可能性があります。 .UNINDENT .sp 以上の原因でなければ、問題はgroonga\-benchmarkかgroongaにあります。ご報告をお願いします。 .SS groonga\-httpd .SS 概要 .sp groonga\-httpdはGroongaサーバーとHTTPプロトコルで通信するプログラムです。 機能的には、 \fBgroonga\-server\-http\fP と同じです。 \fBgroonga\-server\-http\fP はHTTPサーバーとしては最小限の機能しか持ちませんが、groonga\-httpdは \fI\%nginx\fP を組み込むことでnginxが準拠しているHTTPの仕様と機能をすべて利用できます。 .sp groonga\-httpdにはHTML + JavaScriptで実装された管理ツールが標準で付属しています。ウェブブラウザでhttp://hostname:port/にアクセスすると、管理ツールを利用できます。 .SS 書式 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga\-httpd [nginx options] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .SS 設定をする .sp まずは、データベースを指定するためにgroonga\-httpdの設定ファイルを編集する必要があります。次のように/etc/groonga/httpd/groonga\-httpd.confを編集して \fBgroonga_database\fP ディレクティブを有効にしてます。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # Match this to the file owner of groonga database files if groonga\-httpd is # run as root. #user groonga; \&... http { ... # Don\(aqt change the location; currently only /d/ is supported. location /d/ { groonga on; # <= This means to turn on groonga\-httpd. # Specify an actual database and enable this. groonga_database /var/lib/groonga/db/db; } ... } .ft P .fi .UNINDENT .UNINDENT .sp 次に、groonga\-httpdを実行してください。すぐにターミナルに制御が戻ってきます。これはgroonga\-httpdはデフォルトでデーモンプロセスになるからです。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga\-httpd .ft P .fi .UNINDENT .UNINDENT .SS クエリーを実行する .sp 動作を確認するため、簡単なクエリー( \fB/reference/commands/status\fP )をリクエストしてみます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % curl http://localhost:10041/d/status [ [ 0, 1337566253.89858, 0.000355720520019531 ], { "uptime": 0, "max_command_version": 2, "n_queries": 0, "cache_hit_rate": 0.0, "version": "4.0.1", "alloc_count": 161, "command_version": 1, "starttime": 1395806036, "default_command_version": 1 } ] .ft P .fi .UNINDENT .UNINDENT .SS POSTでのデータロード .sp JSONデータをPOSTするとデータをロードできます。 .sp \fBUsers\fP テーブルに \fBalice\fP と \fBbob\fP ユーザーをロードする \fBcurl\fP のコマンドライン例は次の通りです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % curl \-\-data\-binary \(aq[{"_key": "alice"}, {"_key": "bob"}]\(aq \-H "Content\-Type: application/json" "http://localhost:10041/d/load?table=Users" .ft P .fi .UNINDENT .UNINDENT .sp JSONファイルからユーザーをロードする場合は、次のようなJSONファイルを準備します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ {"_key": "alice"}, {"_key": "bob"} ] .ft P .fi .UNINDENT .UNINDENT .sp それから \fBcurl\fP のコマンドラインでJSONファイルを指定します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % curl \-X POST \(aqhttp://localhost:10041/d/load?table=Users\(aq \-H \(aqContent\-Type: application/json\(aq \-d @users.json .ft P .fi .UNINDENT .UNINDENT .SS 管理ツールを使う .sp 補足ですが、 \fI\%http://localhost:10041/\fP にアクセスすると管理ツールを利用できます。 .SS 終了する .sp 最後に、次のコマンドで動作中のgroonga\-httpdデーモンを終了できます。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga\-httpd \-s stop .ft P .fi .UNINDENT .UNINDENT .SS 設定ディレクティブ .sp このセクションでは重要なディレクティブのみ説明します。重要なディレクティブとはgroonga\-http特有のディレクティブと性能に関するディレクティブです。 .sp 以下のディレクティブはgroonga\-httpdの設定ファイル中で使用することができます。デフォルトでは、設定ファイルは/etc/groonga/httpd/groonga\-httpd.confに置かれています。 .SS groonga\-httpd特有のディレクティブ .sp 以下のディレクティブはnginxが提供しているものではなく、groonga\-httpd関連の設定をするためにgroonga\-httpdが提供しているディレクティブです。 .SS \fBgroonga\fP .sp 書式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga on | off; .ft P .fi .UNINDENT .UNINDENT .INDENT 0.0 .TP .B Default \fBgroonga off;\fP .TP .B Context \fBlocation\fP .UNINDENT .sp この \fBlocation\fP ブロックでGroongaを使うかどうかを指定します。デフォルトは \fBoff\fP です。Groongaを使うためには \fBon\fP を指定してください。 .sp 例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C location /d/ { groonga on; # Enables groonga under /d/... path } location /d/ { groonga off; # Disables groonga under /d/... path } .ft P .fi .UNINDENT .UNINDENT .SS \fBgroonga_database\fP .sp 書式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga_database /path/to/groonga/database; .ft P .fi .UNINDENT .UNINDENT .INDENT 0.0 .TP .B Default \fBgroonga_database /usr/local/var/lib/groonga/db/db;\fP .TP .B Context \fBhttp\fP, \fBserver\fP, \fBlocation\fP .UNINDENT .sp Groongaデータベースのパスを指定します。このディレクティブは必須です。 .SS \fBgroonga_database_auto_create\fP .sp 書式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga_database_auto_create on | off; .ft P .fi .UNINDENT .UNINDENT .INDENT 0.0 .TP .B Default \fBgroonga_database_auto_create on;\fP .TP .B Context \fBhttp\fP, \fBserver\fP, \fBlocation\fP .UNINDENT .sp Groongaのデータベースを自動で作成するかどうかを指定します。もし、この値が \fBon\fP で \fI\%groonga_database\fP に指定したGroongaのデータベースが存在しない場合は自動でGroongaのデータベースを作成します。Groongaのデータベースが存在している場合は何もしません。 .sp もし、親ディレクトリが存在しな場合は再帰的に親ディレクトリも作成します。 .sp デフォルト値は \fBon\fP です。通常、この値を変更する必要はありません。 .SS \fBgroonga_base_path\fP .sp 書式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga_base_path /d/; .ft P .fi .UNINDENT .UNINDENT .INDENT 0.0 .TP .B Default \fBlocation\fP の名前と同じ値。 .TP .B Context \fBlocation\fP .UNINDENT .sp URIのベースパスを指定します。Groongaは \fBcommand\fP を実行するために \fB/d/command?parameter1=value1&...\fP というパスを使います。groonga\-httpdでもこのパスの形式を使いますが、groonga\-httpdは \fB/other\-prefix/command?parameter1=value1&...\fP というように \fB/d/\fP ではなく別のプレフィックスを使った形式もサポートしています。この別の形式もサポートするために、groonga\-httpdはリクエストURIの先頭からベースパスを削除し、先頭に \fB/d/\fP を追加します。このパスの変換をすることにより、ユーザーはプレフィックスをカスタムできるようになりますが、Groongaは常に \fB/d/command?parameter1=value1&...\fP という形式で処理できます。 .sp 通常、このディレクティブを使う必要はありません。このディレクティブはコマンド毎に設定をしたい場合に使います。 .sp 以下は \fB/reference/commands/shutdown\fP コマンドに認証をかける設定例です。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga_database /var/lib/groonga/db/db; location /d/shutdown { groonga on; # groonga_base_path is needed. # Because /d/shutdown is handled as the base path. # Without this configuration, /d/shutdown/shutdown path is required # to run shutdown command. groonga_base_path /d/; auth_basic "manager is required!"; auth_basic_user_file "/etc/managers.htpasswd"; } location /d/ { groonga on; # groonga_base_path doesn\(aqt needed. # Because location name is the base path. } .ft P .fi .UNINDENT .UNINDENT .SS \fBgroonga_log_path\fP .sp 書式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga_log_path path | off; .ft P .fi .UNINDENT .UNINDENT .INDENT 0.0 .TP .B Default \fB/var/log/groonga/httpd/groonga.log\fP .TP .B Context \fBhttp\fP, \fBserver\fP, \fBlocation\fP .UNINDENT .sp Groongaのログ保存先を \fBhttp\fP 、\fBserver\fP もしくは \fBlocation\fP ブロックで指定します。デフォルトは \fB/var/log/groonga/httpd/groonga.log\fP です。ログを無効にするには \fBoff\fP を指定します。 .sp 例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C location /d/ { groonga on; # You can disable log for groonga. groonga_log_path off; } .ft P .fi .UNINDENT .UNINDENT .SS \fBgroonga_log_level\fP .sp 書式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga_log_level none | emergency | alert | ciritical | error | warning | notice | info | debug | dump; .ft P .fi .UNINDENT .UNINDENT .INDENT 0.0 .TP .B Default \fBnotice\fP .TP .B Context \fBhttp\fP, \fBserver\fP, \fBlocation\fP .UNINDENT .sp Groongaのログレベルを \fBhttp\fP 、 \fBserver\fP もしくは \fBlocation\fP ブロックで指定します。デフォルトは \fBnotice\fP です。 \fBnone\fP を指定することでログを無効にできます。 .sp 例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C location /d/ { groonga on; # You can customize log level for groonga. groonga_log_level notice; } .ft P .fi .UNINDENT .UNINDENT .SS \fBgroonga_query_log_path\fP .sp 書式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga_query_log_path path | off; .ft P .fi .UNINDENT .UNINDENT .INDENT 0.0 .TP .B Default \fB/var/log/groonga/httpd/groonga\-query.log\fP .TP .B Context \fBhttp\fP, \fBserver\fP, \fBlocation\fP .UNINDENT .sp Groongaのクエリーログの保存先を \fBhttp\fP 、\fBserver\fP もしくは \fBlocation\fP ブロックで指定します。デフォルトは \fB/var/log/groonga/httpd/groonga\-query.log\fP です。ログを無効にするには \fBoff\fP を指定します。 .sp 例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C location /d/ { groonga on; # You can disable query log for groonga. groonga_query_log_path off; } .ft P .fi .UNINDENT .UNINDENT .sp クエリーログは以下のようなケースで有用です: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 スロークエリーを見つける。 .IP \(bu 2 デバッグ。 .UNINDENT .UNINDENT .UNINDENT .sp \fI\%groonga\-query\-log パッケージ\fP でクエリーログを解析できます。このパッケージは有用なツールを提供しています。 .sp 例えば、クエリーログを解析するツールがあります。これを使えば、スロークエリーを見つけることができます。クエリーログ内のすべてのクエリーを再生するツールもあります。これを使えば、新しいGroongaをプロダクション環境にデプロイする前に網羅的にテストすることができます。 .SS 性能関連のディレクティブ .sp 以下のディレクティブはgronoga\-httpdの性能に関連しているディレクティブです。 .SS \fBworker_processes\fP .sp 最適なパフォーマンスを得るためには、CPU数あるいはコア数と同じ数になるようにこのディレクティブを設定してください。大抵の場合、GroongaのクエリーはCPU負荷が高いものとなり、複数のCPU/コアを使い切るためには、このディレクティブを設定する必要があります。 .sp このディレクティブはgroonga\-httpdのディレクティブではなく、nginxのディレクティブです。詳細は、 \fI\%http://wiki.nginx.org/CoreModule#worker_processes\fP を参照してください。 .sp デフォルトで、このディレクティブには1が設定されています。 .SS \fBgroonga_cache_limit\fP .sp This directive is introduced to customize cache limit for each worker process. .sp 書式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga_cache_limit CACHE_LIMIT; .ft P .fi .UNINDENT .UNINDENT .INDENT 0.0 .TP .B Default 100 .TP .B Context \fBhttp\fP, \fBserver\fP, \fBlocation\fP .UNINDENT .sp Groongaのクエリキャッシュの制限を \fBhttp\fP 、 \fBserver\fP もしくは \fBlocation\fP ブロックで指定します。デフォルトは \fB100\fP です。 \fB0\fP を指定することで \fBgroonga_cache_limit\fP を明示的に無効にできます。 .sp 例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C location /d/ { groonga on; # You can customize query cache limit for groonga. groonga_cache_limit 100; } .ft P .fi .UNINDENT .UNINDENT .SS \fBproxy_cache\fP .sp まとめると、Groonga組み込みのクエリーキャッシュ機能の代わりにnginxのリバースプロ機とキャッシュの仕組みを使うこともできます。 .SS クエリーキャッシュ .sp groongaは \fB/reference/commands/select\fP コマンド用にクエリーキャッシュ機能を提供しています。この機能は多くのケースで性能向上を実現します。 .sp クエリーキャッシュ機能は \fB/reference/commands/cache_limit\fP コマンドを使っていないあるいはワーカー数が1だけの場合はgroonga\-httpd上でもきちんと動作します。通常、 \fB/reference/commands/cache_limit\fP コマンドは使わないので、多くの場合は問題がありません。 .sp 2ワーカー以上で \fB/reference/commands/cache_limit\fP コマンドを使ったときの問題点を説明します。 .sp groongaのクエリーキャッシュは同じプロセス内で有効です。これは、同じキャッシュを複数のワーカー間で共有できないということです。キャッシュサイズを変更しないならこれは大きな問題ではありません。もし、 \fB/reference/commands/cache_limit\fP コマンドでキャッシュサイズを変更したいなら問題になります。 .sp すべてのワーカーのキャッシュサイズを変更する汎用的な方法がないのです。 .sp 例えば、3ワーカーいるとします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C +\-\- worker 1 client \-\- groonga\-httpd (master) \-\-+\-\- worker 2 +\-\- worker 3 .ft P .fi .UNINDENT .UNINDENT .sp クライアントが \fB/reference/commands/cache_limit\fP コマンドをリクエストし、worker 1が受け取りました: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C +\-> worker 1 (changed!) client \-> groonga\-httpd (master) \-\-+\-\- worker 2 +\-\- worker 3 .ft P .fi .UNINDENT .UNINDENT .sp クライアントがもう一度 \fB/reference/commands/cache_limit\fP コマンドをリクエストし、またworker 1が受け取りました: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C +\-> worker 1 (changed again!!!) client \-> groonga\-httpd (master) \-\-+\-\- worker 2 +\-\- worker 3 .ft P .fi .UNINDENT .UNINDENT .sp この場合、worker 2とworker 3は1つもリクエストを受けとっていません。そのため、これらのワーカーのキャッシュサイズは変更されていません。 .sp クライアントはワーカーを選ぶことができないので、 \fB/reference/commands/cache_limit\fP コマンドですべてのワーカのキャッシュサイズを変更することができないのです。 .SS リバースプロキシとキャッシュ .sp nginxのリバースプロキシ機能とキャッシュ機能を使ってクエリーキャッシュを実現できます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C +\-\- worker 1 client \-\- groonga\-httpd (master) \-\- reverse proxy + cache \-\-+\-\- worker 2 +\-\- worker 3 .ft P .fi .UNINDENT .UNINDENT .sp この方法ではすべてのワーカーで同じキャッシュの設定をりようできますが、HTTPで動的にキャッシュの設定を変更することはできません。 .sp 以下はサンプルの設定です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C \&... http { proxy_cache_path /var/cache/groonga\-httpd levels=1:2 keys_zone=groonga:10m; proxy_cache_valid 10m; ... # Reverse proxy and cache server { listen 10041; ... # Only select command location /d/select { # Pass through groonga with cache proxy_cache groonga; proxy_pass http://localhost:20041; } location / { # Pass through groonga proxy_pass http://localhost:20041; } } # groonga server { location 20041; location /d/ { groonga on; groonga_database /var/lib/groonga/db/db; } } ... } .ft P .fi .UNINDENT .UNINDENT .sp パラメーターの詳細は以下のnginxのドキュメントを見てください: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path\fP .IP \(bu 2 \fI\%http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid\fP .IP \(bu 2 \fI\%http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache\fP .IP \(bu 2 \fI\%http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass\fP .UNINDENT .UNINDENT .UNINDENT .sp Groongaに新しいデータをロードしたときは自分でnginxが作ったキャッシュファイルを削除しなければいけないことに注意してください。前述のサンプル設定では、以下のコマンドでキャッシュを消せます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga DB_PATH < load.grn % rm \-rf /var/cache/groonga\-httpd/* .ft P .fi .UNINDENT .UNINDENT .sp Groongaのクエリーキャッシュ機能を使うと、手動でキャッシュを失効する必要はありません。自動で失効します。 .SS 利用可能なnginxモジュール .sp 全てのHTTPの標準モジュールが利用可能です。PCRE(Perl Compatible Regular Expressions)がない場合はHttpRewriteModuleは無効になります。標準モジュールの一覧は、 \fI\%http://wiki.nginx.org/Modules\fP を参照してください。 .SS Groonga HTTPサーバー .SS 名前 .sp Groonga HTTPサーバー .SS 書式 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga \-d \-\-protocol http DB_PATH .ft P .fi .UNINDENT .UNINDENT .SS 概要 .sp Groongaサーバを起動する時に \fB\-\-protocol\fP オプションに \fBhttp\fP を指定すると、HTTPで通信可能になります。また、 \fB\-\-document\-root\fP によって静的ページのパスを指定すると、HTTPリクエストに指定されたURIに対応する、パス配下に置かれたファイルを出力します。 .sp GroongaにはHTML + JavaScriptで実装された管理ツールが標準で付属しています。 \fB\-\-document\-root\fP を指定しない場合は管理ツールがインストールされているパスが指定されたとみなされますので、ウェブブラウザで \fBhttp://HOSTNAME:PORT/\fP にアクセスすると、管理ツールを利用できます。 .SS コマンド .sp \fBhttp\fP を指定して起動したGroongaサーバーに対しても、他のモードで起動したGroongaと同じコマンドが使用できます。 .sp コマンドは、複数の引数をとります。引数にはそれぞれ名前があります。また、特殊な引数である \fBoutput_type\fP と \fBcommand_version\fP があります。 .sp スタンドアロンやクライアントモードでは、コマンドは以下のような形式で指定します。 .INDENT 0.0 .INDENT 3.5 形式1: コマンド名 値1 値2,.. .sp 形式2: コマンド名 \-\-引数名1 値1 \-\-引数名2 値2,.. .UNINDENT .UNINDENT .sp 形式1と形式2は混在させることができます。これらの形式では、 \fBoutput_type\fP という引数名を用いて出力形式を指定します。 .sp HTTPでGroongaサーバーと通信する際には、以下のような形式でコマンドを指定します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C Format: /d/COMMAND_NAME.OUTPUT_TYPE?ARGUMENT_NAME1=VALUE1&ARGUMENT_NAME2=VALUE2&... .ft P .fi .UNINDENT .UNINDENT .sp ただし、コマンド名、引数名、値はURLエンコードが必要です。 .sp GETメソッドのみが使用可能です。 .sp 出力形式にはJSON, TSV, XMLが指定可能です。 .sp \fBcommand_version\fP はコマンドの仕様の互換性を指定します。詳細は \fB/reference/command/command_version\fP を参照してください。 .SS 戻り値 .sp 出力形式の指定に従って、コマンドの実行結果を出力します。 .SS groonga\-suggest\-create\-dataset .SS 名前 .sp groonga\-suggest\-create\-dataset \- Defines schema for a suggestion dataset .SS SYNOPSTIS .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga\-suggest\-create\-dataset [options] DATABASE DATASET .ft P .fi .UNINDENT .UNINDENT .SS DESCTIPION .sp groonga\-suggest\-create\-dataset creates a dataset for \fB/reference/suggest\fP\&. A database has many datasets. This command just defines schema for a suggestion dataset. .sp This command generates some tables and columns for \fB/reference/suggest\fP\&. .sp Here is the list of such tables. If you specify \(aqquery\(aq as dataset name, following \(aq_DATASET\(aq suffix are replaced. Thus, \(aqitem_query\(aq, \(aqpair_query\(aq, \(aqsequence_query\(aq, \(aqevent_query\(aq tables are generated. .INDENT 0.0 .IP \(bu 2 event_type .IP \(bu 2 bigram .IP \(bu 2 kana .IP \(bu 2 item_DATASET .IP \(bu 2 pair_DATASET .IP \(bu 2 sequence_DATASET .IP \(bu 2 event_DATASET .IP \(bu 2 設定ディレクティブ .UNINDENT .SS オプション .sp None. .SS EXIT STATUS .sp TODO .SS FILES .sp TODO .SS 例 .sp TODO .SS 参考 .sp \fB/reference/suggest\fP \fBgroonga\-suggest\-httpd\fP \fBgroonga\-suggest\-learner\fP .SS groonga\-suggest\-httpd .SS 概要 .sp groonga\-suggest\-httpd is a program to provide interface which accepts HTTP request and returns suggestion dataset, then saves logs for learning. groonga\-suggest\-httpd behaves similar in point of view of suggestion functionality, but the name of parameter is different. .SS 書式 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga\-suggest\-httpd [options] database_path .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .SS 設定をする .sp 最初に提案用のデータベースをセットアップする必要があります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga\-suggest\-create\-dataset /tmp/groonga\-databases/groonga\-suggest\-httpd query .ft P .fi .UNINDENT .UNINDENT .SS Launch groonga\-suggest\-httpd .sp Execute groonga\-suggest\-httpd command: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga\-suggest\-httpd /tmp/groonga\-databases/groonga\-suggest\-httpd .ft P .fi .UNINDENT .UNINDENT .sp After executing above command, groonga\-suggest\-httpd accepts HTTP request on 8080 port. .sp If you just want to save requests into log file, use \fB\-l\fP option. .sp Here is the example to save log files under \fBlogs\fP directory with \fBlog\fP prefix for each file.: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga\-suggest\-httpd \-l logs/log /tmp/groonga\-databases/groonga\-suggest\-httpd .ft P .fi .UNINDENT .UNINDENT .sp Under \fBlogs\fP directory, log files such as \fBlogYYYYmmddHHMMSS\-00\fP are created. .SS Request to groonga\-suggest\-httpd .sp Here is the sample requests to learn \fBgroonga\fP for \fBquery\fP dataset: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % curl \(aqhttp://localhost:8080/?i=127.0.0.1&l=query&s=92619&t=complete&q=g\(aq % curl \(aqhttp://localhost:8080/?i=127.0.0.1&l=query&s=93850&t=complete&q=gr\(aq % curl \(aqhttp://localhost:8080/?i=127.0.0.1&l=query&s=94293&t=complete&q=gro\(aq % curl \(aqhttp://localhost:8080/?i=127.0.0.1&l=query&s=94734&t=complete&q=groo\(aq % curl \(aqhttp://localhost:8080/?i=127.0.0.1&l=query&s=95147&t=complete&q=grooon\(aq % curl \(aqhttp://localhost:8080/?i=127.0.0.1&l=query&s=95553&t=complete&q=groonga\(aq % curl \(aqhttp://localhost:8080/?i=127.0.0.1&l=query&s=95959&t=submit&q=groonga .ft P .fi .UNINDENT .UNINDENT .SS Options .INDENT 0.0 .TP .B \-p, \-\-port Specify http server port number. The default value is 8080. .UNINDENT .INDENT 0.0 .TP .B \-t, \-\-n\-threads Specify number of threads. The default value is 8. This option accepts 128 as the max value, but use the number of CPU cores for performance. .UNINDENT .INDENT 0.0 .TP .B \-s, \-\-send\-endpoint Specify endpoint for sender. .UNINDENT .INDENT 0.0 .TP .B \-r, \-\-receive\-endpoint Specify endpoint for receiver. .UNINDENT .INDENT 0.0 .TP .B \-l, \-\-log\-base\-path Specify path prefix of log. .UNINDENT .INDENT 0.0 .TP .B \-\-n\-lines\-per\-log\-file Specify the number of lines in a log file. The default value is 1,000,000. .UNINDENT .INDENT 0.0 .TP .B \-d, \-\-daemon Specify this option to daemonize. .UNINDENT .INDENT 0.0 .TP .B \-\-disable\-max\-fd\-check Specify this option to disable checking max fd on start. .UNINDENT .SS コマンドライン引数 .sp \fBdatabase_path\fP だけが必須の引数です。 .SS \fBdatabase_path\fP .sp Specifies the path to a Groonga database. This database must be created by \fBgroonga\-suggest\-create\-dataset\fP command because it executes required initialization for suggestion. .SS GETの引数 .sp groonga\-suggest\-httpd accepts following GET parameters. .sp 必須の引数があります。どれが必須かはクエリーの種類に依存します。 .SS 必須引数 .TS center; |l|l|l|. _ T{ キー T} T{ 説明 T} T{ Note T} _ T{ q T} T{ UTF\-8 encoded string which user fills in form T} T{ T} _ T{ t T} T{ The type of query. The value of type must be complete, correct, suggest or submit. It also accepts multiple type of query which is concatinated by \fB|\fP\&. Note that \fBsubmit\fP is invalid value when you specify multiple type of query. T} T{ T} _ .TE .SS 学習時に必須の引数 .TS center; |l|l|l|. _ T{ キー T} T{ 説明 T} T{ Note T} _ T{ s T} T{ Elapsed time from 0:00 January 1, 1970 T} T{ Note that you need specify the value of \fBs\fP in milliseconds T} _ T{ i T} T{ Unique ID to distinct user T} T{ Use session ID or IP address for example T} _ T{ l T} T{ Specify the name of dataset for learning. It also accepts multiple dataset name which is concatinated by \fB|\fP T} T{ Note that dataset name must be matched to following regular expression \fB[A\-Za\-z ][A\-Za\-z0\-9 ]{0,15}\fP T} _ .TE .SS 提案時に必須の引数 .TS center; |l|l|l|. _ T{ キー T} T{ 説明 T} T{ Note T} _ T{ n T} T{ 提案用のデータベース名を指定します。 T} T{ This dataset name is used to calculate suggestion results T} _ .TE .SS 省略可能引数 .TS center; |l|l|l|. _ T{ キー T} T{ 説明 T} T{ Note T} _ T{ callback T} T{ Specify the name of function if you prefer JSONP as response format T} T{ The name of function must be matched to reqular expression \fB[A\-Za\-z ][A\-Za\-z0\-9 ]{0,15}\fP T} _ .TE .SS 戻り値 .sp \fBgroonga\-suggest\-httpd\fP command returns following response in JSON or JSONP format. .sp JSON形式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C {TYPE: [[CANDIDATE_1, SCORE_1], [CANDIDATE_2, SCORE_2], ... [CANDIDATE_N, SCORE_N]]} .ft P .fi .UNINDENT .UNINDENT .sp JSONP形式: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C FUNCTION({TYPE: [[CANDIDATE_1, SCORE_1], [CANDIDATE_2, SCORE_2], ... [CANDIDATE_N, SCORE_N]]}) .ft P .fi .UNINDENT .UNINDENT .sp \fBTYPE\fP .INDENT 0.0 .INDENT 3.5 \fBcomplete\fP 、 \fBcorrect\fP 、 \fBsuggest\fP のどれか。 .UNINDENT .UNINDENT .sp \fBCANDIDATE_N\fP .INDENT 0.0 .INDENT 3.5 The string of candidate (UTF\-8). .UNINDENT .UNINDENT .sp \fBSCORE_N\fP .INDENT 0.0 .INDENT 3.5 スコア。 .UNINDENT .UNINDENT .SS groonga\-suggest\-learner .SS 概要 .sp groonga\-suggest\-learner is a program to learn suggest result from data which derived from groonga\-suggest\-httpd. Usually, it is used with groonga\-suggest\-httpd, but It is allowed to launch standalone. In such a case, groonga\-suggest\-learner loads data from log directory. .SS 書式 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga\-suggest\-learner [options] database_path .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp groonga\-suggest\-leaner supports the two way of learning data. One is learning data from groonga\-suggest\-httpd, the other is learning data from already existing log files. .SS Learning data from groonga\-suggest\-httpd .sp Execute groonga\-suggest\-learner.: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga\-suggest\-learner testdb/db .ft P .fi .UNINDENT .UNINDENT .SS Learning data from log files .sp Execute groonga\-suggest\-learner with \fB\-l\fP option. .sp Here is the sample to load log data under \fBlogs\fP directory: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga\-suggest\-learner \-l logs testdb/db .ft P .fi .UNINDENT .UNINDENT .SS Options .INDENT 0.0 .TP .B \-r , \-\-receive\-endpoint Uses \fB\fP as the receiver endpoint. .UNINDENT .INDENT 0.0 .TP .B \-s , \-\-send\-endpoint Uses \fB\fP as the sender endpoint. .UNINDENT .INDENT 0.0 .TP .B \-d, \-\-daemon Runs as a daemon. .UNINDENT .INDENT 0.0 .TP .B \-l , \-\-log\-base\-path Reads logs from \fB\fP\&. .UNINDENT .INDENT 0.0 .TP .B \-\-log\-path Outputs log to \fB\fP\&. .UNINDENT .INDENT 0.0 .TP .B \-\-log\-level Uses \fB\fP for log level. \fB\fP must be between 1 and 9. Larger level outputs more logs. .UNINDENT .SS 引数 .sp \fBdatabase_path\fP だけが必須の引数です。 .SS \fBdatabase_path\fP .sp groongaデータベースのパスを指定します。 .SS 関連するテーブル .sp Here is the list of table which learned data is stored. If you specify \fBquery\fP as dataset name, following \fB_DATASET\fP suffix are replaced. Thus, \fBevent_query\fP table is used. .INDENT 0.0 .IP \(bu 2 event_DATASET .UNINDENT .SS 出力 .sp Groongaは以下の出力形式をサポートしています。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%JSON\fP .IP \(bu 2 \fI\%XML\fP .IP \(bu 2 TSV(タブ区切り形式) .IP \(bu 2 \fI\%MessagePack\fP .UNINDENT .UNINDENT .UNINDENT .sp JSONがデフォルトの出力形式です。 .SS 使い方 .sp Groongaには以下のクエリーインターフェイスがあります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 コマンドライン .IP \(bu 2 HTTP .UNINDENT .UNINDENT .UNINDENT .sp それぞれのインターフェイスで出力形式を変更する方法は異なります。 .SS コマンドライン .sp \fBgroonga DB_PATH\fP または \fBgroonga \-c\fP でコマンドラインクエリーインターフェイスを使うことができます。これらのgroongaコマンドでは \fB>\fP というプロンプトが表示されます。クエリーインターフェイスでは \fBoutput_type\fP オプションで出力形式を指定できます。 .sp \fBoutput_type\fP オプションを指定しない場合はJSON形式の出力になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > status [[0,1327721628.10738,0.000131845474243164],{"alloc_count":142,"starttime":1327721626,"uptime":2,"version":"1.2.9\-92\-gb87d9f8","n_queries":0,"cache_hit_rate":0.0,"command_version":1,"default_command_version":1,"max_command_version":2}] .ft P .fi .UNINDENT .UNINDENT .sp 明示的に \fBoutput_type\fP に \fBjson\fP を指定することもできます。この場合はJSON形式の出力になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > status \-\-output_type json [[0,1327721639.08321,7.93933868408203e\-05],{"alloc_count":144,"starttime":1327721626,"uptime":13,"version":"1.2.9\-92\-gb87d9f8","n_queries":0,"cache_hit_rate":0.0,"command_version":1,"default_command_version":1,"max_command_version":2}] .ft P .fi .UNINDENT .UNINDENT .sp XML形式の出力にする場合は \fBoutput_type\fP に \fBxml\fP を指定します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > status \-\-output_type xml alloc_count 146 starttime 1327721626 uptime 23 version 1.2.9\-92\-gb87d9f8 n_queries 0 cache_hit_rate 0.0 command_version 1 default_command_version 1 max_command_version 2 .ft P .fi .UNINDENT .UNINDENT .sp TSV形式の出力にする場合は \fBoutput_type\fP に \fBtsv\fP を指定します::< .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > status \-\-output_type tsv 0 1327721664.82675 0.000113964080810547 "alloc_count" 146 "starttime" 1327721626 "uptime" 38 "version" "1.2.9\-92\-gb87d9f8" "n_queries" 0 "cache_hit_rate" 0.0 "command_version" 1 "default_command_version" 1 "max_command_version" 2 END .ft P .fi .UNINDENT .UNINDENT .sp MessagePack形式の出力にする場合は \fBoutput_type\fP に \fBmsgpack\fP を指定します::< .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > status \-\-output_type msgpack (... omitted because MessagePack is binary data format. ...) .ft P .fi .UNINDENT .UNINDENT .SS HTTP .sp \fBgroonga \-\-protocol http \-s DB_PATH\fP でHTTPクエリーインターフェイスを使うことができます。groonga HTTPサーバーはデフォルトで10041番ポートで起動します。このクエリーインターフェイスでは拡張子で出力形式を指定します。 .sp 拡張子を指定しない場合はJSON形式の出力になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % curl http://localhost:10041/d/status [[0,1327809294.54311,0.00082087516784668],{"alloc_count":155,"starttime":1327809282,"uptime":12,"version":"1.2.9\-92\-gb87d9f8","n_queries":0,"cache_hit_rate":0.0,"command_version":1,"default_command_version":1,"max_command_version":2}] .ft P .fi .UNINDENT .UNINDENT .sp 明示的に \fBjson\fP 拡張子を指定することもできます。この場合はJSON形式の出力になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % curl http://localhost:10041/d/status.json [[0,1327809319.01929,9.5367431640625e\-05],{"alloc_count":157,"starttime":1327809282,"uptime":37,"version":"1.2.9\-92\-gb87d9f8","n_queries":0,"cache_hit_rate":0.0,"command_version":1,"default_command_version":1,"max_command_version":2}] .ft P .fi .UNINDENT .UNINDENT .sp XML形式の出力にする場合は \fBxml\fP 拡張子を指定します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % curl http://localhost:10041/d/status.xml alloc_count 159 starttime 1327809282 uptime 57 version 1.2.9\-92\-gb87d9f8 n_queries 0 cache_hit_rate 0.0 command_version 1 default_command_version 1 max_command_version 2 .ft P .fi .UNINDENT .UNINDENT .sp TSV形式の出力にする場合は \fBtsv\fP 拡張子を指定します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % curl http://localhost:10041/d/status.tsv 0 1327809366.84187 8.44001770019531e\-05 "alloc_count" 159 "starttime" 1327809282 "uptime" 84 "version" "1.2.9\-92\-gb87d9f8" "n_queries" 0 "cache_hit_rate" 0.0 "command_version" 1 "default_command_version" 1 "max_command_version" 2 END .ft P .fi .UNINDENT .UNINDENT .sp MessagePack形式の出力にする場合は \fBmsgpack\fP 拡張子を指定します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % curl http://localhost:10041/d/status.msgpack (... omitted because MessagePack is binary data format. ...) .ft P .fi .UNINDENT .UNINDENT .SS コマンド .sp コマンドはクエリーAPIでもっとも重要な処理単位です。コマンドでGroongaに処理をリクエストします。 .sp このセクションではコマンドについての説明と組み込みのコマンドについて説明します。 .SS コマンドバージョン .SS 概要 .sp Groonga1.1からコマンドバージョンという概念が導入されます。コマンドバージョンは、selectやloadなどのGroongaのコマンドの仕様の互換性を表します。Groongaパッケージのバージョンが新しくなったとしても、同一のコマンドバージョンが使用可能であるなら、すべてのコマンドについて互換性が保証されます。コマンドバージョンが異なれば、同じ名前のコマンドであっても、動作に互換性がない可能性があります。 .sp あるバージョンのGroongaは、二つのコマンドバージョンを同時にサポートするようになります。 使用するコマンドバージョンは、groongaを起動する際のコマンドラインオプションないしコンフィグファイルにdefault\-commnad\-versionパラメータを与えることによって指定できます。また、個々のコマンドを実行する際に、command_versionパラメータを与えることによっても指定することができます。 .sp コマンドバージョンは1からはじまり、更新されるたびに1ずつ大きくなります。現状のGroongaのコマンドの仕様はcommand\-version 1という扱いになります。次回提供するGroongaは、command\-version 1とcommand\-version 2の二つをサポートすることになります。 .SS バージョンの位置づけ .sp あるバージョンのGroongaにおいてサポートされるコマンドバージョンは、develop, stable,deprecatedのいずれかの位置づけとなります。 .INDENT 0.0 .TP .B develop まだ開発中であり、仕様が変更される可能性があります。 .TP .B stable 使用可能であり仕様も安定しています。その時点で使用することが推奨されます。 .TP .B deprecated 使用可能であり仕様も安定していますが、廃止予定であり使用が推奨されません。 .UNINDENT .sp あるバージョンのGroongaがサポートする二つのコマンドバージョンのうち、いずれか一つが必ずstableの位置づけとなります。残りの一つは、developないしdeprecatedとなります。 .sp たとえば下記のようにGroongaのサポートするコマンドバージョンは推移します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga1.1: command\-version1=stable command\-version2=develop groonga1.2: command\-version1=deprecated command\-version2=stable groonga1.3: command\-version2=stable command\-version3=develop groonga1.4: command\-version2=deprecated command\-version3=stable groonga1.5: command\-version3=stable command\-version4=develop .ft P .fi .UNINDENT .UNINDENT .sp あるコマンドバージョンははじめにdevelop扱いとしてリリースされ、やがてstableに移行します。 その後二世代経過するとそのコマンドバージョンはdeprecated扱いとなります。さらに次のコマンドバージョンがリリースされると、deprecatedだったコマンドバージョンはサポート対象外となります。 .sp default\-commnad\-versionパラメータやcommand_versionパラメータを指定せずにgroongaコマンドを実行した際には、その時点でstableであるコマンドバージョンが指定されたものとみなします。 .sp groongaプロセス起動時に、default\-command\-versionパラメータにstable扱いでないコマンドバージョンを指定した場合には、警告メッセージがログファイルに出力されます。また、サポート範囲外のコマンドバージョンを指定した場合にはエラーとなり、プロセスは速やかに停止します。 .SS コマンドバージョンの指定方法 .sp コマンドバージョンの指定方法はgroonga実行モジュールの引数として指定する方法と各コマンドの引数として指定する方法があります。 .SS default\-command\-versionパラメータ .sp groonga実行モジュールの引数としてdefault\-command\-versionパラメータを指定できます。 (configファイルの中に指定することも可能です) .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga \-\-default\-command\-version 1 .ft P .fi .UNINDENT .UNINDENT .sp そのプロセスで実行するすべてのコマンドについて、デフォルトのコマンドバージョンとして指定されたバージョンを使用します。指定されたコマンドバージョンがstableであった場合にはなんのメッセージも表示されずそのまま起動します。指定されたコマンドバージョンがdevelopあるいはdeprecatedであった場合には、groonga.logファイルに警告メッセージを出力します。指定されたコマンドバージョンがサポート対象外であった場合には標準エラー出力にエラーメッセージを出力し、プロセスは速やかに終了します。 .SS command_versionパラメータ .sp select,loadなどのすべてのgroongaコマンドにcommand_versionが指定できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-command_version 1 \-\-table tablename .ft P .fi .UNINDENT .UNINDENT .sp 指定されたコマンドバージョンでコマンドを実行します。指定されたコマンドバージョンがサポート対象外であった場合にはエラーが返されます。command\-versionが指定されなかった場合は、当該プロセス起動時にdefault\-command\-versionに指定した値が指定されたものとみなします。 .SS 出力形式 .SS 概要 .sp コマンドは実行結果をJSONまたはMessagePack、XML、TSVのどれかで出力します。 .sp JSONとMessagePackの出力は同じ構造になっています。XMLとTSVはそれぞれ独自の構造になっています。 .sp JSONまたはMessagePackの利用を推奨します。XMLは目視で結果を確認する時に便利です。TSVは特殊な用途では有用です。通常はTSVを使う必要はありません。 .SS JSONとMessagePack .sp このセクションではJSONとMessagePack形式を使った時のコマンド実行結果の構造を説明します。MessagePackはバイナリー形式なのでここでは構造を示すためにJSONを使います。バイナリー形式はドキュメントには向いていません。 .sp JSON形式、MessagePack形式のときは以下のような構造になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, BODY] .ft P .fi .UNINDENT .UNINDENT .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ [ 0, 1337566253.89858, 0.000355720520019531 ], [ [ [ 1 ], [ [ "_id", "UInt32" ], [ "_key", "ShortText" ], [ "content", "Text" ], [ "n_likes", "UInt32" ] ], [ 2, "Groonga", "I started to use groonga. It\(aqs very fast!", 10 ] ] ] ] .ft P .fi .UNINDENT .UNINDENT .sp この例では、以下の部分が \fBHEADER\fP に相当します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ 0, 1337566253.89858, 0.000355720520019531 ] .ft P .fi .UNINDENT .UNINDENT .sp \fBBODY\fP に相当する部分は以下です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ [ [ 1 ], [ [ "_id", "UInt32" ], [ "_key", "ShortText" ], [ "content", "Text" ], [ "n_likes", "UInt32" ] ], [ 2, "Groonga", "I started to use groonga. It\(aqs very fast!", 10 ] ] ] .ft P .fi .UNINDENT .UNINDENT .SS \fBHEADER\fP .sp \fBHEADER\fP は配列です。 \fBHEADER\fP の内容にはいくつかのパターンがあります。 .SS 成功した場合 .sp コマンドが成功した場合は \fBHEADER\fP には3つの要素があります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [0, UNIX_TIME_WHEN_COMMAND_IS_STARTED, ELAPSED_TIME] .ft P .fi .UNINDENT .UNINDENT .sp 最初の値は常に \fB0\fP です。 .sp \fBUNIX_TIME_WHEN_COMMAND_IS_STARTED\fP はコマンドの実行が始まったときの時刻です。時刻は1970\-01\-01 00:00:00から経過した秒数で表現されています。 \fBELAPSED_TIME\fP はコマンドの実行にかかった時間です。単位は秒です。 \fBUNIX_TIME_WHEN_COMMAND_IS_STARTED\fP も \fBELAPSED_TIME\fP も浮動小数点数です。小数部分はナノ秒を表します。 .SS エラーの場合 .sp エラーの場合、 \fBHEADER\fP には4個または5個の要素があります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ RETURN_CODE, UNIX_TIME_WHEN_COMMAND_IS_STARTED, ELAPSED_TIME, ERROR_MESSAGE, ERROR_LOCATION ] .ft P .fi .UNINDENT .UNINDENT .sp \fBERROR_LOCATION\fP は \fBHEADER\fP には含まれないかもしれませんが、他の4個の要素は常に含まれます。 .sp \fBRETURN_CODE\fP は0ではない値です。リターンコードの詳細は \fBreturn_code\fP を見てください。 .sp \fBUNIX_TIME_WHEN_COMMAND_IS_STARTED\fP と \fBELAPSED_TIME\fP は成功した時と同じです。 .sp \fBERROR_MESSAGE\fP はエラーメッセージです。文字列です。 .sp \fBERROR_LOCATION\fP は存在しないことがあります。もし、エラーが発生した場所の情報を収集できていた場合は \fBERROR_LOCATION\fP が含まれます。 \fBERROR_LOCATION\fP は配列です。 \fBERROR_LOCATION\fP は1個または2個の要素を含みます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ LOCATION_IN_GROONGA, LOCATION_IN_INPUT ] .ft P .fi .UNINDENT .UNINDENT .sp \fBLOCATION_IN_GROONGA\fP はGroonga内でエラーが発生したソースコードの場所です。この情報はGroonga開発者には役に立ちますが、ユーザーの役には立ちません。 \fBLOCATION_IN_GROONGA\fP は配列です。 \fBLOCATION_IN_GROONGA\fP には3個の要素があります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ FUNCTION_NAME, SOURCE_FILE_NAME, LINE_NUMBER ] .ft P .fi .UNINDENT .UNINDENT .sp \fBFUNCTION_NAME\fP はエラーが発生した関数の名前です。 .sp \fBSOURCE_FILE_NAME\fP はエラーが発生した箇所を含んだGroongaのソースコードのファイル名です。 .sp \fBLINE_NUMBER\fP はエラーが発生した箇所の \fBSOURCE_FILE_NAME\fP での行番号です。 .sp \fBLOCATION_IN_INPUT\fP は存在しないことがあります。 \fBLOCATION_IN_INPUT\fP は入力ファイルでエラーが発生した場所の情報を収集できたときに含まれます。入力ファイルは \fBgroonga\fP コマンドのコマンドラインオプション \fB\-\-file\fP で指定できます。 \fBLOCATION_IN_GROONGA\fP は配列です。 \fBLOCATION_IN_GROONGA\fP には3個の要素があります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ INPUT_FILE_NAME, LINE_NUMBER, LINE_CONTENT ] .ft P .fi .UNINDENT .UNINDENT .sp \fBINPUT_FILE_NAME\fP はエラーが発生した入力ファイルのファイル名です。 .sp \fBLINE_NUMBER\fP はエラーが発生した箇所の \fBINPUT_FILE_NAME\fP での行番号です。 .sp \fBLINE_CONTENT\fP は \fBINPUT_FILE_NAME\fP 内の \fBLINE_NUMBER\fP 行目の内容です。 .SS \fBBODY\fP .sp \fBBODY\fP の内容は実行したコマンドに依存します。 \fBBODY\fP がないこともあります。 .sp エラーが発生した時に、 \fBBODY\fP にエラーメッセージが入っていることもあります。 .SS XML .sp TODO .SS TSV .sp TODO .SS 参考 .INDENT 0.0 .IP \(bu 2 \fBreturn_code\fP describes about return code. .UNINDENT .SS リクエストID .SS 概要 .sp バージョン 4.0.9 で追加. .sp You can assign ID to each request. .sp The ID can be used by canceling the request. See also \fB/reference/commands/request_cancel\fP for details about canceling a request. .sp Request ID should be managed by user. If you assign the same ID for some running requests, you can\(aqt cancel the request. .sp The simplest ID sequence is incremented numbers such as \fB1\fP, \fB2\fP , \fB\&...\fP\&. .sp A request ID is a string. The maximum request ID size is 4096 byte. .SS How to assign ID to request .sp All commands accept \fBrequest_id\fP parameter. You can assign ID to request by adding \fBrequest_id\fP parameter. .sp 以下は \fBid\-1\fP というIDをリクエストに割り当てる例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Users \-\-request_id id\-1 .ft P .fi .UNINDENT .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/commands/request_cancel\fP .UNINDENT .SS リターンコード .SS 概要 .sp リターンコードは処理が成功したかどうかを示すために使われます。もし、処理が成功していなければリターンコードはエラーの種類を示します。 .sp リターンコードはCのAPIでもクエリーAPIでも使われます。CのAPIでは \fBgrn_ctx_t::rc\fP でリターンコードを確認できます。クエリーAPIではヘッダー要素を見るとリターンコードを確認できます。クエリーAPIでのヘッダー要素については \fBoutput_format\fP を参照してください。 .SS 一覧 .sp 以下はリターンコードの一覧です。 \fBGRN_SUCCESS\fP (= 0) は処理が成功したことを示しています。負の値のリターンコードはエラーの種類を表しています。 \fBGRN_END_OF_DATA\fP は特別なリターンコードです。このリターンコードはCのAPIでだけ使われていて、クエリーAPIにはでてきません。 .INDENT 0.0 .IP \(bu 2 0: \fBGRN_SUCCESS\fP .IP \(bu 2 1: \fBGRN_END_OF_DATA\fP .IP \(bu 2 \-1: \fBGRN_UNKNOWN_ERROR\fP .IP \(bu 2 \-2: \fBGRN_OPERATION_NOT_PERMITTED\fP .IP \(bu 2 \-3: \fBGRN_NO_SUCH_FILE_OR_DIRECTORY\fP .IP \(bu 2 \-4: \fBGRN_NO_SUCH_PROCESS\fP .IP \(bu 2 \-5: \fBGRN_INTERRUPTED_FUNCTION_CALL\fP .IP \(bu 2 \-6: \fBGRN_INPUT_OUTPUT_ERROR\fP .IP \(bu 2 \-7: \fBGRN_NO_SUCH_DEVICE_OR_ADDRESS\fP .IP \(bu 2 \-8: \fBGRN_ARG_LIST_TOO_LONG\fP .IP \(bu 2 \-9: \fBGRN_EXEC_FORMAT_ERROR\fP .IP \(bu 2 \-10: \fBGRN_BAD_FILE_DESCRIPTOR\fP .IP \(bu 2 \-11: \fBGRN_NO_CHILD_PROCESSES\fP .IP \(bu 2 \-12: \fBGRN_RESOURCE_TEMPORARILY_UNAVAILABLE\fP .IP \(bu 2 \-13: \fBGRN_NOT_ENOUGH_SPACE\fP .IP \(bu 2 \-14: \fBGRN_PERMISSION_DENIED\fP .IP \(bu 2 \-15: \fBGRN_BAD_ADDRESS\fP .IP \(bu 2 \-16: \fBGRN_RESOURCE_BUSY\fP .IP \(bu 2 \-17: \fBGRN_FILE_EXISTS\fP .IP \(bu 2 \-18: \fBGRN_IMPROPER_LINK\fP .IP \(bu 2 \-19: \fBGRN_NO_SUCH_DEVICE\fP .IP \(bu 2 \-20: \fBGRN_NOT_A_DIRECTORY\fP .IP \(bu 2 \-21: \fBGRN_IS_A_DIRECTORY\fP .IP \(bu 2 \-22: \fBGRN_INVALID_ARGUMENT\fP .IP \(bu 2 \-23: \fBGRN_TOO_MANY_OPEN_FILES_IN_SYSTEM\fP .IP \(bu 2 \-24: \fBGRN_TOO_MANY_OPEN_FILES\fP .IP \(bu 2 \-25: \fBGRN_INAPPROPRIATE_I_O_CONTROL_OPERATION\fP .IP \(bu 2 \-26: \fBGRN_FILE_TOO_LARGE\fP .IP \(bu 2 \-27: \fBGRN_NO_SPACE_LEFT_ON_DEVICE\fP .IP \(bu 2 \-28: \fBGRN_INVALID_SEEK\fP .IP \(bu 2 \-29: \fBGRN_READ_ONLY_FILE_SYSTEM\fP .IP \(bu 2 \-30: \fBGRN_TOO_MANY_LINKS\fP .IP \(bu 2 \-31: \fBGRN_BROKEN_PIPE\fP .IP \(bu 2 \-32: \fBGRN_DOMAIN_ERROR\fP .IP \(bu 2 \-33: \fBGRN_RESULT_TOO_LARGE\fP .IP \(bu 2 \-34: \fBGRN_RESOURCE_DEADLOCK_AVOIDED\fP .IP \(bu 2 \-35: \fBGRN_NO_MEMORY_AVAILABLE\fP .IP \(bu 2 \-36: \fBGRN_FILENAME_TOO_LONG\fP .IP \(bu 2 \-37: \fBGRN_NO_LOCKS_AVAILABLE\fP .IP \(bu 2 \-38: \fBGRN_FUNCTION_NOT_IMPLEMENTED\fP .IP \(bu 2 \-39: \fBGRN_DIRECTORY_NOT_EMPTY\fP .IP \(bu 2 \-40: \fBGRN_ILLEGAL_BYTE_SEQUENCE\fP .IP \(bu 2 \-41: \fBGRN_SOCKET_NOT_INITIALIZED\fP .IP \(bu 2 \-42: \fBGRN_OPERATION_WOULD_BLOCK\fP .IP \(bu 2 \-43: \fBGRN_ADDRESS_IS_NOT_AVAILABLE\fP .IP \(bu 2 \-44: \fBGRN_NETWORK_IS_DOWN\fP .IP \(bu 2 \-45: \fBGRN_NO_BUFFER\fP .IP \(bu 2 \-46: \fBGRN_SOCKET_IS_ALREADY_CONNECTED\fP .IP \(bu 2 \-47: \fBGRN_SOCKET_IS_NOT_CONNECTED\fP .IP \(bu 2 \-48: \fBGRN_SOCKET_IS_ALREADY_SHUTDOWNED\fP .IP \(bu 2 \-49: \fBGRN_OPERATION_TIMEOUT\fP .IP \(bu 2 \-50: \fBGRN_CONNECTION_REFUSED\fP .IP \(bu 2 \-51: \fBGRN_RANGE_ERROR\fP .IP \(bu 2 \-52: \fBGRN_TOKENIZER_ERROR\fP .IP \(bu 2 \-53: \fBGRN_FILE_CORRUPT\fP .IP \(bu 2 \-54: \fBGRN_INVALID_FORMAT\fP .IP \(bu 2 \-55: \fBGRN_OBJECT_CORRUPT\fP .IP \(bu 2 \-56: \fBGRN_TOO_MANY_SYMBOLIC_LINKS\fP .IP \(bu 2 \-57: \fBGRN_NOT_SOCKET\fP .IP \(bu 2 \-58: \fBGRN_OPERATION_NOT_SUPPORTED\fP .IP \(bu 2 \-59: \fBGRN_ADDRESS_IS_IN_USE\fP .IP \(bu 2 \-60: \fBGRN_ZLIB_ERROR\fP .IP \(bu 2 \-61: \fBGRN_LZO_ERROR\fP .IP \(bu 2 \-62: \fBGRN_STACK_OVER_FLOW\fP .IP \(bu 2 \-63: \fBGRN_SYNTAX_ERROR\fP .IP \(bu 2 \-64: \fBGRN_RETRY_MAX\fP .IP \(bu 2 \-65: \fBGRN_INCOMPATIBLE_FILE_FORMAT\fP .IP \(bu 2 \-66: \fBGRN_UPDATE_NOT_ALLOWED\fP .IP \(bu 2 \-67: \fBGRN_TOO_SMALL_OFFSET\fP .IP \(bu 2 \-68: \fBGRN_TOO_LARGE_OFFSET\fP .IP \(bu 2 \-69: \fBGRN_TOO_SMALL_LIMIT\fP .IP \(bu 2 \-70: \fBGRN_CAS_ERROR\fP .IP \(bu 2 \-71: \fBGRN_UNSUPPORTED_COMMAND_VERSION\fP .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fBoutput_format\fP はクエリーAPIでのレスポンスの中でどこにリターンコードがあるかを説明しています。 .IP \(bu 2 \fB/spec/gqtp\fP: GQTPプロトコルもステータスとしてリターンコードを使っていますが、ステータスは2バイトの符号なし整数です。そのため、GQTPプロトコルでは、負の値のリターンコードは正の値のステータスになります。GQTPプロトコルのステータスの値を2バイトの符号付き整数として扱うとステータスをリターンコードに変換できます。 .UNINDENT .SS \fBcache_limit\fP .SS 概要 .sp \fBcache_limit\fP は最大クエリーキャッシュエントリー数を取得・設定します。クエリーキャッシュを使っているのは \fBselect\fP コマンドだけです。 .sp 最大クエリーキャッシュエントリー数が100の場合は、最新の100 \fBselect\fP コマンドの結果だけキャッシュします。キャッシュを失効するアルゴリズムはLRU(Least Recently Used)です。 .SS 構文 .sp このコマンドの引数は1つで省略できます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C cache_limit [max=null] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 引数なしで \fBcache_limit\fP を実行すると現在の最大キャッシュエントリー数を取得できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C cache_limit # [[0, 1337566253.89858, 0.000355720520019531], 100] .ft P .fi .UNINDENT .UNINDENT .sp \fBmax\fP 引数つきで \fBcache_limit\fP を実行すると最大キャッシュエントリー数を設定できます。 .sp 次の例は最大キャッシュエントリー数を \fB10\fP に設定する例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C cache_limit 10 # [[0, 1337566253.89858, 0.000355720520019531], 100] cache_limit # [[0, 1337566253.89858, 0.000355720520019531], 10] .ft P .fi .UNINDENT .UNINDENT .sp \fBmax\fP 引数を使うと、指定した値に設定される前の最大キャッシュエントリー数が戻り値になります。 .SS 引数 .sp このセクションではすべての引数について説明します。 .SS \fBmax\fP .sp 数値で最大クエリーキャッシュエントリー数を指定します。 .sp \fBmax\fP 引数が指定されていない場合は、現在の最大クエリーキャッシュエントリー数は変わりません。 \fBcache_limit\fP は単に現在の最大クエリーキャッシュエントリー数を返します。 .SS 戻り値 .sp \fBcache_limit\fP は現在の最大クエリーキャッシュエントリー数を返します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, N_ENTRIES] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBN_ENTRIES\fP .INDENT 0.0 .INDENT 3.5 \fBN_ENTRIES\fP は現在の最大クエリーキャッシュエントリー数です。これは数値です。 .UNINDENT .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fBselect\fP .UNINDENT .SS \fBcheck\fP .SS 概要 .sp check \- オブジェクトの状態表示 .sp Groonga組込コマンドの一つであるcheckについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp checkコマンドは、groongaプロセス内の指定したオブジェクトの状態を表示します。主にデータベースが壊れた場合など異常時の問題解決のために使用することを想定しています。デバッグ用のため、返値のフォーマットが安定しているということは保証されません。(フォーマットが変更される可能性が高い) .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C check obj .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp テーブルTermsのインデックスカラムnameの状態を表示します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C check Terms.name [{"flags":"00008202", "max sid":1, "number of garbage segments":0, "number of array segments":1, "max id of array segment":1, "number of buffer segments":110, "max id of buffer segment":111, "max id of physical segment in use":111, "number of unmanaged segments":4294967185, "total chunk size":7470239, "max id of chunk segments in use":127, "number of garbage chunk":[0,0,0,0,0,0,0,0,2,2,0,0,0,0,0]}, {"buffer id":0, "chunk size":94392, "buffer term":["596","59777","6",...], "buffer free":152944, "size in buffer":7361, "nterms":237, "nterms with chunk":216, "buffer id":1, "chunk size":71236, "buffer term":[["に述",18149,18149,2,25,6,6], ["に追",4505,4505,76,485,136,174], ["に退",26568,26568,2,9,2,2], ...], "buffer free":120000, "size in buffer":11155, "nterms":121, "nterms with chunk":116}, {"buffer id":1, ...}, ...] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp \fBobj\fP .INDENT 0.0 .INDENT 3.5 状態を表示するオブジェクトの名前を指定します。 .UNINDENT .UNINDENT .SS 戻り値 .sp チェックするオブジェクトにより返される値が変わります。 .sp インデックスカラムの場合: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C 下記のような配列が出力されます。 [インデックスの状態, バッファの状態1, バッファの状態2, ...] .ft P .fi .UNINDENT .UNINDENT .sp \fBインデックスの状態\fP には下記の項目がハッシュ形式で出力されます。 .INDENT 0.0 .INDENT 3.5 \fBflags\fP .INDENT 0.0 .INDENT 3.5 指定されているフラグ値です。16進数で表現されています。 .UNINDENT .UNINDENT .sp \fBmax sid\fP .INDENT 0.0 .INDENT 3.5 セグメントのうち最も大きなIDです。 .UNINDENT .UNINDENT .sp \fBnumber of garbage segments\fP .INDENT 0.0 .INDENT 3.5 ゴミセグメントの数です。 .UNINDENT .UNINDENT .sp \fBnumber of array segments\fP .INDENT 0.0 .INDENT 3.5 配列セグメントの数です。 .UNINDENT .UNINDENT .sp \fBmax id of array segment\fP .INDENT 0.0 .INDENT 3.5 配列セグメントのうち最も大きなIDです。 .UNINDENT .UNINDENT .sp \fBnumber of buffer segments\fP .INDENT 0.0 .INDENT 3.5 バッファセグメントの数です。 .UNINDENT .UNINDENT .sp \fBmax id of buffer segment\fP .INDENT 0.0 .INDENT 3.5 バッファセグメントのうち最も大きなIDです。 .UNINDENT .UNINDENT .sp \fBmax id of physical segment in use\fP .INDENT 0.0 .INDENT 3.5 使用中の論理セグメントのうち最も大きなIDです。 .UNINDENT .UNINDENT .sp \fBnumber of unmanaged segments\fP .INDENT 0.0 .INDENT 3.5 管理されていないセグメントの数です。 .UNINDENT .UNINDENT .sp \fBtotal chunk size\fP .INDENT 0.0 .INDENT 3.5 チャンクサイズの合計です。 .UNINDENT .UNINDENT .sp \fBmax id of chunk segments in use\fP .INDENT 0.0 .INDENT 3.5 使用中のチャンクセグメントのうち最も大きなIDです。 .UNINDENT .UNINDENT .sp \fBnumber of garbage chunk\fP .INDENT 0.0 .INDENT 3.5 各チャンク毎のゴミの数です。 .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp \fBバッファの状態\fP には下記の項目がハッシュ形式で出力されます。 .INDENT 0.0 .INDENT 3.5 \fBbuffer id\fP .INDENT 0.0 .INDENT 3.5 バッファIDです。 .UNINDENT .UNINDENT .sp \fBchunk size\fP .INDENT 0.0 .INDENT 3.5 チャンクのサイズです。 .UNINDENT .UNINDENT .sp \fBbuffer term\fP .INDENT 0.0 .INDENT 3.5 バッファ内にある語の一覧です。各語の状態は以下のような配列となっています。 .INDENT 0.0 .INDENT 3.5 [語, バッファに登録されている語のID, 用語集に登録されている語のID, バッファ内でのサイズ, チャンク内でのサイズ] .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp \fBbuffer free\fP .INDENT 0.0 .INDENT 3.5 バッファの空き容量です。 .UNINDENT .UNINDENT .sp \fBsize in buffer\fP .INDENT 0.0 .INDENT 3.5 バッファの使用量です。 .UNINDENT .UNINDENT .sp \fBnterms\fP .INDENT 0.0 .INDENT 3.5 バッファ内にある語の数です。 .UNINDENT .UNINDENT .sp \fBnterms with chunk\fP .INDENT 0.0 .INDENT 3.5 バッファ内にある語のうち、チャンクを使っている語の数です。 .UNINDENT .UNINDENT .UNINDENT .UNINDENT .SS \fBclearlock\fP .SS 概要 .sp バージョン 4.0.9 で撤廃: Use \fBlock_clear\fP instead. .sp clearlock \- オブジェクトにセットされたロックを解除する .sp Groonga組込コマンドの一つであるclearlockについて説明します。組込コマンドは、groonga実行ファイルの引数、標準>入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp clearlockは、対象となるオブジェクト(データベース,テーブル,インデックス等)を指定し、オブジェクトにかけられた>ロックを再帰的に解除します。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C clearlock objname .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 開いているデータベースのロックをすべて解除する: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C clearlock [true] .ft P .fi .UNINDENT .UNINDENT .sp テーブル名 Entry のカラム body のロックを解除する: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C clearlock Entry.body [true] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp \fBobjname\fP .INDENT 0.0 .INDENT 3.5 対象となるオブジェクト名を指定します。空の場合、開いているdbオブジェクトが対象となります。 .UNINDENT .UNINDENT .SS 戻り値 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [成功かどうかのフラグ] .ft P .fi .UNINDENT .UNINDENT .sp \fB成功かどうかのフラグ\fP .INDENT 0.0 .INDENT 3.5 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。 .UNINDENT .UNINDENT .SS 参考 .sp \fBload\fP .SS \fBcolumn_copy\fP .SS 概要 .sp バージョン 5.0.7 で追加. .sp \fBcolumn_copy\fP はカラムのすべての値を他のカラムにコピーします。 .sp このコマンドを使うと、次のような機能を実装できます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 カラムの設定を変更 .IP \(bu 2 テーブルの設定を変更 .UNINDENT .UNINDENT .UNINDENT .sp 次のステップでカラムの設定を変更できます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 1. 3 新しい設定で新しいカラムを作る .IP 2. 3 現在のカラムから新しいカラムへすべての値をコピーする .IP 3. 3 現在のカラムを削除する .IP 4. 3 新しいカラムを現在のカラムにリネームする .UNINDENT .UNINDENT .UNINDENT .sp 次のステップでテーブルの設定を変更できます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 1. 3 新しい設定で新しいテーブルを作る .IP 2. 3 すべてのカラムを同じ設定で新しいテーブルに作る .IP 3. 3 現在のテーブルから新しいテーブルへすべてのカラムの値をコピーする .IP 4. 3 現在のテーブルを削除する .IP 5. 3 新しいテーブルを現在のテーブルにリネームする .UNINDENT .UNINDENT .UNINDENT .sp 具体例は後で示します。 .sp \fBTABLE_NO_KEY\fP テーブルから他のテーブルにカラムの値をコピーすることはできません。また、他のテーブルから \fBTABLE_NO_KEY\fP テーブルにカラムの値をコピーすることもできません。これは、レコードのキーがないとどのレコードとどのレコードを対応させればよいか決められないからです。 .sp \fBTABLE_NO_KEY\fP テーブルから同じ \fBTABLE_NO_KEY\fP テーブルにカラムの値をコピーすることはできます。 .sp \fBTABLE_HASH_KEY\fP / \fBTABLE_PAT_KEY\fP / \fBTABLE_DAT_KEY\fP テーブルから他の \fBTABLE_HASH_KEY\fP / \fBTABLE_PAT_KEY\fP / \fBTABLE_DAT_KEY\fP テーブルにカラムの値をコピーすることができます。同じテーブルに対してもできます。 .SS 構文 .sp このコマンドには4つの引数があります。 .sp すべての引数は必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_copy from_table from_name to_table to_name .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp このコマンドのユースケースは次の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 カラムの設定を変更 .IP \(bu 2 テーブルの設定を変更 .UNINDENT .UNINDENT .UNINDENT .SS カラムの設定の変更方法 .sp カラムの値の型を変えることができます。たとえば、カラムの型を \fBUInt32\fP から \fBShortText\fP に変えることができます。 .sp カラムの種類を変えることができます。たとえば、 \fBCOLUMN_SCALAR\fP カラムを \fBCOLUMN_VECTOR\fP カラムに変えることができます。 .sp カラムを他のテーブルに移動することができます。たとえば、 \fBhigh_score\fP カラムを \fBPlayers\fP テーブルから \fBUsers\fP テーブルに移動できます。 .sp カラムの設定を変更する基本的なステップは次の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 1. 3 新しい設定で新しいカラムを作る .IP 2. 3 現在のカラムから新しいカラムへすべての値をコピーする .IP 3. 3 現在のカラムを削除する .IP 4. 3 新しいカラムを現在のカラムにリネームする .UNINDENT .UNINDENT .UNINDENT .sp カラムの値の型を \fBShortText\fP から \fBInt32\fP に変更する例です。 .sp スキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Logs TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs serial COLUMN_SCALAR Int32 # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Logs [ {"_key": "log1", "serial": 1} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] .ft P .fi .UNINDENT .UNINDENT .sp 次のコマンドは \fBLogs.serial\fP カラムの値の型を \fBInt32\fP から \fBShortText\fP に変えています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create Logs new_serial COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_copy Logs serial Logs new_serial # [[0, 1337566253.89858, 0.000355720520019531], true] column_remove Logs serial # [[0, 1337566253.89858, 0.000355720520019531], true] column_rename Logs new_serial serial # [[0, 1337566253.89858, 0.000355720520019531], true] select Logs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "serial", # "ShortText" # ] # ], # [ # 1, # "log1", # "1" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBselect\fP のレスポンスを見ると \fBLogs.serial\fP が \fBShortText\fP の値を保存していることがわかります。 .sp カラムの種類を \fBCOLUMN_SCALAR\fP から \fBCOLUMN_VECTOR\fP に変更する例です。 .sp スキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entries TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries tag COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Entries [ {"_key": "entry1", "tag": "Groonga"} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] .ft P .fi .UNINDENT .UNINDENT .sp 次のコマンドは \fBEntries.tag\fP を \fBCOLUMN_SCALAR\fP から \fBCOLUMN_VECTOR\fP へ変更します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create Entries new_tag COLUMN_VECTOR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_copy Entries tag Entries new_tag # [[0, 1337566253.89858, 0.000355720520019531], true] column_remove Entries tag # [[0, 1337566253.89858, 0.000355720520019531], true] column_rename Entries new_tag tag # [[0, 1337566253.89858, 0.000355720520019531], true] select Entries # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "entry1", # [ # "Groonga" # ] # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBselect\fP のレスポンスを見ると、 \fBEntries.tag\fP が \fBCOLUMN_VECTOR\fP の値を保存していることがわかります。 .sp \fBhigh_score\fP カラムを \fBPlayers\fP テーブルから \fBUsers\fP テーブルに移動する例です。 .sp スキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Players TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Players high_score COLUMN_SCALAR Int32 # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Players [ {"_key": "player1", "high_score": 100} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] .ft P .fi .UNINDENT .UNINDENT .sp 次のコマンドは \fBhigh_score\fP カラムを \fBPlayers\fP テーブルから \fBUsers\fP テーブルに移動します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Users TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Users high_score COLUMN_SCALAR Int32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_copy Players high_score Users high_score # [[0, 1337566253.89858, 0.000355720520019531], true] column_remove Players high_score # [[0, 1337566253.89858, 0.000355720520019531], true] select Users # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "high_score", # "Int32" # ] # ], # [ # 1, # "player1", # 100 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBselect\fP の結果を見ると、 \fBPlayers.high_score\fP を \fBUsers.high_score\fP に移動できていることがわかります。 .SS テーブルの設定の変更方法 .sp テーブルのキーの型を変更できます。たとえば、キーの型を \fBInt32\fP から \fBShortText\fP に変更できます。 .sp テーブルの種類を変更できます。たとえば、 \fBTABLE_HASH_KEY\fP テーブルを \fBTABLE_PAT_KEY\fP テーブルに変更できます。 .sp デフォルトトークナイザーやノーマライザーなど他のオプションも変更できます。たとえば、デフォルトトークナイザーを \fBTokenBigrm\fP から \fBTokenBigramSplitSymbolAlphaDigit\fP に変更できます。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \fBTABLE_NO_KEY\fP テーブルは変更できません。なぜなら、 \fBTABLE_NO_KEY\fP レコードのキーがないからです。レコードのキーがないとコピー先のレコードを特定することができません。 .UNINDENT .UNINDENT .sp テーブルの設定を変更する基本的なステップは次の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 1. 3 新しい設定で新しいテーブルを作る .IP 2. 3 すべてのカラムを同じ設定で新しいテーブルに作る .IP 3. 3 現在のテーブルから新しいテーブルへすべてのカラムの値をコピーする .IP 4. 3 現在のテーブルを削除する .IP 5. 3 新しいテーブルを現在のテーブルにリネームする .UNINDENT .UNINDENT .UNINDENT .sp テーブルのキーの型を \fBInt32\fP から \fBShortText\fP に変更する例です。 .sp スキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create IDs TABLE_HASH_KEY Int32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create IDs label COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create IDs used COLUMN_SCALAR Bool # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table IDs [ {"_key": 100, "label": "ID 100", used: true} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] .ft P .fi .UNINDENT .UNINDENT .sp 次のコマンドは \fBIDs\fP テーブルのキーの型を \fBInt32\fP から \fBShortText\fP に変更します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create NewIDs TABLE_HASH_KEY Int32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create NewIDs label COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create NewIDs used COLUMN_SCALAR Bool # [[0, 1337566253.89858, 0.000355720520019531], true] column_copy IDs label NewIDs label # [[0, 1337566253.89858, 0.000355720520019531], true] column_copy IDs used NewIDs used # [[0, 1337566253.89858, 0.000355720520019531], true] table_remove IDs # [[0, 1337566253.89858, 0.000355720520019531], true] table_rename NewIDs IDs # [[0, 1337566253.89858, 0.000355720520019531], true] select IDs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "Int32" # ], # [ # "label", # "ShortText" # ], # [ # "used", # "Bool" # ] # ], # [ # 1, # 100, # "ID 100", # true # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBselect\fP のレスポンスを見ると、 \fBIDs\fP は \fBShortText\fP のキーを保存していることがわかります。 .sp テーブルの種類を \fBTABLE_HASH_KEY\fP から \fBTABLE_PAT_KEY\fP に変更する例です。 .sp スキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Names TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Names used COLUMN_SCALAR Bool # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Entries [ {"_key": "alice", "used": false} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] .ft P .fi .UNINDENT .UNINDENT .sp 次のコマンドは \fBNames\fP テーブルを \fBTABLE_HASH_KEY\fP から \fBTABLE_PAT_KEY\fP に変更します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create NewNames TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create NewNames used COLUMN_SCALAR Bool # [[0, 1337566253.89858, 0.000355720520019531], true] column_copy Names used NewNames used # [[0, 1337566253.89858, 0.000355720520019531], true] table_remove Names # [[0, 1337566253.89858, 0.000355720520019531], true] table_rename NewNames Names # [[0, 1337566253.89858, 0.000355720520019531], true] select Names \-\-filter \(aq_key @^ "ali"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 0 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "used", # "Bool" # ] # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBselect\fP で script\-syntax\-prefix\-search\-operator を使えているので、 \fBNames\fP が \fBTABLE_PAT_KEY\fP に変わったことがわかります。\fBTABLE_HASH_KEY\fP では script\-syntax\-prefix\-search\-operator を使えません。 .SS 引数 .sp このセクションでは引数について説明します。 .SS 必須引数 .sp すべての引数は必須です。 .SS \fBfrom_table\fP .sp ソースカラムのテーブル名を指定します。 .sp \fBTABLE_NO_KEY\fP テーブルを含むすべてのテーブルを指定できます。 .sp \fBTABLE_NO_KEY\fP テーブルを指定するときは、 \fI\%to_table\fP には同じテーブルを指定しなければいけません。 .sp \fBfrom_table\fP の使用例です。 .sp スキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create FromTable TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create FromTable from_column COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create FromTable to_column COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table FromTable [ {"_key": "key1", "from_column": "value1"} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] select FromTable \-\-output_columns _key,from_column,to_column # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "from_column", # "ShortText" # ], # [ # "to_column", # "ShortText" # ] # ], # [ # "key1", # "value1", # "" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp すべての値を \fBfrom_column\fP から \fBto_column\fP にコピーできます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_copy FromTable from_column FromTable to_column # [[0, 1337566253.89858, 0.000355720520019531], true] select FromTable \-\-output_columns _key,from_column,to_column # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "from_column", # "ShortText" # ], # [ # "to_column", # "ShortText" # ] # ], # [ # "key1", # "value1", # "value1" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBfrom_name\fP .sp 値をコピーするカラムの名前を指定します。 .sp 具体例は \fI\%from_table\fP を見てください。 .SS \fBto_table\fP .sp コピー先のカラムのテーブル名を指定します。 .sp 同じテーブル内でカラムの値をコピーしたいときは、 \fI\%from_table\fP に指定した名前と同じ名前を指定します。 .sp \fBto_table\fP に \fBTABLE_NO_KEY\fP テーブルを指定することはできません。なぜなら、レコードのキーがないとGroongaはコピー先のレコードを特定できないからです。 .sp 例外が1つあります。 \fBfrom_table\fP と \fBto_table\fP に同じテーブル名を指定した場合は、 \fBto_table\fP に \fBTABLE_NO_KEY\fP テーブルを指定できます。なぜなら、コピー元テーブルとコピー先テーブルが同じテーブルならGroongaはコピー先のレコードを特定できるからです。 .sp \fBto_table\fP を使った例です。 .sp スキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Table TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Table column COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create ToTable TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create ToTable to_column COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Table [ {"_key": "key1", "column": "value1"} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] .ft P .fi .UNINDENT .UNINDENT .sp \fBTable.column\fP から \fBToTable.to_column\fP にすべての値をコピーできます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_copy Table column ToTable to_column # [[0, 1337566253.89858, 0.000355720520019531], true] select ToTable \-\-output_columns _key,to_column # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "to_column", # "ShortText" # ] # ], # [ # "key1", # "value1" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBto_name\fP .sp コピー先のカラム名を指定します。 .sp 具体例は \fI\%to_table\fP を見てください。 .SS 省略可能引数 .sp 省略可能な引数はありません。 .SS 戻り値 .sp このコマンドが成功したときは以下のようにボディは \fBtrue\fP になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, true] .ft P .fi .UNINDENT .UNINDENT .sp このコマンドが失敗すると、 \fBHEADER\fP にエラーの詳細が含まれます。 .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS \fBcolumn_create\fP .SS 概要 .sp column_create \- カラムの追加 .sp Groonga組込コマンドの一つであるcolumn_createについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp column_createは、使用しているデータベースのテーブルに対してカラムを追加します。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create table name flags type [source] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp テーブルEntryに、ShortText型の値を格納するカラム、bodyを作成します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create Entry body \-\-type ShortText [true] .ft P .fi .UNINDENT .UNINDENT .sp テーブルTermに、Entryテーブルのbodyカラムの値を対象とする完全転置インデックス型カラム、entry_bodyを作成します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create Term entry_body COLUMN_INDEX|WITH_POSITION Entry body [true] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp \fBtable\fP .INDENT 0.0 .INDENT 3.5 カラムを追加するテーブルの名前を指定します。 .UNINDENT .UNINDENT .sp \fBname\fP .INDENT 0.0 .INDENT 3.5 作成するカラムの名前を指定します。カラム名は、テーブルの中で一意でなければなりません。 .sp ピリオド(\(aq.\(aq), コロン(\(aq:\(aq)を含む名前のカラムは作成できません。また、アンダースコア(\(aq_\(aq)で始まる名前は予約済みであり、使用できません。 .UNINDENT .UNINDENT .sp \fBflags\fP .INDENT 0.0 .INDENT 3.5 カラムの属性を表す以下の数値か、パイプ(\(aq|\(aq)で組み合わせたシンボル名を指定します。 .INDENT 0.0 .TP .B 0, \fBCOLUMN_SCALAR\fP 単一の値が格納できるカラムを作成します。 .TP .B 1, \fBCOLUMN_VECTOR\fP 複数の値の配列を格納できるカラムを作成します。 .TP .B 2, \fBCOLUMN_INDEX\fP インデックス型のカラムを作成します。 .UNINDENT .sp カラムの値を圧縮するためのフラグが2つあります。ただしそれらのフラグを指定することは今のところできません。これはカラムの値を参照するときにメモリリークする問題 \fI\%GitHub#6\fP があるためです。 この問題はzlib、lzoいずれでも発生します。 .INDENT 0.0 .TP .B 16, \fBCOMPRESS_ZLIB\fP zlibを使ってカラムの値を圧縮します。このフラグはGroongaを \fB\-\-with\-zlib\fP つきでビルドすると有効になります。 .TP .B 32, \fBCOMPRESS_LZO\fP lzoを使ってカラムの値を圧縮します。このフラグはGroongaを \fB\-\-with\-lzo\fP つきでビルドすると有効になります。 .UNINDENT .sp インデックス型のカラムについては、flagsの値に以下の値を加えることによって、追加の属 性を指定することができます。 .INDENT 0.0 .TP .B 128, \fBWITH_SECTION\fP 段落情報を格納するインデックスを作成します。 .TP .B 256, \fBWITH_WEIGHT\fP ウェイト情報を格納するインデックスを作成します。 .TP .B 512, \fBWITH_POSITION\fP 位置情報を格納するインデックス(完全転置インデックス)を作成します。 .UNINDENT .UNINDENT .UNINDENT .sp \fBtype\fP .INDENT 0.0 .INDENT 3.5 値の型を指定します。Groongaの組込型か、同一データベースに定義済みのユーザ定義型、定義済みのテーブルを指定することができます。 .UNINDENT .UNINDENT .sp \fBsource\fP .INDENT 0.0 .INDENT 3.5 インデックス型のカラムを作成した場合は、インデックス対象となるカラムをsource引数に指定します。 .UNINDENT .UNINDENT .SS 戻り値 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, SUCCEEDED] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBSUCCEEDED\fP .INDENT 0.0 .INDENT 3.5 コマンドの実行が成功するとtrueを返します。失敗するとエラーとしてfalseを返します。 .UNINDENT .UNINDENT .SS \fBcolumn_list\fP .SS 概要 .sp \fBcolumn_list\fP コマンドはテーブルにあるカラムの一覧を返します。 .SS 構文 .sp このコマンドの引数は1つで必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_list table .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 以下は \fBcolumn_list\fP コマンドの簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Users TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Users age COLUMN_SCALAR UInt8 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Users tags COLUMN_VECTOR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_list Users # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # "id", # "UInt32" # ], # [ # "name", # "ShortText" # ], # [ # "path", # "ShortText" # ], # [ # "type", # "ShortText" # ], # [ # "flags", # "ShortText" # ], # [ # "domain", # "ShortText" # ], # [ # "range", # "ShortText" # ], # [ # "source", # "ShortText" # ] # ], # [ # 256, # "_key", # "", # "", # "COLUMN_SCALAR", # "Users", # "ShortText", # [] # ], # [ # 257, # "age", # "/tmp/groonga\-databases/commands_column_list.0000101", # "fix", # "COLUMN_SCALAR|PERSISTENT", # "Users", # "UInt8", # [] # ], # [ # 258, # "tags", # "/tmp/groonga\-databases/commands_column_list.0000102", # "var", # "COLUMN_VECTOR|PERSISTENT", # "Users", # "ShortText", # [] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションでは \fBcolumn_list\fP の引数について説明します。 .SS 必須引数 .sp すべての引数は必須です。 .SS \fBtable\fP .sp カラムの一覧を取得するテーブルの名前を指定します。 .SS 戻り値 .sp \fBcolumn_list\fP はテーブルのカラム一覧を返します。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, [ COLUMN_LIST_HEADER, COLUMN_INFORMATION1, COLUMN_INFORMATION2, ... ] ] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBCOLUMN_LIST_HEADER\fP .INDENT 0.0 .INDENT 3.5 \fBCOLUMN_LIST_HEADER\fP は 各 \fBCOLUMN_INFORMATION\fP の内容を説明します。 .sp \fBCOLUMN_LIST_HEADER\fP は以下の形式です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ ["id", "UInt32"], ["name", "ShortText"], ["path", "ShortText"], ["type", "ShortText"], ["flags", "ShortText"], ["domain", "ShortText"], ["range", "ShortText"], ["source", "ShortText"] ] .ft P .fi .UNINDENT .UNINDENT .sp 以下のことを意味します。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBCOLUMN_INFORMATION\fP の1番目の要素は \fBid\fP の値で、その値の型は \fBUInt32\fP です。 .IP \(bu 2 \fBCOLUMN_INFORMATION\fP の2番目の要素は \fBname\fP の値で、その値の型は \fBShortText\fP です。 .IP \(bu 2 \fBCOLUMN_INFORMATION\fP の3番目の要素は… .UNINDENT .UNINDENT .UNINDENT .sp 詳細については、次の \fBCOLUMN_INFORMATION\fP の説明を参照して下さい。 .sp このフィールドはカラムの情報のメタデータを提供します。したがって、このフィールドは人ではなくプログラムに有用です。 .UNINDENT .UNINDENT .sp \fBCOLUMN_INFORMATION\fP .INDENT 0.0 .INDENT 3.5 各 \fBCOLUMN_INFORMATION\fP は以下の形式です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ ID, NAME, PATH, TYPE, FLAGS, DOMAIN, RANGE, SOURCES ] .ft P .fi .UNINDENT .UNINDENT .sp \fBID\fP .INDENT 0.0 .INDENT 3.5 GroongaデータベースのカラムIDです。通常、それを気にする必要はありません。 .UNINDENT .UNINDENT .sp \fBNAME\fP .INDENT 0.0 .INDENT 3.5 カラム名。 .UNINDENT .UNINDENT .sp \fBPATH\fP .INDENT 0.0 .INDENT 3.5 カラムのデータを保存しているパス。 .UNINDENT .UNINDENT .sp \fBTYPE\fP .INDENT 0.0 .INDENT 3.5 カラムの型。次のうちのどれかです。 .TS center; |l|l|. _ T{ Value T} T{ 説明 T} _ T{ \fBfix\fP T} T{ このカラムは、固定長カラムです。固定長型のスカラーカラムは、固定長カラムです。 T} _ T{ \fBvar\fP T} T{ このカラムは、可変長カラムです。ベクターカラムまたは可変長型のスカラーカラムは、可変長カラムです。 T} _ T{ \fBindex\fP T} T{ このカラムはインデックスカラムです。 T} _ .TE .UNINDENT .UNINDENT .sp \fBFLAGS\fP .INDENT 0.0 .INDENT 3.5 カラムのフラグです。各フラグは、\fBCOLUMN_VECTOR|WITH_WEIGHT\fP のように \fB|\fP で分けられています。 \fBFLAGS\fP は、\fBCOLUMN_SCALAR\fP , \fBCOLUMN_VECTOR\fP , \fBCOLUMN_INDEX\fP のいずれか1つを含まなければいけません。他のフラグは省略可能です。 .sp 有効なフラグは以下の通りです。 .TS center; |l|l|. _ T{ フラグ T} T{ 説明 T} _ T{ \fBCOLUMN_SCALAR\fP T} T{ このカラムはスカラーカラムです。 T} _ T{ \fBCOLUMN_VECTOR\fP T} T{ このカラムはベクターカラムです。 T} _ T{ \fBCOLUMN_INDEX\fP T} T{ このカラムはインデックスカラムです。 T} _ T{ \fBWITH_WEIGHT\fP T} T{ このカラムは、重みを持つことができます。 \fBCOLUMN_VECTOR\fP と \fBCOLUMN_INDEX\fP は重みを持てます。 \fBCOLUMN_SCALAR\fP は、重みを持ちません。 T} _ T{ \fBWITH_SECTION\fP T} T{ このカラムはセクション(段落)情報を持つことができます。 \fBCOLUMN_INDEX\fP はセクション(段落)情報を持てます。 \fBCOLUMN_SCALAR\fP と \fBCOLUMN_VECTOR\fP はセクション(段落)情報を持ちません。 .sp マルチカラムインデックスはこのフラグを持ちます。 T} _ T{ \fBWITH_POSITION\fP T} T{ このカラムは出現位置情報を持つことができます。 \fBCOLUMN_INDEX\fP は出現位置情報を持てます。 \fBCOLUMN_SCALAR\fP と \fBCOLUMN_VECTOR\fP は出現位置情報を持ちません。 .sp 全文検索インデックスはこのフラグを持つべきです。 T} _ T{ \fBPERSISTENT\fP T} T{ このカラムは永続カラムです。それは \fB/reference/columns/pseudo\fP ではないことを意味します。 T} _ .TE .UNINDENT .UNINDENT .sp \fBDOMAIN\fP .INDENT 0.0 .INDENT 3.5 カラムを持っているテーブルの名前です。 .UNINDENT .UNINDENT .sp \fBRANGE\fP .INDENT 0.0 .INDENT 3.5 カラムの型名です。型名かテーブル名です。 .UNINDENT .UNINDENT .sp \fBSOURCES\fP .INDENT 0.0 .INDENT 3.5 インデックスのソースカラム名の配列です。インデックスカラムがマルチカラムインデックスの場合、配列は2つまたはそれ以上のソースカラム名を有します。 .sp \fBCOLUMN_SCALAR\fP と \fBCOLUMN_VECTOR\fP では常に空の配列です。 .UNINDENT .UNINDENT .UNINDENT .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/commands/column_create\fP .IP \(bu 2 \fB/reference/column\fP .UNINDENT .SS \fBcolumn_remove\fP .SS 概要 .sp column_remove \- テーブルに定義されているカラムの削除 .sp Groonga組込コマンドの一つであるcolumn_removeについて説明します。組込コマンドは、groonga実行ファイルの引数、>標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp column_removeはテーブルに定義されているカラムを削除します。 また、付随するインデックスも削除されます。[1] .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_remove table name .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_remove Entry body [true] .ft P .fi .UNINDENT .UNINDENT 脚注 .IP [1] 5 マルチセクションインデックスの一部である場合も、インデックスが削除されます。 .SS 引数 .sp \fBtable\fP .INDENT 0.0 .INDENT 3.5 削除対象のカラムが定義されているテーブルの名前を指定します。 .UNINDENT .UNINDENT .sp \fBname\fP .INDENT 0.0 .INDENT 3.5 削除対象のカラム名を指定します。 .UNINDENT .UNINDENT .SS 戻り値 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [成功かどうかのフラグ] .ft P .fi .UNINDENT .UNINDENT .sp \fB成功かどうかのフラグ\fP .INDENT 0.0 .INDENT 3.5 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。 .UNINDENT .UNINDENT .SS \fBcolumn_rename\fP .SS 概要 .sp \fBcolumn_rename\fP コマンドはカラム名を変更します。 .sp これは軽い操作です。名前とカラムオブジェクト間の関係を変更するだけです。カラムの値をコピーしません。 .sp これは危険な操作です。 \fBcolumn_rename\fP を実行している間、読み取り操作を含む全ての操作を停止しなければいけません。以下のケースが起こった場合、Groongaプロセスはクラッシュするかもしれません。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 現在のカラム名で名前を変更しようとしているカラムにアクセスする操作(たとえば \fBselect\fP )を開始します。以降、現在のカラム名を \fB古いカラム名\fP と呼ぶことにします。これは、今、このカラム名を変更しようとしているからです。 .IP \(bu 2 \fBcolumn_rename\fP を実行します。 \fBselect\fP は実行中です。 .IP \(bu 2 \fBselect\fP は古いカラム名で名前が変更されたカラムにアクセスします。しかし、カラムはすでに新しいカラム名に変更されているため、 \fBselect\fP は古いカラム名でカラムを見つけることができません。このときGroongaプロセスがクラッシュするかもしれません。 .UNINDENT .UNINDENT .UNINDENT .SS 構文 .sp このコマンドの引数は3つです。 .sp すべての引数は必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_rename table name new_name .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 以下は \fBcolumn_rename\fP コマンドの簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Users TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Users score COLUMN_SCALAR Int32 # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Users [ {"_key": "Alice", "score": 2}, {"_key": "Bob", "score": 0}, {"_key": "Carlos", "score": \-1} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] column_rename Users score point # [[0, 1337566253.89858, 0.000355720520019531], true] column_list Users # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # "id", # "UInt32" # ], # [ # "name", # "ShortText" # ], # [ # "path", # "ShortText" # ], # [ # "type", # "ShortText" # ], # [ # "flags", # "ShortText" # ], # [ # "domain", # "ShortText" # ], # [ # "range", # "ShortText" # ], # [ # "source", # "ShortText" # ] # ], # [ # 256, # "_key", # "", # "", # "COLUMN_SCALAR", # "Users", # "ShortText", # [] # ], # [ # 257, # "point", # "/tmp/groonga\-databases/commands_column_rename.0000101", # "fix", # "COLUMN_SCALAR|PERSISTENT", # "Users", # "Int32", # [] # ] # ] # ] select Users # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "point", # "Int32" # ] # ], # [ # 1, # "Alice", # 2 # ], # [ # 2, # "Bob", # 0 # ], # [ # 3, # "Carlos", # \-1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションでは \fBcolumn_rename\fP の引数について説明します。 .SS 必須引数 .sp すべての引数は必須です。 .SS \fBtable\fP .sp 名前を変更したいカラムが所属するテーブルの名前を指定します。 .SS \fBname\fP .sp 名前を変更するカラムの名前を指定します。 .SS \fBnew_name\fP .sp 新しいカラム名を指定します。 .SS 戻り値 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, SUCCEEDED_OR_NOT] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBSUCCEEDED_OR_NOT\fP .INDENT 0.0 .INDENT 3.5 コマンドの実行が成功するとtrueを返します。失敗するとfalseを返します。 .UNINDENT .UNINDENT .SS \fBdatabase_unmap\fP .SS 概要 .sp バージョン 5.0.7 で追加. .sp \fBdatabase_unmap\fP はデータベース中のすでにマップしてあるテーブルとカラムをアンマップします。「マップ」とはテーブルとカラムをディスクからロードしてメモリー上に展開することです。「アンマップ」とはマップしたメモリーを解放することです。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 通常、 \fBdatabase_unmap\fP を使う必要はありません。なぜなら、OSが賢くメモリーを管理してくれるからです。もし、システムの残メモリーが少なくなったら、OSはGroongaが使っているメモリーをディスクに退避します。退避したメモリーは必要になったらまたメモリーに戻します。OSは使っていないメモリーを優先して退避します。 .UNINDENT .UNINDENT .sp \fBご用心:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは \fBthread_limit\fP が \fB1\fP を返すときしか使えません。つまり、マルチスレッド環境ではこのコマンドは動かないということです。 .UNINDENT .UNINDENT .SS 構文 .sp このコマンドに引数はありません: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C database_unmap .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 最大スレッド数を \fB1\fP に変更したあとならデータベースをアンマップできます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C thread_limit \-\-max 1 # [[0, 1337566253.89858, 0.000355720520019531], 2] database_unmap # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 最大スレッド数が \fB1\fP より大きい場合は \fBdatabase_unmap\fP は失敗します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C thread_limit \-\-max 2 # [[0, 1337566253.89858, 0.000355720520019531], 1] database_unmap # [ # [ # \-2, # 1337566253.89858, # 0.000355720520019531, # "[database_unmap] the max number of threads must be 1: <2>", # [ # [ # "proc_database_unmap", # "proc.c", # 6931 # ] # ] # ], # false # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションではすべての引数について説明します。 .SS 必須引数 .sp 必須の引数はありません。 .SS 省略可能引数 .sp 省略可能な引数はありません。 .SS 戻り値 .sp このコマンドが成功したときは以下のようにボディは \fBtrue\fP になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, true] .ft P .fi .UNINDENT .UNINDENT .sp このコマンドが失敗すると、 \fBHEADER\fP にエラーの詳細が含まれます。 .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS \fBdefine_selector\fP .SS 概要 .sp define_selector \- 検索コマンドを定義 .sp Groonga組込コマンドの一つであるdefine_selectorについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp define_selectorは、検索条件をカスタマイズした新たな検索コマンドを定義します。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C define_selector name table [match_columns [query [filter [scorer [sortby [output_columns [offset [limit [drilldown [drilldown_sortby [drilldown_output_columns [drilldown_offset [drilldown_limit]]]]]]]]]]]]] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp テーブルEntryの全レコード・全カラムの値を出力するselectorコマンドを定義します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C define_selector entry_selector Entry [true] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp \fBname\fP .INDENT 0.0 .INDENT 3.5 定義するselectorコマンドの名前を指定します。 .UNINDENT .UNINDENT .sp \fBtable\fP .INDENT 0.0 .INDENT 3.5 検索対象のテーブルを指定します。 .UNINDENT .UNINDENT .sp \fBmatch_columns\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのmatch_columns引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .sp \fBquery\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのquery引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .sp \fBfilter\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのfilter引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .sp \fBscorer\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのscorer引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .sp \fBsortby\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのsortby引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .sp \fBoutput_columns\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのoutput_columns引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .sp \fBoffset\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのoffset引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .sp \fBlimit\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのlimit引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .sp \fBdrilldown\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのdrilldown引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .sp \fBdrilldown_sortby\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのdrilldown_sortby引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .sp \fBdrilldown_output_columns\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのdrilldown_output_columns引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .sp \fBdrilldown_offset\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのdrilldown_offset引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .sp \fBdrilldown_limit\fP .INDENT 0.0 .INDENT 3.5 追加するselectorコマンドのdrilldown_limit引数のデフォルト値を指定します。 .UNINDENT .UNINDENT .SS 戻り値 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [成功かどうかのフラグ] .ft P .fi .UNINDENT .UNINDENT .sp \fB成功かどうかのフラグ\fP .INDENT 0.0 .INDENT 3.5 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。 .UNINDENT .UNINDENT .SS 参考 .sp \fB/reference/grn_expr\fP .SS \fBdefrag\fP .SS 概要 .sp \fBdefrag\fP コマンドは指定されたオブジェクトのフラグメンテーションを解消します。 .sp Groonga組込コマンドの一つであるdefragについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力 、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp defragは、対象となるオブジェクト(データベースか可変長サイズカラム)を指定し、オブジェクトのフラグメンテーショ ンを解消します。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C defrag objname threshold .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 開いているデータベースのフラグメンテーションを解消する: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C defrag [300] .ft P .fi .UNINDENT .UNINDENT .sp テーブル名 Entry のカラム body のフラグメンテーションを解消する: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C defrag Entry.body [30] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp \fBobjname\fP .INDENT 0.0 .INDENT 3.5 対象となるオブジェクト名を指定します。空の場合、開いているdbオブジェクトが対象となります。 .UNINDENT .UNINDENT .SS 戻り値 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [フラグメンテーション解消を実行したセグメントの数] .ft P .fi .UNINDENT .UNINDENT .sp \fBフラグメンテーション解消を実行したセグメントの数\fP .INDENT 0.0 .INDENT 3.5 フラグメンテーション解消を実行したセグメントの数を返す。 .UNINDENT .UNINDENT .SS \fBdelete\fP .SS 概要 .sp \fBdelete\fP コマンドは指定したテーブルのレコードを削除します。 .SS カスケード削除 .sp 複数のテーブルが関連付けられていることがあります。例えば、あるテーブルのキーが他のテーブルのレコードで参照されているような場合です。そのような場合にそのテーブルのキーを削除するなら、他のテーブルのレコードも削除されます。 .sp 他のテーブルのカラムの型がCOLUMN_VECTORなら、ベクターで参照しているキーだけが削除されます。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C delete table [key [id [filter]]] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp "2"をキーとしてもつEntryテーブルからレコードを削除します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C delete Entry 2 # [[0, 1337566253.89858, 0.000355720520019531], true] select Entry # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "UInt32" # ], # [ # "status", # "ShortText" # ] # ], # [ # 1, # 1, # "OK" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 以下はカスケード削除の例です。 .sp UsersテーブルのcountryカラムはCountryテーブルと関連しています。 .sp "カスケード削除"は指定されたキーやそのキーを参照しているレコードを削除します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Country TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Users TABLE_HASH_KEY UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Users name COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Users country COLUMN_SCALAR Country # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Users [ {"_key": 1, "name": "John", country: "United States"} {"_key": 2, "name": "Mike", country: "United States"} {"_key": 3, "name": "Takashi", country: "Japan"} {"_key": 4, "name": "Hanako", country: "Japan"} ] # [[0, 1337566253.89858, 0.000355720520019531], 4] load \-\-table Country [ {"_key": "United States"} {"_key": "Japan"} ] # [[0, 1337566253.89858, 0.000355720520019531], 2] delete Country "United States" # [[0, 1337566253.89858, 0.000355720520019531], true] select Country # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ] # ], # [ # 2, # "Japan" # ] # ] # ] # ] select Users # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 4 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "UInt32" # ], # [ # "country", # "Country" # ], # [ # "name", # "ShortText" # ] # ], # [ # 1, # 1, # "", # "John" # ], # [ # 2, # 2, # "", # "Mike" # ], # [ # 3, # 3, # "Japan", # "Takashi" # ], # [ # 4, # 4, # "Japan", # "Hanako" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp \fBtable\fP .INDENT 0.0 .INDENT 3.5 レコードを削除するテーブルの名前を指定します。 .UNINDENT .UNINDENT .sp \fBkey\fP .INDENT 0.0 .INDENT 3.5 削除するレコードのキーを指定します。TABLE_NO_KEYを対象となるテーブルに使用しているなら、指定したキーは無視されます。(そのような場合には 引数 \fBid\fP を使います。) .UNINDENT .UNINDENT .sp \fBid\fP .INDENT 0.0 .INDENT 3.5 削除するレコードのIDを指定します。 引数 \fBid\fP を指定する場合、引数 \fBkey\fP を指定してはいけません。 .UNINDENT .UNINDENT .sp \fBfilter\fP .INDENT 0.0 .INDENT 3.5 レコードを特定するためのgrn_exprの式を指定します。引数 \fBfilter\fP を指定するなら、引数 \fBkey\fP や \fBid\fP を指定してはいけません。 .UNINDENT .UNINDENT .SS 戻り値 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, SUCCEEDED_OR_NOT] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBSUCCEEDED_OR_NOT\fP .INDENT 0.0 .INDENT 3.5 コマンドの実行が成功するとtrueを返します。失敗するとエラーとしてfalseを返します。 .UNINDENT .UNINDENT .SS 参考 .sp \fBload\fP .SS \fBdump\fP .SS 概要 .sp dump \- データベースのスキーマとデータを出力する .sp Groonga組込コマンドの一つであるdumpについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、 またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp dumpはデータベースのスキーマとデータを後から読み込めるフォーマットで出力します。dumpの結果は大きくなるため、 主にコマンドラインから使うことを想定しています。データベースのバックアップが主な利用方法です。 .sp dumpが出力するフォーマットは直接Groongaが解釈できるフォーマットです。そのため、以下のようにしてデータベース>をコピーすることができます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga original/db dump > dump.grn % mkdir backup % groonga \-n backup/db < dump.grn .ft P .fi .UNINDENT .UNINDENT .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C dump [tables] [dump_plugins] [dump_schema] [dump_records] [dump_indexes] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp dumpの挙動を確認するためのスキーマ定義とサンプルデータは以下の通りです。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_register token_filters/stop_word table_create Bookmarks TABLE_HASH_KEY ShortText column_create Bookmarks title COLUMN_SCALAR ShortText table_create Lexicon TABLE_PAT_KEY ShortText table_create Sites TABLE_NO_KEY column_create Sites url COLUMN_SCALAR ShortText column_create Lexicon bookmark_title COLUMN_INDEX Bookmarks title load \-\-table Bookmarks [ {"_key":"Groonga", "title":"Introduction to Groonga"}, {"_key":"Mroonga", "title":"Introduction to Mroonga"} ] load \-\-table Sites [ {"_key": 1, "url":"http://groonga.org"}, {"_key": 2, "url":"http://mroonga.org"} ] .ft P .fi .UNINDENT .UNINDENT .sp データベースのすべてのデータをダンプ: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > dump plugin_register token_filters/stop_word table_create Sites TABLE_NO_KEY column_create Sites url COLUMN_SCALAR ShortText table_create Bookmarks TABLE_HASH_KEY ShortText column_create Bookmarks title COLUMN_SCALAR ShortText table_create Lexicon TABLE_PAT_KEY ShortText load \-\-table Sites [ ["_id","url"], [1,"http://groonga.org"], [2,"http://mroonga.org"] ] load \-\-table Bookmarks [ ["_key","title"], ["Groonga","Introduction to Groonga"], ["Mroonga","Introduction to Mroonga"] ] create Lexicon bookmark_title COLUMN_INDEX Bookmarks title .ft P .fi .UNINDENT .UNINDENT .sp スキーマと指定したテーブルのデータをダンプ: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > dump Bookmarks plugin_register token_filters/stop_word table_create Sites TABLE_NO_KEY column_create Sites url COLUMN_SCALAR ShortText table_create Bookmarks TABLE_HASH_KEY ShortText column_create Bookmarks title COLUMN_SCALAR ShortText table_create Lexicon TABLE_PAT_KEY ShortText load \-\-table Bookmarks [ ["_key","title"], ["Groonga","Introduction to Groonga"], ["Mroonga","Introduction to Mroonga"] ] column_create Lexicon bookmark_title COLUMN_INDEX Bookmarks title .ft P .fi .UNINDENT .UNINDENT .sp プラグインのみダンプ: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > dump \-\-dump_schema no \-\-dump_records no \-\-dump_indexes no plugin_register token_filters/stop_word .ft P .fi .UNINDENT .UNINDENT .sp レコードのみダンプ: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > dump \-\-dump_schema no \-\-dump_plugins no \-\-dump_indexes no load \-\-table Sites [ ["_id","url"], [1,"http://groonga.org"], [2,"http://mroonga.org"] ] load \-\-table Bookmarks [ ["_key","title"], ["Groonga","Introduction to Groonga"], ["Mroonga","Introduction to Mroonga"] ] .ft P .fi .UNINDENT .UNINDENT .sp スキーマのみダンプ: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > dump \-\-dump_records no \-\-dump_plugins no \-\-dump_indexes no table_create Sites TABLE_NO_KEY column_create Sites url COLUMN_SCALAR ShortText table_create Bookmarks TABLE_HASH_KEY ShortText column_create Bookmarks title COLUMN_SCALAR ShortText table_create Lexicon TABLE_PAT_KEY ShortText .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp いくつか省略可能な引数があります。 .SS 省略可能引数 .SS \fBtables\fP .sp 出力対象のテーブルを「,」(カンマ)区切りで指定します。存在しないテーブルを指定した場合は無視されます。 .SS \fBdump_plugins\fP .sp バージョン 5.0.3 で追加. .sp 登録されたプラグインを出力に含めるかどうかをカスタマイズすることができます。登録されたプラグインを出力から除外する場合、 \fBno\fP を指定します。 .sp デフォルト値は \fByes\fP です。 .SS \fBdump_schema\fP .sp バージョン 5.0.3 で追加. .sp データベーススキーマを出力に含めるかどうかをカスタマイズすることができます。データベーススキーマを出力から除外する場合、 \fBno\fP を指定します。 .sp デフォルト値は \fByes\fP です。 .SS \fBdump_records\fP .sp バージョン 5.0.3 で追加. .sp レコードを出力に含めるかどうかをカスタマイズすることができます。レコードを出力から除外する場合、 \fBno\fP を指定します。 .sp デフォルト値は \fByes\fP です。 .SS \fBdump_indexes\fP .sp バージョン 5.0.3 で追加. .sp インデックスを出力に含めるかどうかをカスタマイズすることができます。インデックスを出力から除外する場合、 \fBno\fP を指定します。 .sp デフォルト値は \fByes\fP です。 .SS 戻り値 .sp データベースのスキーマとデータをGroongaの組み込みコマンド呼び出し形式で出力します。output_type指定は無視されます。 .SS \fBio_flush\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.5 で追加. .sp \fBio_flush\fP はメモリー上のすべての変更を明示的にディスクに書き出します。通常、明示的に \fBio_flush\fP を使う必要はありません。なぜなら、OSが自動的に書き出してくれるからです。また、OSが書き出した方が効率的だからです。 .sp いくつか明示的に \fBio_flush\fP を使う必要があるケースがあります。1つは、システムが不意にクラッシュすることがよくあるケースです。もう1つは、Groongaプロセスを通常の終了プロセスで終了できない可能性があるケースです。(通常の終了プロセスとは、例えば、 \fBshutdown\fP を使った終了プロセスです。)これらのケースでは、Groongaデータベースに変更を加えた後に \fBio_flush\fP を使うとよいです。以下はGroongaデータベースに変更を加えるコマンドのリストです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBload\fP .IP \(bu 2 \fBdelete\fP .IP \(bu 2 \fBtruncate\fP .IP \(bu 2 \fBtable_create\fP .IP \(bu 2 \fBtable_remove\fP .IP \(bu 2 \fBtable_rename\fP .IP \(bu 2 \fBcolumn_create\fP .IP \(bu 2 \fBcolumn_remove\fP .IP \(bu 2 \fBcolumn_rename\fP .IP \(bu 2 \fBplugin_register\fP .IP \(bu 2 \fBplugin_unregister\fP .UNINDENT .UNINDENT .UNINDENT .sp もし、 \fBselect\fP の select\-scorer パラメーターをカラムの値を変更するために使っているなら、 \fBselect\fP もこのリストに入ります。 .sp \fBio_flush\fP は重い処理になる可能性があることに注意してください。もし、メモリー上に多くの変更があるなら、それらをディスクに書き出す処理は重い処理になります。 .SS 構文 .sp このコマンドには2つの引数があります。 .sp すべての引数は省略可能です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush [target_name=null] [recursive=yes] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 引数無しで実行するとメモリー上のすべての変更をディスクに書き出すことができます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp もし変更点を把握しているなら、書き出し対象を狭めることができます。以下はコマンドと書き出し対象の対応表です。 .TS center; |l|l|l|. _ T{ コマンド T} T{ 書き出し対象 T} T{ \fBio_flush\fP の引数 T} _ T{ \fBload\fP と \fBdelete\fP T} T{ テーブルとそのテーブルのカラム。 .sp カラムの中に参照カラムがある場合、参照されているテーブルも書き出し対象になる。 .sp インデックスが張られているカラムがある場合、対応するインデックスカラムとそのインデックスカラムのテーブルも書き出し対象になる。 T} T{ テーブルとそのテーブルのカラム: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-target_name TABLE_NAME .ft P .fi .UNINDENT .UNINDENT .sp 参照されているテーブル: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-target_name REFERENCED_TABLE_NAME \-\-recursive no .ft P .fi .UNINDENT .UNINDENT .sp インデックスカラムのテーブル: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-target_name TABLE_NAME_OF_INDEX_COLUMN \-\-recursive no .ft P .fi .UNINDENT .UNINDENT .sp インデックスカラム: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-target_name TABLE_NAME_OF_INDEX_COLUMN.INDEX_COLUMN .ft P .fi .UNINDENT .UNINDENT T} _ T{ \fBtruncate\fP T} T{ テーブルとそのテーブルのカラム。 .sp カラムの中に参照カラムがある場合、参照されているテーブルも書き出し対象になる。 .sp インデックスが張られているカラムがある場合、対応するインデックスカラムとそのインデックスカラムのテーブルも書き出し対象になる。 .sp データベースも書き出し対象。 T} T{ テーブルとそのテーブルのカラム: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-target_name TABLE_NAME .ft P .fi .UNINDENT .UNINDENT .sp 参照されているテーブル: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-target_name REFERENCED_TABLE_NAME \-\-recursive no .ft P .fi .UNINDENT .UNINDENT .sp インデックスカラムのテーブル: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-target_name TABLE_NAME_OF_INDEX_COLUMN \-\-recursive no .ft P .fi .UNINDENT .UNINDENT .sp インデックスカラム: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-target_name TABLE_NAME_OF_INDEX_COLUMN.INDEX_COLUMN .ft P .fi .UNINDENT .UNINDENT .sp データベース: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-recursive no .ft P .fi .UNINDENT .UNINDENT T} _ T{ \fBtable_create\fP T} T{ 処理対象のテーブルとデータベース。 T} T{ テーブル: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-target_name TABLE_NAME .ft P .fi .UNINDENT .UNINDENT .sp データベース: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-recursive no .ft P .fi .UNINDENT .UNINDENT T} _ T{ \fBtable_remove\fP と \fBtable_rename\fP T} T{ データベース。 T} T{ データベース: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-recursive no .ft P .fi .UNINDENT .UNINDENT T} _ T{ \fBcolumn_create\fP T} T{ 処理対象のカラムとデータベース。 T} T{ テーブル: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-target_name TABLE_NAME.COLUMN_NAME .ft P .fi .UNINDENT .UNINDENT .sp データベース: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-recursive no .ft P .fi .UNINDENT .UNINDENT T} _ T{ \fBcolumn_remove\fP と \fBcolumn_rename\fP T} T{ データベース。 T} T{ データベース: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-recursive no .ft P .fi .UNINDENT .UNINDENT T} _ T{ \fBplugin_register\fP と \fBplugin_unregister\fP T} T{ データベース。 T} T{ データベース: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-recursive no .ft P .fi .UNINDENT .UNINDENT T} _ .TE .SS 引数 .sp このセクションではすべての引数について説明します。 .SS 必須引数 .sp 必須の引数はありません。 .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBtarget_name\fP .sp 書き出し対象オブジェクトの名前を指定します。書き出し対象オブジェクトはデータベース、テーブル、カラムのどれかです。 .sp このパラメーターを省略すると、データベースが書き出し対象オブジェクトになります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp テーブル名を指定すると、そのテーブルが書き出し対象オブジェクトになります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Users TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] io_flush \-\-target_name Users # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp カラム名を指定すると、そのカラムが書き出し対象オブジェクトになります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create Users age COLUMN_SCALAR UInt8 # [[0, 1337566253.89858, 0.000355720520019531], true] io_flush \-\-target_name Users.age # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .SS \fBrecursive\fP .sp 書き出し対象オブジェクトの子オブジェクトも書き出し対象にするかどうかを指定します。 .sp データベースの子オブジェクトはすべてのテーブルとすべてのカラムです。 .sp テーブルの子オブジェクトはそのテーブルのすべてのカラムです。 .sp カラムの子オブジェクトはありません。 .sp \fBrecursive\fP の値は \fByes\fP または \fBno\fP でなければいけません。 \fByes\fP は指定した書き出し対象オブジェクトとその子オブジェクトすべてを書き出し対象オブジェクトにするという意味です。 \fBno\fP は指定した書き出し対象オブジェクトのみを書き出し対象オブジェクトにするという意味です。 .sp 次の \fBio_flush\fP はデータベースとすべてのテーブルとすべてのカラムのすべての変更を書き出します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-recursive yes # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 次の \fBio_flush\fP はデータベースの変更だけを書き出します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-recursive no # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 他の値(つまり、 \fByes\fP でも \fBno\fP でもない値)を指定した場合、または \fBrecursive\fP パラメーターを指定しない場合は \fByes\fP が使われます。 .sp \fBrecursive\fP 引数の値が不正なので、次のケースでは \fByes\fP が使われます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush \-\-recursive invalid # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fBrecursive\fP パラメーターが指定されていないので、次のケースでは \fByes\fP が使われます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C io_flush # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .SS 戻り値 .sp このコマンドが成功したときは以下のようにボディは \fBtrue\fP になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, true] .ft P .fi .UNINDENT .UNINDENT .sp このコマンドが失敗すると、 \fBHEADER\fP にエラーの詳細が含まれます。 .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS \fBload\fP .SS 概要 .sp \fBload\fP は、使用しているデータベースのテーブルにレコードを登録し、カラムの値を更新します。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load values table [columns [ifexists [input_type]]] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションではすべての引数について説明します。 .sp \fBvalues\fP .INDENT 0.0 .INDENT 3.5 input_typeに指定する形式で登録するレコードの値を表現した文字列を渡します。 input_typeがjsonである場合には、以下のいずれかの形式が使用できます。 .INDENT 0.0 .TP .B \fB形式1:\fP [[カラム名1, カラム名2,..], [カラム値1, カラム値2,..], [カラム値1, カラム値2,..],..] .TP .B \fB形式2:\fP [{カラム名1: カラム値1, カラム名2: カラム値2}, {カラム名1: カラム値1, カラム名2: カラム値2},..] .UNINDENT .sp 形式1の[カラム名1, カラム名2,..]の要素は \fBcolumns\fP 引数が省略された場合のみ有効です。 .sp 対象のテーブルが主キーを持つテーブルであった場合は、カラム名の中に \fB_key\fP (主キーを示す疑似カラム名)が含まれていなければなりません。 .sp \fBvalues\fP 引数が省略された場合には、括弧の対応が取れるまで標準入力から \fBvalues\fP の値を読み取ります。引数として値を指定する場合は、文字列のエスケープが必要ですが、標準入力から与える文字列はエスケープする必要がありません。 .sp 続きの文字列については、空白文字(\(aq \(aq)をエスケープする必要はありません。 .UNINDENT .UNINDENT .sp \fBtable\fP .INDENT 0.0 .INDENT 3.5 レコードを追加しようとするテーブルの名前を指定します。 .UNINDENT .UNINDENT .sp \fBcolumns\fP .INDENT 0.0 .INDENT 3.5 テーブルに登録するレコードに値を設定するカラム名のリストを、カンマ区切りで指定します。 .UNINDENT .UNINDENT .sp \fBifexists\fP .INDENT 0.0 .INDENT 3.5 指定した主キーに対応するレコードが既にテーブルに登録済みであった場合に実行するscript形式の \fBgrn_expr\fP 文字列を指定します。 \fBifexists\fP に \fBgrn_expr\fP が指定された場合は、式の値が真である場合に限り、その他のカラムの値が更新されます。(デフォルトはtrue) .UNINDENT .UNINDENT .sp \fBinput_type\fP .INDENT 0.0 .INDENT 3.5 入力形式を指定します。JSONのみに対応しています。 .UNINDENT .UNINDENT .SS 使い方 .sp テーブルEntryにレコードを登録します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Entry \-\-input_type json \-\-values [{\e"_key\e":\e"Groonga\e",\e"body\e":\e"It\(aqs very fast!!\e"}] [1] .ft P .fi .UNINDENT .UNINDENT .sp 標準入力からvaluesの値を与えます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Entry \-\-input_type json [ {"_key": "Groonga", "body": "It\(aqs very fast!!"} ] [1] .ft P .fi .UNINDENT .UNINDENT .SS 戻り値 .SS JSON形式 .INDENT 0.0 .INDENT 3.5 テーブルに登録されたレコードの件数が返されます。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [NUMBER] .ft P .fi .UNINDENT .UNINDENT .UNINDENT .UNINDENT .SS 参考 .sp \fB/reference/grn_expr\fP .SS \fBlock_clear\fP .SS 概要 .sp バージョン 4.0.9 で追加. .sp \fBlock_clear\fP command clear the lock of the target object recursively. The target object is one of database, table and column. .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 This is a dangerous command. You must not use this command while other process or thread is doing a write operation to the target object. If you do it, your database may be broken and/or your process may be crashed. .UNINDENT .UNINDENT .SS 構文 .sp このコマンドの引数は1つで省略できます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C lock_clear [target_name=null] .ft P .fi .UNINDENT .UNINDENT .sp If \fBtarget_name\fP parameters is omitted, database is used for the target object. It means that all locks in the database are cleared. .SS 使い方 .sp 以下はデータベースの中のすべてのロックを解放する例です: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C lock_clear # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 以下は \fBEntry\fP テーブルと \fBEntry\fP テーブルのカラムのロックを解放する例です: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entry TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entry body COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] lock_clear Entry # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 以下は \fBSite.title\fP カラムのロックを解放する例です: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Site TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Site title COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] lock_clear Site.title # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションではすべての引数について説明します。 .SS \fBtarget_name\fP .sp テーブル名またはカラム名を指定します。 .sp If you don\(aqt specify it, database is used for the target object. .sp The default is none. It means that the target object is database. .SS 戻り値 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, SUCCEEDED_OR_NOT] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBSUCCEEDED_OR_NOT\fP .INDENT 0.0 .INDENT 3.5 コマンドの実行が成功するとtrueを返します。失敗するとエラーとしてfalseを返します。 .UNINDENT .UNINDENT .SS \fBlog_level\fP .SS 概要 .sp log_level \- ログ出力レベルの設定 .sp Groonga組込コマンドの一つであるlog_levelについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp log_levelは、ログ出力レベルを設定します。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C log_level level .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C log_level warning [true] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp \fBlevel\fP .INDENT 0.0 .INDENT 3.5 設定するログ出力レベルの値を以下のいずれかで指定します。 .INDENT 0.0 .INDENT 3.5 EMERG ALERT CRIT error warning notice info debug .UNINDENT .UNINDENT .UNINDENT .UNINDENT .SS 戻り値 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [成功かどうかのフラグ] .ft P .fi .UNINDENT .UNINDENT .sp \fB成功かどうかのフラグ\fP .INDENT 0.0 .INDENT 3.5 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。 .UNINDENT .UNINDENT .SS 参考 .sp \fBlog_put\fP \fBlog_reopen\fP .SS \fBlog_put\fP .SS 概要 .sp log_put \- ログ出力 .sp groonga組込コマンドの一つであるlog_putについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp log_putは、ログにmessageを出力します。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C log_put level message .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C log_put ERROR ****MESSAGE**** [true] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp \fBlevel\fP .INDENT 0.0 .INDENT 3.5 設定するログ出力レベルの値を以下のいずれかで指定します。 .INDENT 0.0 .INDENT 3.5 EMERG ALERT CRIT error warning notice info debug .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp \fBmessage\fP .INDENT 0.0 .INDENT 3.5 出力する文字列を指定します。 .UNINDENT .UNINDENT .SS 戻り値 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [成功かどうかのフラグ] .ft P .fi .UNINDENT .UNINDENT .sp \fB成功かどうかのフラグ\fP .INDENT 0.0 .INDENT 3.5 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。 .UNINDENT .UNINDENT .SS 参考 .sp \fBlog_level\fP \fBlog_reopen\fP .SS \fBlog_reopen\fP .SS 概要 .sp log_reopen \- ログファイルの再読み込み .sp Groonga組込コマンドの一つであるlog_reopenについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp log_reopenは、ログファイルを再読み込みします。 .sp 現在、デフォルトのログ関数を用いている場合のみに対応しています。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C log_reopen .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C log_reopen [true] .ft P .fi .UNINDENT .UNINDENT .SS log_reopenを用いたログのローテーション .INDENT 0.0 .IP 1. 3 ログファイルをmvなどで移動する。 ログはmvで移動された先のファイルに書き込まれる。 .IP 2. 3 log_reopenコマンドを実行する。 .IP 3. 3 既存のログファイル名と同じファイル名で、新たなログファイルが作成される。 今後のログは新たなログファイルに書き込まれる。 .UNINDENT .SS 引数 .sp ありません。 .SS 戻り値 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [成功かどうかのフラグ] .ft P .fi .UNINDENT .UNINDENT .sp \fB成功かどうかのフラグ\fP .INDENT 0.0 .INDENT 3.5 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。 .UNINDENT .UNINDENT .SS 参考 .sp \fBlog_level\fP \fBlog_put\fP .SS \fBlogical_count\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.0 で追加. .sp \fBlogical_count\fP は別のテーブルに保存されているレコードであっても、マッチするレコードをカウントするためのコマンドです。テーブルの最大レコード数の \fB/limitations\fP を気にしなくてすむようになります。 .sp この機能はまだこなれていないので、いくつか制限があります。 .INDENT 0.0 .IP \(bu 2 名前の末尾は "_YYYYMMDD" をつけてテーブルを作成します。これは決め打ちになっていて、日ごとにテーブルを作成しないといけない .IP \(bu 2 自分で個々のテーブルへ適切なデータをロードしないといけない .UNINDENT .SS 構文 .sp このコマンドにはたくさんの引数があります。 .sp 必須引数は2つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_count logical_table shard_key [min] [min_border] [max] [max_border] [filter] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp \fBlogical_count\fP コマンドを使うには事前に \fBsharding\fP プラグインを登録します。 .sp \fBlogical_count\fP コマンドは実験的なプラグインです。このコマンドは将来的に変更されるかもしれません。 .sp この機能を使う簡単な例を示します。複数のテーブルに保存されている特定のログをカウントしてみましょう。 .sp スキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Logs_20150203 TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150203 timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150203 message COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Logs_20150204 TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150204 timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150204 message COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Logs_20150205 TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150205 timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150205 message COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Logs_20150203 [ {"timestamp": "2015\-02\-03 23:59:58", "message": "Start"}, {"timestamp": "2015\-02\-03 23:59:58", "message": "Shutdown"}, {"timestamp": "2015\-02\-03 23:59:59", "message": "Start"}, {"timestamp": "2015\-02\-03 23:59:59", "message": "Shutdown"} ] # [[0, 1337566253.89858, 0.000355720520019531], 4] load \-\-table Logs_20150204 [ {"timestamp": "2015\-02\-04 00:00:00", "message": "Start"}, {"timestamp": "2015\-02\-04 00:00:00", "message": "Shutdown"}, {"timestamp": "2015\-02\-04 00:00:01", "message": "Start"}, {"timestamp": "2015\-02\-04 00:00:01", "message": "Shutdown"}, {"timestamp": "2015\-02\-04 23:59:59", "message": "Start"}, {"timestamp": "2015\-02\-04 23:59:59", "message": "Shutdown"} ] # [[0, 1337566253.89858, 0.000355720520019531], 6] load \-\-table Logs_20150205 [ {"timestamp": "2015\-02\-05 00:00:00", "message": "Start"}, {"timestamp": "2015\-02\-05 00:00:00", "message": "Shutdown"}, {"timestamp": "2015\-02\-05 00:00:01", "message": "Start"}, {"timestamp": "2015\-02\-05 00:00:01", "message": "Shutdown"} ] # [[0, 1337566253.89858, 0.000355720520019531], 4] .ft P .fi .UNINDENT .UNINDENT .sp 2015年の2月3日から5日までに対応したテーブルが3つあります。 .INDENT 0.0 .IP \(bu 2 Logs_20150203 .IP \(bu 2 Logs_20150204 .IP \(bu 2 Logs_20150205 .UNINDENT .sp 対応するテーブルへとデータを投入します。 .sp \fBmessage\fP カラムに "Shutdown" が含まれていて、 \fBtimestamp\fP カラムの値が "2015\-02\-04 00:00:00" 以降であるログをカウントしましょう。 .sp 上記目的を達成するためのクエリがこちらです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_count Logs timestamp \-\-filter \(aqmessage == "Shutdown"\(aq \-\-min "2015\-02\-04 00:00:00" \-\-min_border "include" # [[0, 1337566253.89858, 0.000355720520019531], 5] .ft P .fi .UNINDENT .UNINDENT .sp レコード数には既知の制限があります。制限はテーブルごとなので、シャーディング機能によってその制限を乗り越えることができます。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 SQLの \fBPARTITIONING BY\fP のような便利なクエリはありません。つまり、 \fBtable_create\fP で "_YYYYMMDD" を名前の末尾に含むテーブルをそれぞれの作らなければなりません。 .UNINDENT .UNINDENT .SS 引数 .sp このセクションでは \fBlogical_count\fP の引数について説明します。 .SS 必須引数 .sp 必須引数は二つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .SS \fBlogical_table\fP .sp 論理テーブル名を指定します。これは "_YYYYMMDD" をテーブル名から除いたものです。実際のテーブルが "Logs_20150203" や "Logs_20150203" といったものなら、論理テーブル名は "Logs" です。 .SS \fBshard_key\fP .sp 個々のテーブルで共通のキーとして扱うカラム名を指定します。 .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBmin\fP .sp \fBshard_key\fP の最小値を指定します。 .SS \fBmin_border\fP .sp 最小値を境界値として含めるのか否かを指定します。 \fBinclude\fP もしくは \fBexclude\fP を指定します。 .SS \fBmax\fP .sp \fBshard_key\fP の最大値を指定します。 .SS \fBmax_border\fP .sp 最大値を境界値として含めるのか否かを指定します。 \fBinclude\fP もしくは \fBexclude\fP を指定します。 .SS \fBfilter\fP .SS 戻り値 .sp TODO .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, LOGICAL_COUNT] .ft P .fi .UNINDENT .UNINDENT .SS \fBlogical_parameters\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.6 で追加. .sp \fBlogical_parameters\fP はテスト用のコマンドです。通常はこのコマンドを使う必要はありません。 .sp \fBlogical_parameters\fP は次の2つの機能を提供します。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBlogical_*\fP コマンドが使うパラメーターの現在値を返します。 .IP \(bu 2 \fBlogical_*\fP コマンドが使うパラメーターを新しく設定します。 .UNINDENT .UNINDENT .UNINDENT .sp 以下はパラメーターのリストです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%range_index\fP .UNINDENT .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 これらのパラメーターの値は各スレッドごとで独立しています。(正確に言うと、 \fBgrn_ctx\fP 毎に独立しています。)これらのパラメーターを完全に制御したい場合は、これらのパラメーターを使っている間は \fB/reference/commands/thread_limit\fP を使って最大スレッド数を \fB1\fP にしてください。 .UNINDENT .UNINDENT .SS 構文 .sp このコマンドの引数は1つで省略できます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_parameters [range_index=null] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp このコマンドを使うには事前に \fBsharding\fP プラグインを登録します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_register sharding # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 引数無しで呼び出すとすべてのパラメーターの現在の値を返します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_parameters # [[0, 1337566253.89858, 0.000355720520019531], {"range_index": "auto"}] .ft P .fi .UNINDENT .UNINDENT .sp 引数を指定して呼び出すと新しい値を設定できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_parameters \-\-range_index never # [[0, 1337566253.89858, 0.000355720520019531], {"range_index": "auto"}] .ft P .fi .UNINDENT .UNINDENT .sp \fBlogical_parameters\fP は、新しい値を設定するときは、新しい値を設定する前の値を返します。 .SS 引数 .sp このセクションでは引数について説明します。 .SS 必須引数 .sp 必須の引数はありません。 .SS 省略可能引数 .sp 省略可能な引数が1つあります。 .SS \fBrange_index\fP .sp \fBlogical_range_filter\fP でどのように範囲インデックスを使うかをキーワードで指定します。 .sp 指定できるキーワードは以下の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBauto\fP (デフォルト) .IP \(bu 2 \fBalways\fP .IP \(bu 2 \fBnever\fP .UNINDENT .UNINDENT .UNINDENT .sp \fBauto\fP を指定すると、効果がでそうなときだけ範囲インデックスを使います。これがデフォルトの値です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_parameters \-\-range_index auto # [[0, 1337566253.89858, 0.000355720520019531], {"range_index": "never"}] .ft P .fi .UNINDENT .UNINDENT .sp \fBalways\fP を指定すると、常に範囲インデックスを使います。範囲インデックスが使われるケースをテストするときに便利です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_parameters \-\-range_index always # [[0, 1337566253.89858, 0.000355720520019531], {"range_index": "auto"}] .ft P .fi .UNINDENT .UNINDENT .sp \fBnever\fP を指定すると、範囲インデックスは使いません。範囲インデックスが使われないケースをテストするときに便利です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_parameters \-\-range_index never # [[0, 1337566253.89858, 0.000355720520019531], {"range_index": "always"}] .ft P .fi .UNINDENT .UNINDENT .SS 戻り値 .sp このコマンドは \fBlogical_*\fP コマンドが使うパラメーターの現在地を返します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, {"range_index": HOW_TO_USE_RANGE_INDEX} ] .ft P .fi .UNINDENT .UNINDENT .sp \fBHOW_TO_USE_RANGE_INDEX\fP の値は次のどれかです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB"auto"\fP .IP \(bu 2 \fB"always"\fP .IP \(bu 2 \fB"never"\fP .UNINDENT .UNINDENT .UNINDENT .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS \fBlogical_range_filter\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.0 で追加. .sp TODO: Write summary .SS 構文 .sp このコマンドにはたくさんの引数があります。 .sp 必須引数は2つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_range_filter logical_table shard_key [min=null] [min_border=null] [max=null] [max_border=null] [order=ascending] [filter=null] [offset=0] [limit=10] [output_columns=_key,*] [use_range_index=null] .ft P .fi .UNINDENT .UNINDENT .sp いくつか名前付き引数としてしか使えない引数があります。これらの引数を「○番目の引数」として使うことはできません。必ず名前を指定する必要があります。 .sp 名前付き引数としてしか使えない引数は次の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBcache=no\fP .UNINDENT .UNINDENT .UNINDENT .SS 使い方 .sp \fBlogical_range_filter\fP コマンドを使うには事前に \fBsharding\fP プラグインを登録します。 .sp TODO: Add examples .SS 引数 .sp このセクションでは \fBlogical_range_filter\fP の引数について説明します。 .SS 必須引数 .sp 必須引数は二つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .SS \fBlogical_table\fP .sp 論理テーブル名を指定します。これは "_YYYYMMDD" をテーブル名から除いたものです。実際のテーブルが "Logs_20150203" や "Logs_20150203" といったものなら、論理テーブル名は "Logs" です。 .sp TODO: Add examples .SS \fBshard_key\fP .sp 個々のテーブルで共通のキーとして扱うカラム名を指定します。 .sp TODO: Add examples .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBmin\fP .sp \fBshard_key\fP の最小値を指定します。 .sp TODO: Add examples .SS \fBmin_border\fP .sp 最小値を境界値として含めるのか否かを指定します。 \fBinclude\fP もしくは \fBexclude\fP を指定します。 .sp TODO: Add examples .SS \fBmax\fP .sp \fBshard_key\fP の最大値を指定します。 .sp TODO: Add examples .SS \fBmax_border\fP .sp 最大値を境界値として含めるのか否かを指定します。 \fBinclude\fP もしくは \fBexclude\fP を指定します。 .sp TODO: Add examples .SS \fBorder\fP .sp TODO .SS \fBfilter\fP .sp TODO .SS \fBoffset\fP .sp TODO .SS \fBlimit\fP .sp TODO .SS \fBoutput_columns\fP .sp TODO .SS \fBuse_range_index\fP .sp range_indexを使うかどうかを指定します。ただし、この引数はテスト用なので、本番で使うべきではありません。 .sp TODO: Add examples .SS キャッシュ関連の引数 .SS \fBcache\fP .sp このクエリーの結果をキャッシュするかどうかを指定します。 .sp このクエリーの結果がキャッシュしてあると、次に同じクエリーを実行するときはキャッシュを使って高速にレスポンスを返すことができます。 .sp これは既存のキャッシュされた結果を使うかどうかを指定するものではありません。 .sp 指定可能な値は以下の通りです。 .TS center; |l|l|. _ T{ Value T} T{ 説明 T} _ T{ \fBno\fP T} T{ このクエリーの出力をキャッシュしない。 T} _ T{ \fByes\fP T} T{ このクエリーの出力をキャッシュする。デフォルト値。 T} _ .TE .sp TODO: Add examples .sp デフォルト値は \fByes\fP です。 .SS 戻り値 .sp TODO .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, LOGICAL_FILTERED] .ft P .fi .UNINDENT .UNINDENT .SS \fBlogical_select\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.5 で追加. .sp \fBlogical_select\fP は \fBselect\fP のシャーディングバージョンです。 \fBlogical_select\fP は複数のテーブルからレコードを検索し、マッチしたレコードを出力します。 .sp \fBlogical_select\fP は \fBsharding\fP プラグインに含まれているので、 \fBsharding\fP プラグインを \fBplugin_register\fP する必要があります。 .SS 構文 .sp このコマンドにはたくさんの引数があります。 .sp 必須の引数は \fBlogical_table\fP と \fBshard_key\fP です。それ以外の引数は省略可能です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select logical_table shard_key [min=null] [min_border="include"] [max=null] [max_border="include"] [filter=null] [sortby=null] [output_columns="_id, _key, *"] [offset=0] [limit=10] [drilldown=null] [drilldown_sortby=null] [drilldown_output_columns="_key, _nsubrecs"] [drilldown_offset=0] [drilldown_limit=10] [drilldown_calc_types=NONE] [drilldown_calc_target=null] .ft P .fi .UNINDENT .UNINDENT .sp \fBlogical_select\fP には高度なドリルダウン機能のために以下の名前付き引数があります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBdrilldown[${LABEL}].keys=null\fP .IP \(bu 2 \fBdrilldown[${LABEL}].sortby=null\fP .IP \(bu 2 \fBdrilldown[${LABEL}].output_columns="_key, _nsubrecs"\fP .IP \(bu 2 \fBdrilldown[${LABEL}].offset=0\fP .IP \(bu 2 \fBdrilldown[${LABEL}].limit=10\fP .IP \(bu 2 \fBdrilldown[${LABEL}].calc_types=NONE\fP .IP \(bu 2 \fBdrilldown[${LABEL}].calc_target=null\fP .UNINDENT .UNINDENT .UNINDENT .sp \fB${LABEL}\fP には1つ以上のアルファベット、数字、 \fB_\fP 、 \fB\&.\fP を使うことができます。たとえば、 \fBparent.sub1\fP は有効な \fB${LABEL}\fP です。 .sp 同じ \fB${LABEL}\fP も持つ引数は同じグループになります。 .sp たとえば、以下の引数は1つのドリルダウンを指定しています。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-drilldown[label].keys column\fP .IP \(bu 2 \fB\-\-drilldown[label].sortby \-_nsubrecs\fP .UNINDENT .UNINDENT .UNINDENT .sp 以下の引数は2つのドリルダウンを指定しています。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-drilldown[label1].keys column1\fP .IP \(bu 2 \fB\-\-drilldown[label1].sortby \-_nsubrecs\fP .IP \(bu 2 \fB\-\-drilldown[label2].keys column2\fP .IP \(bu 2 \fB\-\-drilldown[label2].sortby _key\fP .UNINDENT .UNINDENT .UNINDENT .SS \fBselect\fP との違い .sp \fBlogical_select\fP の多くの機能は \fBselect\fP の機能と対応しています。たとえば、引数名は同じですし、出力フォーマットも同じです。 .sp しかし、いくつか \fBselect\fP と違うところもあります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBtable\fP 引数ではなく、 \fBlogical_table\fP と \fBshard_key\fP 引数が必須です。 .IP \(bu 2 複数のシャードを使った場合の \fBsortby\fP はサポートしていません。(1つのシャードのみを使った場合はサポートしています。) .IP \(bu 2 複数のシャードを使った場合、 \fBdrilldown[${LABEL}].sortby\fP の中で \fB_value.${KEY_NAME}\fP を使えません。1つのシャードのみを使った場合は使えます。 .IP \(bu 2 \fBmatch_columns\fP と \fBquery\fP はまだサポートしていません。 .IP \(bu 2 \fBcache\fP はまだサポートしていません。 .IP \(bu 2 \fBmatch_escalation_threshold\fP はまだサポートしていません。 .IP \(bu 2 \fBquery_flags\fP はまだサポートしていません。 .IP \(bu 2 \fBquery_expander\fP はまだサポートしていません。 .IP \(bu 2 \fBadjuster\fP はまだサポートしていません。 .UNINDENT .UNINDENT .UNINDENT .SS 使い方 .sp 例を使いながら \fBlogical_select\fP の使い方を学びましょう。このセクションではよく使われる使い方を紹介します。 .sp \fBlogical_select\fP は \fBsharding\fP プラグインに含まれているので \fBsharding\fP プラグインを登録する必要があります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_register sharding # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entries_20150708 TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150708 created_at COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150708 content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150708 n_likes COLUMN_SCALAR UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150708 tag COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Entries_20150709 TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150709 created_at COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150709 content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150709 n_likes COLUMN_SCALAR UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150709 tag COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \e \-\-default_tokenizer TokenBigram \e \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_key_index_20150708 \e COLUMN_INDEX|WITH_POSITION Entries_20150708 _key # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_content_index_20150708 \e COLUMN_INDEX|WITH_POSITION Entries_20150708 content # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_key_index_20150709 \e COLUMN_INDEX|WITH_POSITION Entries_20150709 _key # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_content_index_20150709 \e COLUMN_INDEX|WITH_POSITION Entries_20150709 content # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Entries_20150708 [ {"_key": "The first post!", "created_at": "2015/07/08 00:00:00", "content": "Welcome! This is my first post!", "n_likes": 5, "tag": "Hello"}, {"_key": "Groonga", "created_at": "2015/07/08 01:00:00", "content": "I started to use Groonga. It\(aqs very fast!", "n_likes": 10, "tag": "Groonga"}, {"_key": "Mroonga", "created_at": "2015/07/08 02:00:00", "content": "I also started to use Mroonga. It\(aqs also very fast! Really fast!", "n_likes": 15, "tag": "Groonga"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] load \-\-table Entries_20150709 [ {"_key": "Good\-bye Senna", "created_at": "2015/07/09 00:00:00", "content": "I migrated all Senna system!", "n_likes": 3, "tag": "Senna"}, {"_key": "Good\-bye Tritonn", "created_at": "2015/07/09 01:00:00", "content": "I also migrated all Tritonn system!", "n_likes": 3, "tag": "Senna"} ] # [[0, 1337566253.89858, 0.000355720520019531], 2] .ft P .fi .UNINDENT .UNINDENT .sp ブログエントリー用に \fBEntries_20150708\fP と \fBEntries_20150709\fP の2つのテーブルがあります。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 テーブル名には \fB${論理テーブル名}_${YYYYMMDD}\fP という命名規則を使う必要があります。この例では、 \fB論理テーブル名\fP は \fBEntries\fP で \fBYYYYMMDD\fP は \fB20150708\fP または \fB20150709\fP です。 .UNINDENT .UNINDENT .sp 各エントリはタイトルと作成日時と内容と「いいね!」数、タグを持っています。タイトルは \fBEntries_YYYYMMDD\fP のキーとします。作成日時は \fBEntries_YYYYMMDD.created_at\fP カラムの値とします。内容は \fBEntries_YYYYMMDD.content\fP カラムの値とします。「いいね!」数は \fBEntries_YYYYMMDD.n_likes\fP カラムの値とします。タグは \fBEntries_YYYYMMDD.tag\fP カラムの値とします。 .sp \fBEntries_YYYYMMDD._key\fP カラムと \fBEntries_YYYYMMDD.content\fP カラムには \fBTokenBigram\fP トークナイザーを使ったインデックスを作成します。そのため、 \fBEntries_YYYYMMDD._key\fP と \fBEntries_YYYYMMDD.content\fP は両方とも全文検索できます。 .sp これで例を示すためのスキーマとデータの準備ができました。 .SS 簡単な使い方 .sp TODO .SS 引数 .sp このセクションでは \fBlogical_select\fP の引数について説明します。 .SS 必須引数 .sp 必須引数は二つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .SS \fBlogical_table\fP .sp 論理テーブル名を指定します。これは \fB_YYYYMMDD\fP をテーブル名からのぞいたものです。実際のテーブルが \fBEntries_20150708\fP や \fBEntries_20150709\fP といったものなら、論理テーブル名は \fBEntries\fP です。 .sp \fBlogical_table\fP と \fBshard_key\fP 引数を指定すると10レコード表示できます。これらの引数は必須の引数です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \-\-logical_table Entries \-\-shard_key created_at # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 1436284800.0, # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1436288400.0, # 15, # "Groonga" # ], # [ # 1, # "Good\-bye Senna", # "I migrated all Senna system!", # 1436367600.0, # 3, # "Senna" # ], # [ # 2, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1436371200.0, # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 存在しないテーブルを指定するとエラーが返ります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \-\-logical_table Nonexistent \-\-shard_key created_at # [ # [ # \-22, # 1337566253.89858, # 0.000355720520019531, # "[logical_select] no shard exists: logical_table: : shard_key: ", # [ # [ # "Groonga::Context.set_groonga_error", # "lib/mrb/scripts/context.rb", # 27 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBshard_key\fP .sp シャードキーとして使うカラム名を指定します。シャードキーは適切なシャードへレコードを分配するために使う値を保存しているカラムです。 .sp 今のところ、シャードキーは \fBTime\fP 型でなければいけません。 .sp \fBshard_key\fP の指定方法は \fI\%logical_table\fP を見てください。 .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBmin\fP .sp \fBshard_key\fP カラムの最小値を指定します。シャードにマッチするレコードがない場合は、そのシャードは検索対象外になります。 .sp たとえば、 \fBmin\fP が \fB"2015/07/09 00:00:00"\fP なら、 \fBEntry_20150708\fP は検索対象外です。なぜなら、 \fBEntry_20150708\fP は \fB"2015/07/08"\fP のレコードしかないからです。 .sp 以下の例は \fBEntry_20150709\fP テーブルだけを使う例です。 \fBEntry_20150708\fP は使われません。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-min "2015/07/09 00:00:00" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "Good\-bye Senna", # "I migrated all Senna system!", # 1436367600.0, # 3, # "Senna" # ], # [ # 2, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1436371200.0, # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBmin_border\fP .sp 最小値を含めるかどうかを指定します。指定可能な値は次の通りです。 .TS center; |l|l|. _ T{ Value T} T{ 説明 T} _ T{ \fBinclude\fP T} T{ \fBmin\fP の値を含みます。これがデフォルト値です。 T} _ T{ \fBexclude\fP T} T{ \fBmin\fP の値を含みません。 T} _ .TE .sp 次の例は \fBexclude\fP の使用例です。結果には \fB"Good\-bye Senna"\fP レコードは含まれません。このレコードの \fBcreated_at\fP の値が \fB"2015/07/09 00:00:00"\fP だからです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-min "2015/07/09 00:00:00" \e \-\-min_border "exclude" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 2, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1436371200.0, # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBmax\fP .sp \fBshard_key\fP カラムの最大値を指定します。シャードにマッチするレコードがない場合、そのシャードは検索対象外になります。 .sp たとえば、 \fBmax\fP が \fB"2015/07/08 23:59:59"\fP なら \fBEntry_20150709\fP は検索対象外です。なぜなら \fBEntry_20150709\fP には \fB""2015/07/09"\fP のレコードしかないからです。 .sp 以下の例は \fBEntry_20150708\fP テーブルだけを使います。 \fBEntry_20150709\fP は使いません。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-max "2015/07/08 23:59:59" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 1436284800.0, # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1436288400.0, # 15, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBmax_border\fP .sp 最大値を含めるかどうかを指定します。指定可能な値は次の通りです。 .TS center; |l|l|. _ T{ Value T} T{ 説明 T} _ T{ \fBinclude\fP T} T{ \fBmax\fP の値を含みます。これがデフォルト値です。 T} _ T{ \fBexclude\fP T} T{ \fBmax\fP の値を含みません。 T} _ .TE .sp 次の例は \fBexclude\fP の使用例です。結果には \fB"Good\-bye Senna"\fP レコードは含まれません。このレコードの \fBcreated_at\fP の値が \fB"2015/07/09 00:00:00"\fP だからです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-max "2015/07/09 00:00:00" \e \-\-max_border "exclude" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 1436284800.0, # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1436288400.0, # 15, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 検索関係の引数 .sp \fBlogical_select\fP は \fBselect\fP 互換の検索関連パラメーターをサポートしています。 .sp \fBmatch_columns\fP と \fBquery\fP はまだサポートしていません。今のところ、 \fBfilter\fP だけサポートしています。 .SS \fBmatch_columns\fP .sp 未実装です。 .SS \fBquery\fP .sp 未実装です。 .SS \fBfilter\fP .sp \fBselect\fP の select\-filter に対応しています。詳細は select\-filter を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-filter "n_likes <= 5" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ], # [ # 1, # "Good\-bye Senna", # "I migrated all Senna system!", # 1436367600.0, # 3, # "Senna" # ], # [ # 2, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1436371200.0, # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 高度な検索のための引数 .sp \fBlogical_select\fP は高度な検索パラメーターをまだ実装していません。 .SS \fBmatch_escalation_threshold\fP .sp 未実装です。 .SS \fBquery_flags\fP .sp 未実装です。 .SS \fBquery_expander\fP .sp 未実装です。 .SS 出力関連の引数 .SS \fBoutput_columns\fP .sp \fBselect\fP の select\-output\-columns に対応しています。詳細は select\-output\-columns を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-output_columns \(aq_key, *\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ], # [ # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 1436284800.0, # 10, # "Groonga" # ], # [ # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1436288400.0, # 15, # "Groonga" # ], # [ # "Good\-bye Senna", # "I migrated all Senna system!", # 1436367600.0, # 3, # "Senna" # ], # [ # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1436371200.0, # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBsortby\fP .sp \fBselect\fP の select\-sortby に対応しています。詳細は select\-sortby を見てください。 .sp \fBsortby\fP には制限があります。検索対象のシャードが1つの場合のみ動作します。もし、検索対象のシャードが複数ある場合、 \fBsortby\fP は正常な動作をしません。 .sp 以下は1つのシャードのみを使っている例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-min "2015/07/08 00:00:00" \e \-\-min_border "include" \e \-\-max "2015/07/09 00:00:00" \e \-\-max_border "exclude" \e \-\-sortby _key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 1436284800.0, # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1436288400.0, # 15, # "Groonga" # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBoffset\fP .sp \fBselect\fP の select\-offset に対応しています。詳細は select\-offset を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-offset 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1436288400.0, # 15, # "Groonga" # ], # [ # 1, # "Good\-bye Senna", # "I migrated all Senna system!", # 1436367600.0, # 3, # "Senna" # ], # [ # 2, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1436371200.0, # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBlimit\fP .sp \fBselect\fP の select\-limit に対応しています。詳細は select\-limit を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 1436284800.0, # 10, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBscorer\fP .sp 未実装です。 .SS ドリルダウン関連の引数 .sp \fBselect\fP のすべてのドリルダウン関連パラメーターをサポートしています。詳細は select\-drilldown\-related\-parameters を見てください。 .SS \fBdrilldown\fP .sp \fBselect\fP の select\-drilldown に対応しています。詳細は select\-drilldown を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-output_columns _key,tag \e \-\-drilldown tag # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "tag", # "ShortText" # ] # ], # [ # "The first post!", # "Hello" # ], # [ # "Groonga", # "Groonga" # ], # [ # "Mroonga", # "Groonga" # ], # [ # "Good\-bye Senna", # "Senna" # ], # [ # "Good\-bye Tritonn", # "Senna" # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown_sortby\fP .sp \fBselect\fP の select\-drilldown\-sortby に対応しています。詳細は select\-drilldown\-sortby を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown tag \e \-\-drilldown_sortby \-_nsubrecs,_key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ], # [ # "Hello", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown_output_columns\fP .sp \fBselect\fP の select\-drilldown\-output\-columns に対応しています。詳細は select\-drilldown\-output\-columns を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown tag \e \-\-drilldown_output_columns _key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ] # ], # [ # "Hello" # ], # [ # "Groonga" # ], # [ # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown_offset\fP .sp \fBselect\fP の select\-drilldown\-offset に対応しています。詳細は select\-drilldown\-offset を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown tag \e \-\-drilldown_offset 1 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown_limit\fP .sp \fBselect\fP の select\-drilldown\-limit に対応しています。詳細は select\-drilldown\-limit を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown tag \e \-\-drilldown_limit 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Groonga", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown_calc_types\fP .sp \fBselect\fP の select\-drilldown\-calc\-types に対応しています。詳細は select\-drilldown\-calc\-types を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit \-1 \e \-\-output_columns tag,n_likes \e \-\-drilldown tag \e \-\-drilldown_calc_types MAX,MIN,SUM,AVG \e \-\-drilldown_calc_target n_likes \e \-\-drilldown_output_columns _key,_nsubrecs,_max,_min,_sum,_avg # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "tag", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # "Hello", # 5 # ], # [ # "Groonga", # 10 # ], # [ # "Groonga", # 15 # ], # [ # "Senna", # 3 # ], # [ # "Senna", # 3 # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ], # [ # "_max", # "Int64" # ], # [ # "_min", # "Int64" # ], # [ # "_sum", # "Int64" # ], # [ # "_avg", # "Float" # ] # ], # [ # "Hello", # 1, # 5, # 5, # 5, # 5.0 # ], # [ # "Groonga", # 2, # 15, # 10, # 25, # 12.5 # ], # [ # "Senna", # 2, # 3, # 3, # 6, # 3.0 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown_calc_target\fP .sp \fBselect\fP の select\-drilldown\-calc\-target に対応しています。詳細は select\-drilldown\-calc\-target を見てください。 .sp 具体例は select\-drilldown\-calc\-types を見てください。 .SS 高度なドリルダウン関連のパラメーター .sp \fBselect\fP のすべての高度なドリルダウン関連のパラメーターをサポートしています。詳細は select\-advanced\-drilldown\-related\-parameters を見てください。 .sp いくつか制限があります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 複数のシャードを使った場合、 \fBdrilldown[${LABEL}].sortby\fP の中で \fB_value.${KEY_NAME}\fP を使えません。1つのシャードのみを使った場合は使えます。 .UNINDENT .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].keys\fP .sp \fBselect\fP の select\-drilldown\-label\-keys に対応しています。詳細は select\-drilldown\-label\-keys を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown[tag.n_likes].keys tag,n_likes \e \-\-drilldown[tag.n_likes].output_columns _value.tag,_value.n_likes,_nsubrecs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # { # "tag.n_likes": [ # [ # 4 # ], # [ # [ # "tag", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 5, # 1 # ], # [ # "Groonga", # 10, # 1 # ], # [ # "Groonga", # 15, # 1 # ], # [ # "Senna", # 3, # 2 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].output_columns\fP .sp \fBselect\fP の select\-drilldown\-label\-output\-columns に対応しています。詳細は select\-drilldown\-label\-output\-columns を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown[tag].keys tag \e \-\-drilldown[tag].output_columns _key,_nsubrecs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # { # "tag": [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].sortby\fP .sp ラベルなしドリルダウンの \fI\%drilldown_sortby\fP に対応しています。 .sp \fBdrilldown[${LABEL}].sortby\fP には制限があります。 .sp 複数のシャードを使った場合、 \fBdrilldown[${LABEL}].sortby\fP の中で \fB_value.${KEY_NAME}\fP を使えません。1つのシャードのみを使った場合は使えます。 .sp 以下は1つのシャードに対して \fB_value.${KEY_NAME}\fP を使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-min "2015/07/08 00:00:00" \e \-\-min_border "include" \e \-\-max "2015/07/09 00:00:00" \e \-\-max_border "exclude" \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown[tag.n_likes].keys tag,n_likes \e \-\-drilldown[tag.n_likes].output_columns _nsubrecs,_value.n_likes,_value.tag \e \-\-drilldown[tag.n_likes].sortby \-_nsubrecs,_value.n_likes,_value.tag # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # { # "tag.n_likes": [ # [ # 3 # ], # [ # [ # "_nsubrecs", # "Int32" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # 5, # "Hello" # ], # [ # 1, # 10, # "Groonga" # ], # [ # 1, # 15, # "Groonga" # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].offset\fP .sp ラベルなしドリルダウンの \fI\%drilldown_offset\fP に対応しています。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown[tag.n_likes].keys tag \e \-\-drilldown[tag.n_likes].offset 1 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # { # "tag.n_likes": [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].limit\fP .sp ラベルなしドリルダウンの \fI\%drilldown_limit\fP に対応しています。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown[tag.n_likes].keys tag \e \-\-drilldown[tag.n_likes].limit 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # { # "tag.n_likes": [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Groonga", # 2 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].calc_types\fP .sp ラベルなしドリルダウンの \fI\%drilldown_calc_types\fP に対応しています。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown[tag].keys tag \e \-\-drilldown[tag].calc_types MAX,MIN,SUM,AVG \e \-\-drilldown[tag].calc_target n_likes \e \-\-drilldown[tag].output_columns _key,_nsubrecs,_max,_min,_sum,_avg # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # { # "tag": [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ], # [ # "_max", # "Int64" # ], # [ # "_min", # "Int64" # ], # [ # "_sum", # "Int64" # ], # [ # "_avg", # "Float" # ] # ], # [ # "Hello", # 1, # 5, # 5, # 5, # 5.0 # ], # [ # "Groonga", # 2, # 15, # 10, # 25, # 12.5 # ], # [ # "Senna", # 2, # 3, # 3, # 6, # 3.0 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].calc_target\fP .sp ラベルなしドリルダウンの \fI\%drilldown_calc_target\fP に対応しています。 .sp 例は \fI\%drilldown[${LABEL}].calc_types\fP を参照してください。 .SS 戻り値 .sp \fBlogical_select\fP の戻り値のフォーマットは \fBselect\fP と同じです。詳細は select\-return\-value を見てください。 .SS \fBlogical_shard_list\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.7 で追加. .sp \fBlogical_shard_list\fP は指定した論理テーブル名に対するすべてのシャード名を返します。 .SS 構文 .sp このコマンドの引数は1つで必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_shard_list logical_table .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp このコマンドを使うには事前に \fBsharding\fP プラグインを登録します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_register sharding # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp サンプルシャードは次の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Logs_20150801 TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150801 timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Logs_20150802 TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150802 timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Logs_20150930 TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150930 timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 論理テーブル名として \fBLogs\fP を指定すると昇順ですべてのシャード名を取得できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_shard_list \-\-logical_table Logs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "name": "Logs_20150801" # }, # { # "name": "Logs_20150802" # }, # { # "name": "Logs_20150930" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションでは引数について説明します。 .SS 必須引数 .sp 必須の引数が1つあります。 .SS \fBlogical_table\fP .sp 論理テーブル名を指定します。 \fBlogical_shard_list\fP は指定した論理テーブルのシャード名のリストを返します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_shard_list \-\-logical_table Logs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "name": "Logs_20150801" # }, # { # "name": "Logs_20150802" # }, # { # "name": "Logs_20150930" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このリストは昇順でソート済みです。 .SS 省略可能引数 .sp 省略可能な引数はありません。 .SS 戻り値 .sp このコマンドは昇順でソートしたシャード名のリストを返します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, [ {"name": "SHARD_NAME_1"}, {"name": "SHARD_NAME_2"}, ... {"name": "SHARD_NAME_N"} ] ] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS 参考 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB/reference/sharding\fP .UNINDENT .UNINDENT .UNINDENT .SS \fBlogical_table_remove\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.5 で追加. .sp TODO .SS 構文 .sp このコマンドにはたくさんの引数があります。 .sp 必須引数は2つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_table_remove logical_table shard_key [min] [min_border] [max] [max_border] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp TODO .SS 引数 .sp このセクションでは \fBlogical_table_remove\fP の引数について説明します。 .SS 必須引数 .sp 必須引数は二つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .SS \fBlogical_table\fP .sp 論理テーブル名を指定します。これは "_YYYYMMDD" をテーブル名から除いたものです。実際のテーブルが "Logs_20150203" や "Logs_20150203" といったものなら、論理テーブル名は "Logs" です。 .SS \fBshard_key\fP .sp 個々のテーブルで共通のキーとして扱うカラム名を指定します。 .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBmin\fP .sp \fBshard_key\fP の最小値を指定します。 .SS \fBmin_border\fP .sp 最小値を境界値として含めるのか否かを指定します。 \fBinclude\fP もしくは \fBexclude\fP を指定します。 .SS \fBmax\fP .sp \fBshard_key\fP の最大値を指定します。 .SS \fBmax_border\fP .sp 最大値を境界値として含めるのか否かを指定します。 \fBinclude\fP もしくは \fBexclude\fP を指定します。 .SS 戻り値 .sp TODO .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, true] .ft P .fi .UNINDENT .UNINDENT .SS \fBnormalize\fP .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .sp このコマンドは将来的に変更されるかもしれません。 .UNINDENT .UNINDENT .SS 概要 .sp \fBnormalize\fP コマンドは指定したノーマライザーでテキストを正規化します。 .sp \fBnormalize\fP コマンドを使うのにテーブルを作成する必要はありません。このコマンドは、ノーマライザーの結果を確認するのに便利です。 .SS 構文 .sp このコマンドの引数は3つです。 .sp \fBnormalizer\fP と \fBstring\fP が必須です。他は省略できます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C normalize normalizer string [flags=NONE] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 以下は \fBnormalize\fP コマンドの簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C normalize NormalizerAuto "aBcDe 123" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "normalized": "abcde 123", # "types": [], # "checks": [] # } # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションでは \fBnormalizer\fP の引数について説明します。 .SS 必須引数 .sp 必須引数は二つあります。 \fBnormalizer\fP と \fBstring\fP です。 .SS \fBnormalizer\fP .sp ノーマライザー名を指定します。 \fBnormalize\fP コマンドは \fBnormalizer\fP で指定された名前のノーマライザーを使います。 .sp 組み込みのノーマライザーの一覧は \fB/reference/normalizers\fP にあります。 .sp 以下は \fBNormalizerAuto\fP ノーマライザーを使う例です。 .sp TODO .sp 他のノーマライザーを使いたい場合は、 \fBregister\fP コマンドでノーマライザープラグインを登録する必要があります。例えば、 \fI\%groonga\-normalizer\-mysql\fP を登録することでMySQL互換の正規化方法を使うことができます。 .SS \fBstring\fP .sp 正規化したい文字列を指定します。 .sp \fBstring\fP の中に文字列を含める場合は、シングルクォート( \fB\(aq\fP )またはダブルクォート( \fB"\fP )で \fBstring\fP をクォートする必要があります。 .sp \fBstring\fP の中で空白を使う例です。 .sp TODO .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBflags\fP .sp ノーマライズ処理をカスタマイズするオプションを指定します。「 \fB|\fP 」で区切って複数のオプションを指定することができます。例えば、 \fBREMOVE_BLANK|WITH_TYPES\fP というように指定できます。 .sp 指定可能なフラグは以下の通りです。 .TS center; |l|l|. _ T{ フラグ T} T{ 説明 T} _ T{ \fBNONE\fP T} T{ 無視されます。 T} _ T{ \fBREMOVE_BLANK\fP T} T{ TODO T} _ T{ \fBWITH_TYPES\fP T} T{ TODO T} _ T{ \fBWITH_CHECKS\fP T} T{ TODO T} _ T{ \fBREMOVE_TOKENIZED_DELIMITER\fP T} T{ TODO T} _ .TE .sp 以下は \fBREMOVE_BLANK\fP を使った例です。 .sp TODO .sp 以下は \fBWITH_TYPES\fP を使った例です。 .sp TODO .sp 以下は \fBREMOVE_TOKENIZED_DELIMITER\fP を使った例です。 .sp TODO .SS 戻り値 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, normalized_text] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBnormalized_text\fP .INDENT 0.0 .INDENT 3.5 \fBnormalized_text\fP はオブジェクトです。このオブジェクトは以下の属性を持っています。 .TS center; |l|l|. _ T{ 名前 T} T{ 説明 T} _ T{ \fBnormalized\fP T} T{ 正規化されたテキスト。 T} _ T{ \fBtypes\fP T} T{ 正規化されたテキストのtype(文字種別)の配列です。N番目の \fBtypes\fP は正規化されたテキストのN番目の文字のtype(文字種別)を示しています。 T} _ .TE .UNINDENT .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/normalizers\fP .UNINDENT .SS \fBnormalizer_list\fP .SS 概要 .sp \fBnormalizer_list\fP コマンドはデータベースに登録されているノーマライザーの一覧を返します。 .SS 構文 .sp このコマンドに引数はありません: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C normalizer_list .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C normalizer_list # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "name": "NormalizerAuto" # }, # { # "name": "NormalizerNFKC51" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp データベースに登録されているノーマライザーの一覧を返します。 .SS 戻り値 .sp \fBnormalizer_list\fP コマンドはノーマライザーの一覧を返します。各ノーマライザーは属性を持っています。例えば名前です。将来、属性は増えるかもしれません。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, normalizers] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBnormalizers\fP .INDENT 0.0 .INDENT 3.5 \fBnormalizers\fP はノーマライザーの配列です。ノーマライザーは次の属性を持つオブジェクトです。 .TS center; |l|l|. _ T{ 名前 T} T{ 説明 T} _ T{ \fBname\fP T} T{ ノーマライザー名。 T} _ .TE .UNINDENT .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/normalizers\fP .IP \(bu 2 \fB/reference/commands/normalize\fP .UNINDENT .SS \fBobject_exist\fP .SS 概要 .sp バージョン 5.0.6 で追加. .sp \fBobject_exist\fP は指定した名前のオブジェクトがデータベースに存在するかどうかを返します。 .sp これは軽い操作です。データベース内に名前が存在するかだけをチェックします。ディスクから該当オブジェクトをロードしません。 .sp \fBobject_exist\fP はオブジェクトの種類をチェックしません。存在しているオブジェクトはテーブルかもしれませんし、カラムや関数かもしれません。 .SS 構文 .sp このコマンドの引数は1つで必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C object_exist name .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp データベース内で指定した名前がすでに使われているかをチェックできます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C object_exist Users # [[0, 1337566253.89858, 0.000355720520019531], false] table_create Users TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] object_exist Users # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fBobject_exist Users\fP は \fBUsers\fP テーブルを作る前は \fBfalse\fP を返します。 .sp \fBobject_exist Users\fP は \fBUsers\fP テーブルを作った後は \fBtrue\fP を返します。 .SS 引数 .sp このセクションではすべての引数について説明します。 .SS 必須引数 .sp 1つだけ必須の引数があります。 .SS \fBname\fP .sp チェック対象のオブジェクト名を指定してください。 .sp カラムが存在するかどうかをチェックしたいときは、次のように \fBテーブル名.カラム名\fP という書式を使ってください。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Logs TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] object_exist Logs.timestamp # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fBLogs.timestamp\fP 内の \fBLogs\fP がテーブル名で \fBtimestamp\fP がカラム名です。 .SS 戻り値 .sp データベース内に指定した名前のオブジェクトが存在するときは、このコマンドは以下のようにボディとして \fBtrue\fP を返します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, true] .ft P .fi .UNINDENT .UNINDENT .sp そうでない場合は \fBfalse\fP を返します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, false] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS \fBplugin_register\fP .sp バージョン 5.0.1 で追加. .SS 概要 .sp \fBplugin_register\fP コマンドはプラグインを登録します。プラグインを使う前にプラグインを登録する必要があります。 .sp 同じデータベースに対しては1つのプラグインについて一度だけ \fBplugin_register\fP コマンドを実行すれば十分です。これは、登録されたプラグイン情報はデータベースに記録されているからです。 \fBgroonga\fP プロセスを再起動したときは、 \fBregister\fP コマンドを実行しなくてもすでに登録されているプラグインを読み込みます。 .sp \fBplugin_unregister\fP でプラグインの登録を解除することができます。 .SS 構文 .sp このコマンドの引数は1つで必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_register name .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp これは \fB${PREFIX}/lib/groonga/plugins/query_expanders/tsv.so\fP に含まれている \fBQueryExpanderTSV\fP クエリー展開オブジェクトを登録する例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_register query_expanders/tsv # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fB${PREFIX}/lib/groonga/plugins/\fP と拡張子( \fB\&.so\fP )は省略可能です。これらは自動で補完されます。 .sp \fBplugin_register /usr/lib/groonga/plugins/query_expanders/tsv.so\fP というように絶対パスを指定することもできます。 .SS 戻り値 .sp \fBplugin_register\fP が成功したときは以下のようにボディは \fBtrue\fP になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, true] .ft P .fi .UNINDENT .UNINDENT .sp \fBplugin_register\fP が失敗すると、エラーの詳細は \fBHEADER\fP に含まれます。 .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fBplugin_unregister\fP .UNINDENT .SS \fBplugin_unregister\fP .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.1 で追加. .SS 概要 .sp \fBplugin_unregister\fP コマンドはプラグインの登録を解除します。 .SS 構文 .sp このコマンドの引数は1つで必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_unregister name .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp これは \fB${PREFIX}/lib/groonga/plugins/query_expanders/tsv.so\fP に含まれている \fBQueryExpanderTSV\fP クエリー展開オブジェクトの登録を解除する例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_unregister query_expanders/tsv # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fB${PREFIX}/lib/groonga/plugins/\fP と拡張子( \fB\&.so\fP )は省略可能です。これらは自動で補完されます。 .sp \fBplugin_unregister /usr/lib/groonga/plugins/query_expanders/tsv.so\fP というように絶対パスを指定することもできます。 .SS 戻り値 .sp \fBplugin_unregister\fP が成功したときは以下のようにボディは \fBtrue\fP になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, true] .ft P .fi .UNINDENT .UNINDENT .sp \fBplugin_unregister\fP が失敗すると、エラーの詳細は \fBHEADER\fP に含まれます。 .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fBplugin_register\fP .UNINDENT .SS \fBquit\fP .SS 概要 .sp quit \- セッション終了 .sp Groonga組込コマンドの一つであるquitについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp quitは、groongaプロセスとのセッションを終了します。クライアントプロセスならばgroongaプロセスとの接続を切ります。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C quit .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C quit .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp ありません。 .SS 戻り値 .sp ありません。 .SS \fBrange_filter\fP .SS 概要 .sp TODO: write me .SS 構文 .SS 使い方 .SS 戻り値 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/commands/select\fP .UNINDENT .SS \fBregister\fP .sp バージョン 5.0.1 で撤廃: Use \fBplugin_register\fP instead. .SS 概要 .sp \fBregister\fP コマンドはプラグインを登録します。プラグインを使う前にプラグインを登録する必要があります。 .sp 同じデータベースに対しては1つのプラグインについて一度だけ \fIregister\(ga\fP コマンドを実行すれば十分です。これは、登録されたプラグイン情報はデータベースに記録されているからです。 \fBgroonga\fP プロセスを再起動したときは、 \fBregister\fP コマンドを実行しなくてもすでに登録されているプラグインを読み込みます。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 Registered plugins can be removed since Groonga 5.0.1. Use \fBplugin_unregister\fP in such a case. .UNINDENT .UNINDENT .SS 構文 .sp このコマンドの引数は1つで必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C register path .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp これは \fB${PREFIX}/lib/groonga/plugins/query_expanders/tsv.so\fP に含まれている \fBQueryExpanderTSV\fP クエリー展開オブジェクトを登録する例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C register query_expanders/tsv # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fB${PREFIX}/lib/groonga/plugins/\fP と拡張子( \fB\&.so\fP )は省略可能です。これらは自動で補完されます。 .sp \fBregister /usr/lib/groonga/plugins/query_expanders/tsv.so\fP というように絶対パスを指定することもできます。 .SS 戻り値 .sp \fBregister\fP が成功したときは以下のようにボディは \fBtrue\fP になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, true] .ft P .fi .UNINDENT .UNINDENT .sp \fBregister\fP が失敗すると、エラーの詳細は \fBHEADER\fP に含まれます。 .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fBplugin_register\fP .IP \(bu 2 \fBplugin_unregister\fP .UNINDENT .SS \fBrequest_cancel\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 4.0.9 で追加. .sp \fBrequest_cancel\fP コマンドは実行中のリクエストをキャンセルします。 .sp いくつか制限があります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 リクエストIDはユーザーが管理する必要があります。(各リクエストに一意のキーを割り当てる必要があります。) .IP \(bu 2 キャンセルリクエストは無視されることもあります。(同じリクエストIDに対して何度も \fBrequest_cancel\fP コマンドを送信することができます。) .IP \(bu 2 マルチスレッド型のGroongaサーバーのみサポートしています。( \fB/reference/executables/groonga\fP ベースのサーバーでは使えますが、 \fB/reference/executables/groonga\-httpd\fP では使えません。) .UNINDENT .UNINDENT .UNINDENT .sp リクエストIDについては \fB/reference/command/request_id\fP を参照してください。 .sp リクエストがキャンセルされたら、キャンセルされたリクエストの \fB/reference/command/return_code\fP は \fB\-5\fP ( \fBGRN_INTERRUPTED_FUNCTION_CALL\fP )になります。 .SS 構文 .sp このコマンドの引数は1つで必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C request_cancel id .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 以下は \fBrequest_cancel\fP コマンドの使用例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ curl \(aqhttp://localhost:10041/d/select?table=LargeTable&filter=true&request_id=unique\-id\-1\(aq & # The above "select" takes a long time... # Point: "request_id=unique\-id\-1" $ curl \(aqhttp://localhost:10041/d/request_cancel?id=unique\-id\-1\(aq [[...], {"id": "unique\-id\-1", "canceled": true}] # Point: "id=unique\-id\-1" .ft P .fi .UNINDENT .UNINDENT .sp 最初の \fBselect\fP コマンドが長時間かかると仮定します。 \fBrequest_id=unique\-id\-1\fP パラメーターを指定することで \fBunique\-id\-1\fP というリクエストIDをこの \fBselect\fP コマンドに割り当てます。 .sp 2つめの \fBrequest_cancel\fP コマンドで \fBid=unique\-id\-1\fP パラメーターを指定しています。 \fBunique\-id\-1\fP は \fBselect\fP コマンドに渡したリクエストIDと同じリクエストIDです。 .sp この \fBselect\fP コマンドはすぐにはキャンセルされないかもしれません。また、このキャンセルリクエストは無視されることもあります。 .sp 同じリクエストIDに対するキャンセルリクエストを複数回送ることができます。もし、対象のリクエストがキャンセルされたか終了した場合は戻り値の中の \fB"canceled"\fP の値が \fBtrue\fP から \fBfalse\fP に変わります。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ curl \(aqhttp://localhost:10041/d/request_cancel?id=unique\-id\-1\(aq [[...], {"id": "unique\-id\-1", "canceled": true}] # "select" is still running... ("canceled" is "true") $ curl \(aqhttp://localhost:10041/d/request_cancel?id=unique\-id\-1\(aq [[...], {"id": "unique\-id\-1", "canceled": true}] # "select" is still running... ("canceled" is "true") $ curl \(aqhttp://localhost:10041/d/request_cancel?id=unique\-id\-1\(aq [[...], {"id": "unique\-id\-1", "canceled": false}] # "select" is canceled or finished. ("canceled" is "false") .ft P .fi .UNINDENT .UNINDENT .sp もし、この \fBselect\fP コマンドがキャンセルされたら、 \fBselect\fP コマンドの \fB/reference/command/return_code\fP は \fB\-5\fP ( \fBGRN_INTERRUPTED_FUNCTION_CALL\fP )になります。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ curl \(aqhttp://localhost:10041/d/select?table=LargeTable&filter=true&request_id=unique\-id\-1\(aq & [[\-5, ...], ...] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションでは \fBrequest_cancel\fP の引数について説明します。 .SS 必須引数 .sp \fBid\fP だけが必須の引数です。 .SS \fBid\fP .sp 対象リクエストのIDを指定します。 .SS 戻り値 .sp \fBrequest_cancel\fP コマンドはキャンセルリクエストの結果を返します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, { "id": ID, "canceled": CANCEL_REQUEST_IS_ACCEPTED_OR_NOT } ] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBID\fP .INDENT 0.0 .INDENT 3.5 対象のリクエストのIDです。 .UNINDENT .UNINDENT .sp \fBCANCEL_REQUEST_IS_ACCEPTED_OR_NOT\fP .INDENT 0.0 .INDENT 3.5 もし、このキャンセルリクエストが受け付けられたら \fBtrue\fP 、そうでなければ \fBfalse\fP になります。 .sp 「キャンセルリクエストが受け付けられた」というのは「対象リクエストがキャンセルされた」という意味ではないことに注意してください。これは「キャンセルリクエストは対象リクエストに通知したが、対象リクエストはそのキャンセルリクエストを無視するかもしれない」という意味です。 .sp 指定したリクエストIDが割り当てられているリクエストが存在しなければ \fBfalse\fP になります。 .UNINDENT .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/command/request_id\fP .UNINDENT .SS \fBruby_eval\fP .SS 概要 .sp \fBruby_eval\fP コマンドはRubyスクリプトを評価して評価結果を返します。 .SS 構文 .sp このコマンドの引数は1つで必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C ruby_eval script .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp \fBruby_eval\fP を使うと、mrubyがサポートしているスクリプトを実行できます。 .sp Rubyスクリプトとして \fB1 + 2\fP という計算するだけの例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C register ruby/eval # [[0, 1337566253.89858, 0.000355720520019531], true] ruby_eval "1 + 2" # [[0, 1337566253.89858, 0.000355720520019531], {"value": 3}] .ft P .fi .UNINDENT .UNINDENT .sp \fBruby_eval\fP コマンドを使うには事前に \fBruby/eval\fP プラグインを登録します。 .sp \fBruby_eval\fP コマンドは実験的なプラグインです。このコマンドは将来的に変更されるかもしれません。 .SS 引数 .sp このセクションではすべての引数について説明します。 .SS \fBscript\fP .sp 評価したいrubyスクリプトを指定します。 .SS 戻り値 .sp \fBruby_eval\fP は例外情報などのメタデータつきで評価結果を返します(メタデータはまだ実装されていないので今のところ含まれません): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, {"value": EVALUATED_VALUE}] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBEVALUATED_VALUE\fP .INDENT 0.0 .INDENT 3.5 \fBEVALUATED_VALUE\fP は \fBruby_script\fP を評価した値です。 .sp 今のところ、 \fBruby_eval\fP は評価された値として数値だけサポートしています。サポートしている型は今後増えていく予定です。 .UNINDENT .UNINDENT .SS 参考 .SS \fBruby_load\fP .SS 概要 .sp \fBruby_load\fP コマンドは指定したRubyスクリプトを読み込みます。 .SS 構文 .sp このコマンドの引数は1つで必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C ruby_load path .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp \fBruby_load\fP を使ってmrubyがサポートしているスクリプトを読み込むことができます。 .sp Rubyスクリプトとして \fBexpression.rb\fP を単に読み込む例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C register ruby/load # [[0, 1337566253.89858, 0.000355720520019531], true] ruby_load "expression.rb" # [[0, 1337566253.89858, 0.000355720520019531], {"value": null}] .ft P .fi .UNINDENT .UNINDENT .sp \fBruby_load\fP コマンドを使うには事前に \fBruby/load\fP プラグインを登録します。 .sp \fBruby_load\fP コマンドは実験的なプラグインです。このコマンドは将来的に変更されるかもしれません。 .SS 引数 .sp このセクションではすべての引数について説明します。 .SS \fBpath\fP .sp 読み込みたいrubyスクリプトを指定します。 .SS 戻り値 .sp \fBruby_load\fP は例外情報などのメタデータつきで読み込んだ結果を返します(メタデータはまだ実装されていないので今のところ含まれません): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, {"value": LOADED_VALUE}] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBLOADED_VALUE\fP .INDENT 0.0 .INDENT 3.5 \fBLOADED_VALUE\fP はrubyスクリプトを読み込んだ結果です。 .sp \fBruby_load\fP は \fBLOADED_VALUE\fP としていまのところは単に \fBnull\fP を返します。将来的には \fBLOADED_VALUE\fP がサポートされる予定です。 .UNINDENT .UNINDENT .SS 参考 .sp \fB/reference/commands/ruby_eval\fP .SS \fBselect\fP .SS 概要 .sp \fBselect\fP はテーブルから指定された条件にマッチするレコードを検索し、見つかったレコードを出力します。 .sp \fBselect\fP は最も重要なgroongaのコマンドです。Groongaの力を最大限に活かすためには \fBselect\fP を理解する必要があります。 .SS 構文 .sp このコマンドにはたくさんの引数があります。 .sp 必須の引数は \fBtable\fP だけです。残りは省略できます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select table [match_columns=null] [query=null] [filter=null] [scorer=null] [sortby=null] [output_columns="_id, _key, *"] [offset=0] [limit=10] [drilldown=null] [drilldown_sortby=null] [drilldown_output_columns="_key, _nsubrecs"] [drilldown_offset=0] [drilldown_limit=10] [cache=yes] [match_escalation_threshold=0] [query_expansion=null] [query_flags=ALLOW_PRAGMA|ALLOW_COLUMN|ALLOW_UPDATE|ALLOW_LEADING_NOT|NONE] [query_expander=null] [adjuster=null] [drilldown_calc_types=NONE] [drilldown_calc_target=null] .ft P .fi .UNINDENT .UNINDENT .sp \fBselect\fP には高度なドリルダウン機能のために以下の名前付き引数があります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBdrilldown[${LABEL}].keys=null\fP .IP \(bu 2 \fBdrilldown[${LABEL}].sortby=null\fP .IP \(bu 2 \fBdrilldown[${LABEL}].output_columns="_key, _nsubrecs"\fP .IP \(bu 2 \fBdrilldown[${LABEL}].offset=0\fP .IP \(bu 2 \fBdrilldown[${LABEL}].limit=10\fP .IP \(bu 2 \fBdrilldown[${LABEL}].calc_types=NONE\fP .IP \(bu 2 \fBdrilldown[${LABEL}].calc_target=null\fP .UNINDENT .UNINDENT .UNINDENT .sp \fB${LABEL}\fP には1つ以上のアルファベット、数字、 \fB_\fP 、 \fB\&.\fP を使うことができます。たとえば、 \fBparent.sub1\fP は有効な \fB${LABEL}\fP です。 .sp 同じ \fB${LABEL}\fP も持つ引数は同じグループになります。 .sp たとえば、以下の引数は1つのドリルダウンを指定しています。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-drilldown[label].keys column\fP .IP \(bu 2 \fB\-\-drilldown[label].sortby \-_nsubrecs\fP .UNINDENT .UNINDENT .UNINDENT .sp 以下の引数は2つのドリルダウンを指定しています。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-drilldown[label1].keys column1\fP .IP \(bu 2 \fB\-\-drilldown[label1].sortby \-_nsubrecs\fP .IP \(bu 2 \fB\-\-drilldown[label2].keys column2\fP .IP \(bu 2 \fB\-\-drilldown[label2].sortby _key\fP .UNINDENT .UNINDENT .UNINDENT .SS 使い方 .sp 例を使いながら \fBselect\fP の使い方を学びましょう。このセクションではよく使われる使い方を紹介します。 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entries TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries n_likes COLUMN_SCALAR UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries tag COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_key_index COLUMN_INDEX|WITH_POSITION Entries _key # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_content_index COLUMN_INDEX|WITH_POSITION Entries content # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Entries [ {"_key": "The first post!", "content": "Welcome! This is my first post!", "n_likes": 5, "tag": "Hello"}, {"_key": "Groonga", "content": "I started to use Groonga. It\(aqs very fast!", "n_likes": 10, "tag": "Groonga"}, {"_key": "Mroonga", "content": "I also started to use Mroonga. It\(aqs also very fast! Really fast!", "n_likes": 15, "tag": "Groonga"}, {"_key": "Good\-bye Senna", "content": "I migrated all Senna system!", "n_likes": 3, "tag": "Senna"}, {"_key": "Good\-bye Tritonn", "content": "I also migrated all Tritonn system!", "n_likes": 3, "tag": "Senna"} ] # [[0, 1337566253.89858, 0.000355720520019531], 5] .ft P .fi .UNINDENT .UNINDENT .sp ブログエントリ用の \fBEntries\fP テーブルがあります。各エントリはタイトルと内容と「いいね!」数、タグを持っています。タイトルは \fBEntries\fP のキーとします。内容は \fBEntries.content\fP カラムの値とします。「いいね!」数は \fBEntries.n_likes\fP カラムの値とします。タグは \fBEntries.tag\fP カラムの値とします。 .sp \fBEntries._key\fP カラムと \fBEntries.content\fP カラムには \fBTokenBigram\fP トークナイザーを使ったインデックスを作成します。そのため、 \fBEntries._key\fP と \fBEntries.content\fP は両方とも全文検索できます。 .sp これで例を示すためのスキーマとデータの準備ができました。 .SS 簡単な使い方 .sp 上記のスキーマとデータを使った一番簡単な使い方は以下の通りです。これは \fBEntries\fP テーブルのすべてのレコードを出力します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3, # "Senna" # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp どうしてこのコマンドがすべてのレコードを出力するのでしょうか?理由は2つです。1つ目の理由はこのコマンドが検索条件を何も指定していないからです。検索条件を指定しないとすべてのレコードがマッチします。2つ目の理由は全レコード数が5だからです。 \fBselect\fP コマンドはデフォルトでは最大10レコードを出力します。この例では5レコードしかありません。これは10よりも少ないのですべてのレコードを出力します。 .SS 検索条件 .sp 検索条件は \fBquery\fP または \fBfilter\fP で指定します。 \fBquery\fP と \fBfilter\fP を両方指定することもできます。この場合は \fBquery\fP と \fBfilter\fP の両方の条件にマッチしたレコードが出力されます。 .SS 検索条件: \fBquery\fP .sp \fBquery\fP はWebページの検索ボックス用に用意されています。例えば、google.co.jpにあるような検索ボックスです。 \fBquery\fP の検索条件はスペース区切りでキーワードを指定します。例えば、 \fB検索 エンジン\fP は \fB検索\fP と \fBエンジン\fP という2つのキーワードを含むレコードを検索します。 .sp 通常は \fBquery\fP 引数は全文検索条件を指定するために使います。全文検索条件以外も指定できますが、その用途には \fBfilter\fP 引数の方が向いています。 .sp \fBquery\fP 引数で全文検索条件を指定する場合は、 \fBmatch_columns\fP 引数と一緒に使います。 \fBmatch_columns\fP はどのカラムまたはインデックスを使って \fBquery\fP を検索するかを指定します。 .sp 以下は簡単な \fBquery\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-match_columns content \-\-query fast # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fBEntries\fP テーブルの中から \fBcontent\fP カラムの値に \fBfast\fP を含んでいるレコードを検索します。 .sp \fBquery\fP はクエリー構文という構文を使いますが、詳細はここでは説明しません。詳細は \fB/reference/grn_expr/query_syntax\fP を参照してください。 .SS 検索条件: \fBfilter\fP .sp \fBfilter\fP は複雑な検索条件を指定するために用意されています。ECMAScriptのような構文で \fBfilter\fP に検索条件を指定します。 .sp 以下は簡単な \fBfilter\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqcontent @ "fast" && _key == "Groonga"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fBEntries\fP テーブルの中の \fBcontent\fP カラムの値に \fBfast\fP という単語を含んでいて、かつ、 \fB_key\fP が \fBGroonga\fP のレコードを検索します。このコマンドの中には \fB@\fP と \fB&&\fP と \fB==\fP という3つの演算子があります。 \fB@\fP は全文検索用の演算子です。 \fB&&\fP と \fB==\fP はECMAScriptと同じ意味です。 \fB&&\fP が論理積用の演算子で \fB==\fP が等価演算子です。 .sp \fBfilter\fP にはもっと演算子や構文があります。例えば、 \fB(...)\fP を使った検索条件のグループ化などです。しかし、ここでは詳細は説明しません。詳細は \fB/reference/grn_expr/script_syntax\fP を参照してください。 .SS ページング .sp \fBoffset\fP と \fBlimit\fP を指定することで出力されるレコードの範囲を指定できます。以下は2番目のレコードだけを出力する例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-offset 1 \-\-limit 1 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBoffset\fP は0始まりです。 \fB\-\-offset 1\fP は2番目以降のレコードを出力するという意味になります。 .sp \fBlimit\fP は出力レコード数の最大値を指定します。 \fB\-\-limit 1\fP は多くても1レコードを出力するという意味になります。もし、1つもレコードがマッチしていなければ \fBselect\fP コマンドはどのレコードも出力しません。 .SS 全レコード数 .sp \fB\-\-limit 0\fP を使うとレコードの内容は取得せずに全レコード数だけを取得できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-limit 0 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-limit 0\fP はマッチしたレコード数だけを取得したいときにも便利です。 .SS ドリルダウン .sp 1回の \fBselect\fP で検索結果だけでなく、検索結果をグループ化した結果も一緒に取得できます。SQLでは2回以上 \fBSELECT\fP を使わなければいけない場合でも、Groongaの場合は1回の \fBselect\fP で実現できます。 .sp Groongaではこの機能を \fI\%ドリルダウン\fP と呼んでいます。他の検索エンジンでは \fI\%ファセット検索\fP とも呼ばれています。 .sp 例えば、以下の状況を考えてみましょう。 .sp \fBfast\fP という単語を含むエントリーを探します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqcontent @ "fast"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-filter \(aqcontent @ "fast" && tag == "???"\fP というように、追加の検索条件として \fBtag\fP を使いたいとします。しかし、 \fBcontent @ "fast"\fP の結果を見るまでは適切なタグはわかりません。 .sp もし、有効なタグそれぞれについてマッチするレコード数がわかれば、その中から適切なタグを選ぶことができます。このような用途のためにドリルダウンを使えます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqcontent @ "fast"\(aq \-\-drilldown tag # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ] # ], # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Groonga", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-drilldown tag\fP は「有効なタグ」と「そのタグを持っているレコード数」のペアをリストにして返します。このリストからタグを選ぶと「検索したけどヒット数0」という状況を避けることができます。また、リストの中からレコード数が少ないタグを選べば「検索結果が多すぎる」という状況も避けることができます。 .sp ドリルダウン結果を使うと次のようなUIを作ることができます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 検索結果を絞り込むリンク。(ユーザーはキーボードから検索クエリーを入力する必要がなくなります。単にリンクをクリックすればよいからです。) .UNINDENT .UNINDENT .UNINDENT .sp 多くのECサイトではこのUIを使っています。Amazonのサイドメニューを見てください。 .sp Groongaはグループ化したレコードの数を数えるだけでなく、グループ化したレコードのカラムの値の中から最大値・最小値を見つけたり、合計値を計算したりすることができます。詳細は \fI\%ドリルダウン関連の引数\fP を参照してください。 .SS 引数 .sp このセクションではすべての引数について説明します。引数はカテゴリわけしています。 .SS 必須引数 .sp \fBtable\fP だけが必須の引数です。 .SS \fBtable\fP .sp 検索対象のテーブルを指定します。 \fBtable\fP は必ず指定しなければいけません。 .sp 存在しないテーブルを指定するとエラーが返ります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Nonexistent # [ # [ # \-22, # 1337566253.89858, # 0.000355720520019531, # "invalid table name: ", # [ # [ # "grn_select", # "proc.c", # 1217 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 検索関係の引数 .sp 検索関係の引数がいくつかあります。一般的には、検索ボックスを実装するために \fBmatch_columns\fP と \fBquery\fP 引数を使い、複雑な検索機能を実装するために \fBfilter\fP 引数を使います。 .sp \fBquery\fP と \fBfilter\fP を指定した場合は、 \fBquery\fP と \fBfilter\fP にマッチしたレコードが選択されます。 \fBquery\fP と \fBfilter\fP のどちらも指定しなかった場合はすべてのレコードが選択されます。 .SS \fBmatch_columns\fP .sp \fBquery\fP 引数の値で全文検索をするときに使うデフォルトの検索対象カラムを指定します。全文検索対象のカラムは \fBquery\fP 引数でも指定できます。検索対象カラムを \fBmatch_columns\fP で指定する場合と \fBquery\fP で指定する場合の違いは重みとスコアー関数を指定できるかどうかです。 \fBmatch_columns\fP では指定できますが、 \fBquery\fP では指定できません。 .sp 重みは検索対象カラムの相対的な重要度です。重みの大きい検索対象カラムでマッチした場合は小さい検索対象カラムでマッチした場合よりも多くのヒットスコアがつきます。デフォルトの重みは1です。 .sp 以下は簡単な \fBmatch_columns\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-match_columns content \-\-query fast \-\-output_columns \(aq_key, _score\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Groonga", # 1 # ], # [ # "Mroonga", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-match_columns content\fP はデフォルトの全文検索対象カラムに \fBcontent\fP カラムを使用し、その重みは1、という意味になります。 \fB\-\-output_columns \(aq_key, _score\(aq\fP はこの \fBselect\fP コマンドがマッチしたレコードの \fB_key\fP の値と \fB_score\fP の値を出力する、ということを指定しています。 .sp \fB_score\fP の値に注目してください。 \fB_score\fP の値は \fBquery\fP 引数の値に何個マッチしたかになっています。この例では、 \fBquery\fP 引数の値は \fBfast\fP です。 \fB_score\fP の値が1ということは \fBcontent\fP カラムの中に \fBfast\fP が1つだけあるということです。 \fB_score\fP の値が2ということは \fBcontent\fP カラムの中に \fBfast\fP が2つあるということです。 .sp 重みを指定するためには \fBcolumn * weight\fP という構文を使います。以下は重みの使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-match_columns \(aqcontent * 2\(aq \-\-query fast \-\-output_columns \(aq_key, _score\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Groonga", # 2 # ], # [ # "Mroonga", # 4 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-match_columns \(aqcontent * 2\(aq\fP はデフォルトの全文検索用カラムとして \fBcontent\fP カラムを使い、その重みは2という意味です。 .sp \fB_score\fP の値に注目してください。 \fB_score\fP の値が2倍になっています。これは重みを2にしたからです。 .sp デフォルトの全文検索対象カラムとして複数のカラムを指定することができます。複数のカラムを指定した場合はすべてのカラムに対して全文検索が行われ、ヒットスコアが積算されます。つまり、 \fBquery\fP 引数の値がどれか1つでも全文検索対象カラムにマッチしたら、そのレコードはマッチしたものとして扱われます。 .sp 複数のカラムを指定するには \fBcolumn1 * weight1 || column2 * weight2 || ...\fP という構文を使います。 \fB* weight\fP は省略することができます。省略した場合は重みが1になります。以下は複数カラムの使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-match_columns \(aq_key * 10 || content\(aq \-\-query groonga \-\-output_columns \(aq_key, _score\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Groonga", # 11 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-match_columns \(aq_key * 10 || content\(aq\fP はデフォルト検索対象カラムが \fB_key\fP カラムと \fBcontent\fP カラムで、 \fB_key\fP カラムの重みは10、 \fBcontent\fP カラムの重みは1という意味です。この重み付けは \fB_key\fP カラムの値は \fBcontent\fP カラムの値よりも重要だという意味になります。この例では、ブログエントリのタイトルはブログエントリの内容よりも重要だということです。 .sp スコアー関数を指定することもできます。詳細は \fB/reference/scorer\fP を参照してください。 .sp スコアー関数と \fI\%scorer\fP パラメーターは関係ないので注意してください。 .SS \fBquery\fP .sp クエリーテキストを指定します。通常、全文検索をするために \fBmatch_columns\fP 引数と一緒に使います。 \fBquery\fP 引数はWebページにある全文検索フォームで使いやすいように設計されています。クエリーテキストは \fB/reference/grn_expr/query_syntax\fP という書式を使います。この書式はGoogleの検索フォームのように一般的な検索フォームと似ています。例えば、 \fBword1 word2\fP は \fBword1\fP と \fBword2\fP を含んでいるレコードを検索するという意味になります。 \fBword1 OR word2\fP は \fBword1\fP または \fBword2\fP を含んでいるレコードを検索するという意味になります。 .sp 以下は論理積を使った検索の簡単な例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-match_columns content \-\-query "fast groonga" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fBEntries\fP テーブルの中から \fBcontent\fP カラムの値に \fBfast\fP と \fBgroonga\fP の2つの単語を含んでいるレコードを検索します。 .sp 以下は論理和を使った検索の簡単な例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-match_columns content \-\-query "groonga OR mroonga" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fBEntries\fP テーブルの中から \fBcontent\fP カラムの値に \fBfast\fP または \fBgroonga\fP のどちらかの単語を含んでいるレコードを検索します。 .sp 他の構文は \fB/reference/grn_expr/query_syntax\fP を参照してください。 .sp \fBquery\fP では全文検索だけではなく他の条件も使えます。例えば、 \fBcolumn:value\fP は \fBcolumn\fP の値が \fBvalue\fP と等しいという意味です。 \fBcolumn:=10"]} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] select Entries \-\-match_columns content \-\-query "popular" \-\-query_expander Thesaurus.synonym # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBload\fP コマンドは新しく \fB"popular"\fP という類義語を登録しています。これは \fB((popular) OR (n_likes:>=10))\fP に置換されます。置換されたクエリーは、「popular」というのは「popular」という単語を含んでいるか10以上の「いいね!」数を持つエントリという意味になります。 .sp この \fBselect\fP コマンドは \fBEntries\fP テーブルの中から \fBn_likes\fP カラムの値が \fB10\fP 以上のレコードを出力します。 .SS 出力関連の引数 .SS \fBoutput_columns\fP .sp 出力するカラムを \fB,\fP 区切りで指定します。 .sp 以下は簡単な \fBoutput_columns\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns \(aq_id, _key\(aq \-\-limit 1 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ] # ], # [ # 1, # "The first post!" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fB_id\fP と \fB_key\fP カラムの値だけを出力します。 .sp \fB*\fP は特別な値で \fB/reference/columns/pseudo\fP 以外のすべてのカラムという意味です。 .sp 以下は \fB*\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns \(aq_key, *\(aq \-\-limit 1 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # "The first post!", # "Welcome! This is my first post!", # 5, # "Hello" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fB_key\fP 擬似カラム、 \fBcontent\fP カラム、 \fBn_likes\fP カラムの値を出力しますが、 \fB_id\fP 擬似カラムの値は出力しません。 .sp デフォルト値は \fB_id, _key, *\fP です。これは \fB_score\fP 以外の全てのカラムを出力するという意味です。 .SS \fBsortby\fP .sp ソートキーを \fB,\fP 区切りで指定します。それぞれのソートキーはカラム名を指定します。 .sp 以下は簡単な \fBsortby\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-sortby \(aqn_likes, _id\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3, # "Senna" # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3, # "Senna" # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fBn_likes\fP カラムの値で昇順にソートします。 \fBn_likes\fP の値が同じレコードについては \fB_id\fP カラムの値で昇順にソートします。 \fB"Good\-bye Senna"\fP と \fB"Good\-bye Tritonn"\fP が \fB_id\fP カラムの値でソートしているケースです。 .sp 降順でソートしたい場合はカラム名の前に \fB\-\fP をつけてください。 .sp 以下は降順の \fBsortby\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-sortby \(aq\-n_likes, _id\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5, # "Hello" # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3, # "Senna" # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fBn_likes\fP カラムの値で降順にソートします。しかし、 \fB_id\fP でソートするときは昇順でソートします。 .sp もし、 \fBquery\fP または \fBfilter\fP 引数を使っているときは、 \fBsortby\fP の中で \fB_score\fP 擬似カラムを使うことができます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-match_columns content \-\-query fast \-\-sortby \-_score \-\-output_columns \(aq_key, _score\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Mroonga", # 2 # ], # [ # "Groonga", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドはマッチしたレコードをヒットスコアで降順にソートし、レコードのキーとヒットスコアを出力します。 .sp \fBquery\fP 引数も \fBfilter\fP 引数も指定しないで \fB_score\fP を使った場合は、 \fB_score\fP を無視して、ログファイルに警告を出力します。 .SS \fBoffset\fP .sp 出力するレコードの範囲を決めるためのオフセットを指定します。オフセットは0始まりです。 \fB\-\-offset 1\fP は2番目以降のレコードを出力するという意味になります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-sortby _id \-\-offset 3 \-\-output_columns _key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ] # ], # [ # "Good\-bye Senna" # ], # [ # "Good\-bye Tritonn" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは4番目以降のレコードを出力します。 .sp 負の値を指定することもできます。負の値の場合は \fBマッチしたレコード数 + offset\fP 番目のレコードから始まる範囲という意味になります。もし、マッチしたレコードが3つあり、 \fB\-\-offset \-2\fP を指定した場合は2番目( \fB3 + \-2 = 1\fP 。 \fB1\fP は2番目という意味です。オフセットは0始まりということを思い出してください。) のレコードから3番目のレコードを取得します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-sortby _id \-\-offset \-2 \-\-output_columns _key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ] # ], # [ # "Good\-bye Senna" # ], # [ # "Good\-bye Tritonn" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは4番目以降のレコードを出力します。なぜなら、全レコード数が \fB5\fP だからです。 .sp デフォルト値は \fB0\fP です。 .SS \fBlimit\fP .sp \fBlimit\fP は出力レコード数の最大値を指定します。 もし、マッチしたレコード数が \fBlimit\fP よりも小さい場合はすべてのレコードが出力されます。 .sp 以下は簡単な \fBlimit\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-sortby _id \-\-offset 2 \-\-limit 3 \-\-output_columns _key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ] # ], # [ # "Mroonga" # ], # [ # "Good\-bye Senna" # ], # [ # "Good\-bye Tritonn" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは3番目、4番目、5番目のレコードを出力します。 .sp 負の値を指定することもできます。負の値の場合は、最大で \fBマッチしたレコード数 + limit + 1\fP 件のレコードを出力するという意味になります。 例えば、 \fB\-\-limit \-1\fP はすべてのレコードを出力します。これはすべてのレコードを表示する場合にとても便利です。 .sp 以下は負の値を使った \fBlimit\fP の簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-limit \-1 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3, # "Senna" # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドはすべてのレコードを出力します。 .sp デフォルト値は \fB10\fP です。 .SS \fBscorer\fP .sp TODO: write in English and add example. .sp 検索条件にマッチする全てのレコードに対して適用するgrn_exprをscript形式で指定します。 .sp scorerは、検索処理が完了し、ソート処理が実行される前に呼び出されます。従って、各レコードのスコアを操作する式を指定しておけば、検索結果のソート順序をカスタマイズできるようになります。 .SS ドリルダウン関連の引数 .sp このセクションでは基本的なドリルダウン関連の引数について説明します。高度なドリルダウン関連の引数は他のセクションで説明します。 .SS \fBdrilldown\fP .sp グループ化するときに使うキーを \fB,\fP 区切りで指定します。 .sp 指定した検索条件にマッチしたレコードを指定したキーのそれぞれでグループ化します。検索条件を指定していない場合はすべてのレコードを指定したキーのそれぞれでグループ化します。 .sp 以下は簡単な \fBdrilldown\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-output_columns _key,tag \e \-\-drilldown tag # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "tag", # "ShortText" # ] # ], # [ # "The first post!", # "Hello" # ], # [ # "Groonga", # "Groonga" # ], # [ # "Mroonga", # "Groonga" # ], # [ # "Good\-bye Senna", # "Senna" # ], # [ # "Good\-bye Tritonn", # "Senna" # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは次の情報を出力します。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 「Hello」タグを持つレコードが1つある。 .IP \(bu 2 「Groonga」タグを持つレコードが2つある。 .IP \(bu 2 「Senna」タグを持つレコードが2つある。 .UNINDENT .UNINDENT .UNINDENT .sp 以下は検索条件付きで \fBdrilldown\fP を使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-output_columns _key,tag \e \-\-filter \(aqn_likes >= 5\(aq \e \-\-drilldown tag # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "tag", # "ShortText" # ] # ], # [ # "The first post!", # "Hello" # ], # [ # "Groonga", # "Groonga" # ], # [ # "Mroonga", # "Groonga" # ] # ], # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Groonga", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは次の情報を出力します。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBn_likes\fP の値が5以上のレコードの中には… .INDENT 2.0 .IP \(bu 2 「Hello」タグを持つレコードが1つある。 .IP \(bu 2 「Groonga」タグを持つレコードが2つある。 .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp 以下は複数のグループ化キーを指定する \fBdrilldown\fP の例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit 0 \e \-\-output_column _id \e \-\-drilldown tag,n_likes # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ] # ], # [ # [ # 4 # ], # [ # [ # "_key", # "UInt32" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # 5, # 1 # ], # [ # 10, # 1 # ], # [ # 15, # 1 # ], # [ # 3, # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは次の情報を出力します。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBtag\fP について: .INDENT 2.0 .IP \(bu 2 「Hello」タグを持つレコードが1つある。 .IP \(bu 2 「Groonga」タグを持つレコードが2つある。 .IP \(bu 2 「Senna」タグを持つレコードが2つある。 .UNINDENT .IP \(bu 2 \fBn_likes\fP について: .INDENT 2.0 .IP \(bu 2 「Hello」タグを持つレコードが1つある。 .IP \(bu 2 「Groonga」タグを持つレコードが2つある。 .IP \(bu 2 「Senna」タグを持つレコードが2つある。 .UNINDENT .UNINDENT .UNINDENT .UNINDENT .SS \fBdrilldown_sortby\fP .sp ドリルダウン結果のソートキーを \fB,\fP 区切りで指定します。それぞれのソートキーはカラム名を指定します。 .sp グループ化されたレコード数は \fB_nsubrecs\fP \fB/reference/columns/pseudo\fP 擬似カラムで参照できます。 .sp 以下は簡単な \fBdrilldown_sortby\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit 0 \e \-\-output_column _id \e \-\-drilldown \(aqtag, n_likes\(aq \e \-\-drilldown_sortby \(aq\-_nsubrecs, _key\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ], # [ # "Hello", # 1 # ] # ], # [ # [ # 4 # ], # [ # [ # "_key", # "UInt32" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # 3, # 2 # ], # [ # 5, # 1 # ], # [ # 10, # 1 # ], # [ # 15, # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp ドリルダウン結果は「グループに含まれるレコード数」(= \fB_nsubrecs\fP )で降順にソートします。「グループに含まれるレコード数」が同じグループが複数あった場合は、グループ化に使ったキー(= \fB_key\fP )で昇順にソートします。 .sp \fBdrilldown\fP で指定したすべてのグループキーで同じソートキーを使います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit 0 \e \-\-output_column _id \e \-\-drilldown \(aqtag, n_likes\(aq \e \-\-drilldown_sortby \(aq\-_nsubrecs, _key\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ], # [ # "Hello", # 1 # ] # ], # [ # [ # 4 # ], # [ # [ # "_key", # "UInt32" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # 3, # 2 # ], # [ # 5, # 1 # ], # [ # 10, # 1 # ], # [ # 15, # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBtag\fP のドリルダウンでも \fBn_likes\fP のドリルダウンでも同じソートキーを使っています。 .sp それぞれのドリルダウンで異なるソートキーを使いたい場合は \fI\%高度なドリルダウン関連のパラメーター\fP を参照してください。 .SS \fBdrilldown_output_columns\fP .sp ドリルダウン結果から出力するカラムを \fB,\fP 区切りで指定します。 .sp 以下は \fBdrilldown_output_columns\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit 0 \e \-\-output_column _id \e \-\-drilldown tag \e \-\-drilldown_output_columns _key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ] # ], # [ # "Hello" # ], # [ # "Groonga" # ], # [ # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドはグループ化したキーを出力していくだけです。 .sp グループ化したキーが参照型のカラム(型がテーブルのカラム)だった場合、参照型のカラムが参照しているテーブルのカラムにもアクセスできます。 .sp 参照型に対してドリルダウンする方法を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Tags TABLE_HASH_KEY ShortText \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Tags label COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Tags priority COLUMN_SCALAR Int32 # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Items TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Items tag COLUMN_SCALAR Tags # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Tags [ {"_key": "groonga", label: "Groonga", priority: 10}, {"_key": "mroonga", label: "Mroonga", priority: 5} ] # [[0, 1337566253.89858, 0.000355720520019531], 2] load \-\-table Items [ {"_key": "A", "tag": "groonga"}, {"_key": "B", "tag": "groonga"}, {"_key": "C", "tag": "mroonga"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] .ft P .fi .UNINDENT .UNINDENT .sp \fBTags\fP テーブルは参照されているテーブルです。 \fBItems.tag\fP は参照型のカラムです。 .sp \fBTags.label\fP は \fBdrilldown_output_columns\fP の中では \fBlabel\fP で参照できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Items \e \-\-limit 0 \e \-\-output_column _id \e \-\-drilldown tag \e \-\-drilldown_output_columns \(aq_key, label\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "tag", # "Tags" # ] # ] # ], # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "label", # "ShortText" # ] # ], # [ # "groonga", # "Groonga" # ], # [ # "mroonga", # "Mroonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB*\fP を使うと、参照されているテーブル(= \fBTags\fP )のすべてのカラムを参照できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Items \e \-\-limit 0 \e \-\-output_column _id \e \-\-drilldown tag \e \-\-drilldown_output_columns \(aq_key, *\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "tag", # "Tags" # ] # ] # ], # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "label", # "ShortText" # ], # [ # "priority", # "Int32" # ] # ], # [ # "groonga", # "Groonga", # 10 # ], # [ # "mroonga", # "Mroonga", # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB*\fP は \fBlabel, priority\fP に展開されます。 .sp \fBdrilldown_output_columns\fP のデフォルト値は \fB_key, _nsubrecs\fP です。グループ化に使ったキーとグループのレコード数を出力する、ということです。 .sp \fI\%drilldown_calc_types\fP を使うと、 \fBdrilldown_output_columns\fP の中で \fB_max\fP 、 \fB_min\fP 、 \fB_sum\fP 、 \fB_avg\fP といった \fB/reference/columns/pseudo\fP も使えるようになります。詳細は \fBdrilldown_calc_types\fP のドキュメントを参照してください。 .SS \fBdrilldown_offset\fP .sp ドリルダウン結果を出力するレコードの範囲を決めるためのオフセットを指定します。オフセットは0始まりです。 \fB\-\-offset 1\fP は2番目以降のレコードを出力するという意味になります。 .sp 以下は簡単な \fBdrilldown_offset\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit 0 \e \-\-output_column _id \e \-\-drilldown tag \e \-\-drilldown_sortby _key \e \-\-drilldown_offset 1 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Senna", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは2番目以降のレコードを出力します。 .sp 負の値を指定することもできます。負の値の場合は \fBグループの数 + offset\fP 番目のレコードから始まる範囲という意味になります。もし、グループの数が3つあり、 \fB\-\-offset \-2\fP を指定した場合は1番目( \fB3 + \-2 = 1\fP 。 \fB1\fP は2番目です。オフセットは0始まりということを思い出してください。) のグループから3番目のグループが出力されます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit 0 \e \-\-output_column _id \e \-\-drilldown tag \e \-\-drilldown_sortby _key \e \-\-drilldown_offset \-2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Senna", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは2番目以降のグループを出力します。なぜなら、全グループ数が \fB3\fP だからです。 .sp \fBdrilldown_offset\fP のデフォルト値は \fB0\fP です。 .SS \fBdrilldown_limit\fP .sp \fBdrilldown_limit\fP は出力グループ数の最大値を指定します。もし、グループ数 \fBlimit\fP よりも小さい場合はすべてのグループが出力されます。 .sp 以下は \fBdrilldown_limit\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit 0 \e \-\-output_column _id \e \-\-drilldown tag \e \-\-drilldown_sortby _key \e \-\-drilldown_offset 1 \e \-\-drilldown_limit 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Senna", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは2番目、3番目のレコードを出力します。 .sp 負の値を指定することもできます。負の値の場合は、最大で \fBマッチしたレコード数 + drilldown_limit + 1\fP 件のレコードを出力するという意味になります。 例えば、 \fB\-\-drilldown_limit \-1\fP はすべてのレコードを出力します。これはすべてのレコードを表示する場合にとても便利です。 .sp 以下は \fBdrilldown_limit\fP に負の値を指定する例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit 0 \e \-\-output_column _id \e \-\-drilldown tag \e \-\-drilldown_sortby _key \e \-\-drilldown_limit \-1 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Groonga", # 2 # ], # [ # "Hello", # 1 # ], # [ # "Senna", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドはすべてのグループを出力します。 .sp \fBdrilldown_limit\fP のデフォルト値は \fB10\fP です。 .SS \fBdrilldown_calc_types\fP .sp ドリルダウンでグループ内のレコードの値を計算(集計)する方法を指定します。「 \fB,\fP 」で区切ることで複数の計算タイプを指定することもできます。たとえば、 \fBMAX,MIN\fP といった具合です。 .sp 計算対象の値はグループ内のレコードのカラムから取得します。このカラムは \fI\%drilldown_calc_target\fP で指定します。 .sp 計算した値は \fI\%drilldown_output_columns\fP の中で \fB_max\fP や \fB_min\fP のような \fB/reference/columns/pseudo\fP を指定すると取得できます。 .sp 以下の計算タイプを使えます。 .TS center; |l|l|l|l|. _ T{ タイプ名 T} T{ \fB/reference/columns/pseudo\fP 名 T} T{ \fI\%drilldown_calc_target\fP が必要か T} T{ 説明 T} _ T{ \fBNONE\fP T} T{ なし。 T} T{ 必要ない。 T} T{ 無視されます。 T} _ T{ \fBCOUNT\fP T} T{ \fB_nsubrecs\fP T} T{ 必要ない。 T} T{ グループ内のレコードの数を数える。常に有効なので指定する必要はない。 T} _ T{ \fBMAX\fP T} T{ \fB_max\fP T} T{ 必要。 T} T{ グループ内のレコードの整数値の中で最大の値を見つける。 T} _ T{ \fBMIN\fP T} T{ \fB_min\fP T} T{ 必要。 T} T{ グループ内のレコードの整数値の中で最小の値を見つける。 T} _ T{ \fBSUM\fP T} T{ \fB_sum\fP T} T{ 必要。 T} T{ グループ内のレコードの整数値の合計を計算する。 T} _ T{ \fBAVG\fP T} T{ \fB_avg\fP T} T{ 必要。 T} T{ グループ内のレコードの整数値・浮動小数点数値の平均を計算する。 T} _ .TE .sp 以下は \fBMAX\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit \-1 \e \-\-output_column _id,n_likes \e \-\-drilldown tag \e \-\-drilldown_calc_types MAX \e \-\-drilldown_calc_target n_likes \e \-\-drilldown_output_columns _key,_max # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3, # "Senna" # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3, # "Senna" # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_max", # "Int64" # ] # ], # [ # "Hello", # 5 # ], # [ # "Groonga", # 15 # ], # [ # "Senna", # 3 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fBtag\fP カラムの値ですべてのレコードをグループ化します。その後、各グループについて最大の \fBn_likes\fP カラムの値を探し、「グループ化に使ったキー」と「 \fBn_likes\fP カラムの値の最大値」のペアのリストを出力します。 \fBn_likes\fP カラムの値の最大値を参照するために \fB_max\fP \fB/reference/columns/pseudo\fP を使っています。 .sp 以下は \fBMIN\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit \-1 \e \-\-output_column _id,n_likes \e \-\-drilldown tag \e \-\-drilldown_calc_types MIN \e \-\-drilldown_calc_target n_likes \e \-\-drilldown_output_columns _key,_min # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3, # "Senna" # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3, # "Senna" # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_min", # "Int64" # ] # ], # [ # "Hello", # 5 # ], # [ # "Groonga", # 10 # ], # [ # "Senna", # 3 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fBtag\fP カラムの値ですべてのレコードをグループ化します。その後、各グループについて最小の \fBn_likes\fP カラムの値を探し、「グループ化に使ったキー」と「 \fBn_likes\fP カラムの値の最小値」のペアのリストを出力します。 \fBn_likes\fP カラムの値の最小値を参照するために \fB_min\fP \fB/reference/columns/pseudo\fP を使っています。 .sp 以下は \fBSUM\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit \-1 \e \-\-output_column _id,n_likes \e \-\-drilldown tag \e \-\-drilldown_calc_types SUM \e \-\-drilldown_calc_target n_likes \e \-\-drilldown_output_columns _key,_sum # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3, # "Senna" # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3, # "Senna" # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_sum", # "Int64" # ] # ], # [ # "Hello", # 5 # ], # [ # "Groonga", # 25 # ], # [ # "Senna", # 6 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fBtag\fP カラムの値ですべてのレコードをグループ化します。その後、各グループについて \fBn_likes\fP カラムの合計を計算し、「グループ化に使ったキー」と「 \fBn_likes\fP カラムの値の合計」のペアのリストを出力します。 \fBn_likes\fP カラムの値の合計を参照するために \fB_sum\fP \fB/reference/columns/pseudo\fP を使っています。 .sp 以下は \fBAVG\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit \-1 \e \-\-output_column _id,n_likes \e \-\-drilldown tag \e \-\-drilldown_calc_types AVG \e \-\-drilldown_calc_target n_likes \e \-\-drilldown_output_columns _key,_avg # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3, # "Senna" # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3, # "Senna" # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_avg", # "Float" # ] # ], # [ # "Hello", # 5.0 # ], # [ # "Groonga", # 12.5 # ], # [ # "Senna", # 3.0 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fBtag\fP カラムの値ですべてのレコードをグループ化します。その後、各グループについて \fBn_likes\fP カラムの平均を計算し、「グループ化に使ったキー」と「 \fBn_likes\fP カラムの値の平均」のペアのリストを出力します。 \fBn_likes\fP カラムの値の合計を参照するために \fB_avg\fP \fB/reference/columns/pseudo\fP を使っています。 .sp 以下はすべての計算タイプを使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit \-1 \e \-\-output_column _id,n_likes \e \-\-drilldown tag \e \-\-drilldown_calc_types MAX,MIN,SUM,AVG \e \-\-drilldown_calc_target n_likes \e \-\-drilldown_output_columns _key,_nsubrecs,_max,_min,_sum,_avg # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3, # "Senna" # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3, # "Senna" # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ], # [ # "_max", # "Int64" # ], # [ # "_min", # "Int64" # ], # [ # "_sum", # "Int64" # ], # [ # "_avg", # "Float" # ] # ], # [ # "Hello", # 1, # 5, # 5, # 5, # 5.0 # ], # [ # "Groonga", # 2, # 15, # 10, # 25, # 12.5 # ], # [ # "Senna", # 2, # 3, # 3, # 6, # 3.0 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは複数の計算タイプを \fBMAX,MIN,SUM,AVG\fP というように「 \fB,\fP 」で区切って指定しています。 \fI\%drilldown_output_columns\fP で \fBCOUNT\fP を指定していなくても \fB_nsubrecs\fP \fB/reference/columns/pseudo\fP を使えます。これは、 \fBCOUNT\fP は常に有効だからです。 .sp \fBdrilldown_calc_types\fP のデフォルト値は \fBNONE\fP です。これは、 \fBCOUNT\fP だけが有効になっているという意味です。なぜなら、 \fBNONE\fP は単に無視されて、 \fBCOUNT\fP は常に有効だからです。 .SS \fBdrilldown_calc_target\fP .sp \fI\%drilldown_calc_types\fP の計算対象のカラムを指定します。 .sp \fI\%drilldown_calc_types\fP で \fBMAX\fP のように計算対象のカラムが必要な計算タイプを指定したにも関わらず \fBdrilldown_calc_target\fP を省略すると、計算結果は常に \fB0\fP になります。 .sp \fB\-\-drilldown_calc_target n_likes\fP というように1つのカラム名だけしか指定できません。 \fB\-\-drilldown_calc_target _key,n_likes\fP というように複数のカラムを指定することはできません。 .sp \fB\-\-drilldown_calc_target reference_column.nested_reference_column.value\fP というように「 \fB\&.\fP 」でつなげることで対象レコードから参照している値を使うことができます。 .sp \fBdrilldown_calc_target\fP の使い方は \fI\%drilldown_calc_types\fP を参照してください。 .sp \fBdrilldown_calc_target\fP のデフォルト値は \fBnull\fP です。これは計算対象カラムは何も指定されていないということです。 .SS 高度なドリルダウン関連のパラメーター .sp \fI\%drilldown\fP に複数のグループキーを指定することで複数のドリルダウン結果を取得できます。しかし、すべてのドリルダウンで同じ設定を使う必要があります。例えば、すべてのドリルダウンで同じ \fI\%drilldown_output_columns\fP の値が使われます。 .sp 以下の引数を使うことで、各ドリルダウンで別々の設定を使うことができます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBdrilldown[${LABEL}].keys\fP .IP \(bu 2 \fBdrilldown[${LABEL}].sortby\fP .IP \(bu 2 \fBdrilldown[${LABEL}].output_columns\fP .IP \(bu 2 \fBdrilldown[${LABEL}].offset\fP .IP \(bu 2 \fBdrilldown[${LABEL}].limit\fP .IP \(bu 2 \fBdrilldown[${LABEL}].calc_types\fP .IP \(bu 2 \fBdrilldown[${LABEL}].calc_target\fP .UNINDENT .UNINDENT .UNINDENT .sp \fB${LABEL}\fP は変数です。 \fB${LABEL}\fP には次の文字を使うことができます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 アルファベット .IP \(bu 2 数字 .IP \(bu 2 \fB\&.\fP .IP \(bu 2 \fB_\fP .UNINDENT .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 他の文字も使えますが、これらの文字だけを使ってください。 .UNINDENT .UNINDENT .sp 同じ \fB${LABEL}\fP の値を持つ引数は同じグループになります。1つのドリルダウンで同じグループの引数を一緒に使います。 .sp 例えば、以下の引数は2つのグループにわかれます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-drilldown[label1].keys _key\fP .IP \(bu 2 \fB\-\-drilldown[label1].output_columns _nsubrecs\fP .IP \(bu 2 \fB\-\-drilldown[label2].keys tag\fP .IP \(bu 2 \fB\-\-drilldown[label2].output_columns _key,_nsubrecs\fP .UNINDENT .UNINDENT .UNINDENT .sp \fBdrilldown[label1].keys\fP と \fBdrilldown[label1].output_columns\fP が同じグループです。 \fBdrilldown[label2].keys\fP と \fBdrilldown[label2].output_columns\fP は別のグループです。 .sp \fBlabel1\fP グループでは、グループキーとして \fB_key\fP を使って、出力カラムとして \fB_nsubrecs\fP を使います。 .sp \fBlabel2\fP グループでは、グループキーとして \fBtag\fP を使って、出力カラムとして \fB_key,_nsubrecs\fP を使います。 .sp 以下の引数の使い方は対応する \fBdrilldown_XXX\fP 引数のドキュメントを参照してください。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBdrilldown[${LABEL}].sortby\fP: \fI\%drilldown_sortby\fP .IP \(bu 2 \fBdrilldown[${LABEL}].offset\fP: \fI\%drilldown_offset\fP .IP \(bu 2 \fBdrilldown[${LABEL}].limit\fP: \fI\%drilldown_limit\fP .IP \(bu 2 \fBdrilldown[${LABEL}].calc_types\fP: \fI\%drilldown_calc_types\fP .IP \(bu 2 \fBdrilldown[${LABEL}].calc_target\fP: \fI\%drilldown_calc_target\fP .UNINDENT .UNINDENT .UNINDENT .sp 以下の引数は追加の説明が必要です。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBdrilldown[${LABEL}].keys\fP .IP \(bu 2 \fBdrilldown[${LABEL}].output_columns\fP .UNINDENT .UNINDENT .UNINDENT .sp 出力フォーマットは少し違います。これも追加の説明が必要です。 .SS \fBdrilldown[${LABEL}].keys\fP .sp \fI\%drilldown\fP は複数のキーを指定して複数のドリルダウンを指定できます。しかし、1つのドリルダウンに複数のキーを指定することはできません。 .sp \fBdrilldown[${LABEL}].keys\fP は複数のキーを指定して複数のドリルダウンを指定することはできません。しかし、1つのドリルダウンに複数のキーを指定することができます。 .sp 複数のキーを \fB,\fP 区切りで指定します。 .sp 以下は \fBtag\fP カラムと \fBn_likes\fP カラムの値を使った複数キーでのグループ化の例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit \-1 \e \-\-output_column tag,n_likes \e \-\-drilldown[tag.n_likes].keys tag,n_likes \e \-\-drilldown[tag.n_likes].output_columns _value.tag,_value.n_likes,_nsubrecs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3, # "Senna" # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3, # "Senna" # ] # ], # { # "tag.n_likes": [ # [ # 4 # ], # [ # [ # "tag", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 5, # 1 # ], # [ # "Groonga", # 10, # 1 # ], # [ # "Groonga", # 15, # 1 # ], # [ # "Senna", # 3, # 2 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBtag.n_likes\fP はドリルダウン引数グループのラベルです。グループ化に使ったそれぞれのキーを参照するときは \fI\%drilldown[${LABEL}].output_columns\fP で \fB_value.${KEY_NAME}\fP という構文を使います。 \fB${KEY_NAME}\fP にはグループキーを指定したときに使ったカラム名を使います。この場合は \fB${KEY_NAME}\fP に \fBtag\fP と \fBn_keys\fP を使います。 .sp \fB\-\-drilldown[tag].keys tag\fP のように \fBdrilldown[${LABEL}].keys\fP にキーを1つだけしか指定していない場合は \fB_value.${KEY_NAME}\fP 構文を使うことはできません。この場合は \fB_key\fP を使ってください。これは、 \fI\%drilldown_output_columns\fP と同じルールです。 .SS \fBdrilldown[${LABEL}].output_columns\fP .sp \fBdrilldown[${LABEL}].output_columns\fP はほとんど \fI\%drilldown_output_columns\fP と同じです。 \fI\%drilldown_output_columns\fP と \fBdrilldown[${LABEL}].output_columns\fP の違いはグループキーの参照方法です。 .sp \fI\%drilldown_output_columns\fP はグループキーを参照するために \fB_key\fP \fB/reference/columns/pseudo\fP を使います。 \fBdrilldown[${LABEL}].output_columns\fP も \fI\%drilldown[${LABEL}].keys\fP で1つだけしかグループキーを指定していない場合は、グループキーを参照するために \fB_key\fP \fB/reference/columns/pseudo\fP を使います。 .sp 以下は1つだけ指定したグループキーを参照するために \fB_key\fP \fB/reference/columns/pseudo\fP を使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit 0 \e \-\-output_column _id \e \-\-drilldown[tag.n_likes].keys tag,n_likes \e \-\-drilldown[tag.n_likes].output_columns _value.tag,_value.n_likes # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ] # ], # { # "tag.n_likes": [ # [ # 4 # ], # [ # [ # "tag", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # "Hello", # 5 # ], # [ # "Groonga", # 10 # ], # [ # "Groonga", # 15 # ], # [ # "Senna", # 3 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBdrilldown[${LABEL}].output_columns\fP で各グループキーを参照するために \fB_key\fP \fB/reference/columns/pseudo\fP を使うことはできません。 \fB_value.${KEY_NAME}\fP 構文を使います。 \fB${KEY_NAME}\fP には \fI\%drilldown[${LABEL}].keys\fP でグループキーを指定するために使ったカラム名を使います。 .sp 以下は複数のグループキーを使ったときに \fB_value.${KEY_NAME}\fP 構文でそれぞれのグループキーを参照する例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-limit 0 \e \-\-output_column _id \e \-\-drilldown[tag.n_likes].keys tag,n_likes \e \-\-drilldown[tag.n_likes].output_columns _value.tag,_value.n_likes # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ] # ], # { # "tag.n_likes": [ # [ # 4 # ], # [ # [ # "tag", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # "Hello", # 5 # ], # [ # "Groonga", # 10 # ], # [ # "Groonga", # 15 # ], # [ # "Senna", # 3 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBちなみに:\fP .INDENT 0.0 .INDENT 3.5 どうして \fB_value.${KEY_NAME}\fP 構文なの? .sp これは実装よりの情報です。 .sp \fB_key\fP はベクターの値です。このベクターの値はすべてのグループキーから成ります。 \fBdrilldown[${LABEL}].output_columns\fP で \fB_key\fP を参照するとこのベクターの値のバイト列を確認することができます。 .sp \fI\%drilldown[${LABEL}].keys\fP に複数のグループキーを指定したとき、各グループの値を参照するために \fB_value\fP にグループのレコードが1つだけ保存されています。そのため、各グループキーを参照するために \fB_value.${KEY_NAME}\fP 構文を使えます。 .sp 一方、 \fI\%drilldown[${LABEL}].keys\fP に1つのグループキーしか指定していない場合は、 \fB_value\fP にグループのレコードを保存しません。そのため、 \fB_value.${KEY_NAME}\fP 構文でグループキーを参照できません。 .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}]\fP スタイルの出力フォーマット .sp \fI\%drilldown\fP と \fI\%drilldown[${LABEL}].keys\fP には出力フォーマットに違いがあります。 \fI\%drilldown\fP は複数のドリルダウン結果を出力するために配列を使います。 \fI\%drilldown[${LABEL}].keys\fP は「ラベル」と「ドリルダウン結果」のペアの集まりを使います。 .sp \fI\%drilldown\fP の出力フォーマットは以下の通りです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, [ SEARCH_RESULT, DRILLDOWN_RESULT1, DRILLDOWN_RESULT2, ... ] ] .ft P .fi .UNINDENT .UNINDENT .sp \fI\%drilldown[${LABEL}].keys\fP の出力フォーマットは以下の通りです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, [ SEARCH_RESULT, { "LABEL1": DRILLDOWN_RESULT1, "LABEL2": DRILLDOWN_RESULT2, ... } ] ] .ft P .fi .UNINDENT .UNINDENT .SS キャッシュ関連の引数 .SS \fBcache\fP .sp このクエリーの結果をキャッシュするかどうかを指定します。 .sp このクエリーの結果がキャッシュしてあると、次に同じクエリーを実行するときはキャッシュを使って高速にレスポンスを返すことができます。 .sp これは既存のキャッシュされた結果を使うかどうかを指定するものではありません。 .sp 指定可能な値は以下の通りです。 .TS center; |l|l|. _ T{ Value T} T{ 説明 T} _ T{ \fBno\fP T} T{ このクエリーの出力をキャッシュしない。 T} _ T{ \fByes\fP T} T{ このクエリーの出力をキャッシュする。デフォルト値。 T} _ .TE .sp このクエリーの結果をキャッシュしないようにする例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-cache no # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15, # "Groonga" # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3, # "Senna" # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp デフォルト値は \fByes\fP です。 .SS スコアー関連の引数 .sp スコアー関連のパラメーターは \fBadjuster\fP だけです。 .SS \fBadjuster\fP .sp 1つ以上のスコアー調整式(score adjust expression)を指定します。 \fBadjuster\fP は \fBquery\fP または \fBfilter\fP と一緒に使います。検索しないリクエストでは \fBadjuster\fP は動きません。 .sp \fBadjuster\fP を使うと特定のレコードのスコアーを増やすことができます。重要なレコードに高いスコアーをつけるために \fBadjuster\fP を使えます。 .sp 例えば、 \fBgroonga\fP タグがついたレコードのスコアーを増やすために \fBadjuster\fP を使えます。 .sp 以下が構文です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C \-\-adjuster "SCORE_ADJUST_EXPRESSION1 + SCORE_ADJUST_EXPRESSION2 + ..." .ft P .fi .UNINDENT .UNINDENT .sp 以下が \fBSCORE_ADJUST_EXPRESSION\fP の構文です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C COLUMN @ "KEYWORD" * FACTOR .ft P .fi .UNINDENT .UNINDENT .sp 以下のことに注意してください: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBCOLUMN\fP にはインデックスが張っていないといけません。 .IP \(bu 2 \fB"KEYWORD"\fP は文字列でないといけません。 .IP \(bu 2 \fBFACTOR\fP は正の整数でないといけません。 .UNINDENT .UNINDENT .UNINDENT .sp 以下は1つだけ \fBSCORE_ADJUST_EXPRESSION\fP を使った \fBadjuster\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-filter true \e \-\-adjuster \(aqcontent @ "groonga" * 5\(aq \e \-\-output_columns _key,content,_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "_score", # "Int32" # ] # ], # [ # "The first post!", # "Welcome! This is my first post!", # 1 # ], # [ # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 6 # ], # [ # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1 # ], # [ # "Good\-bye Senna", # "I migrated all Senna system!", # 1 # ], # [ # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドはすべてのレコードにマッチします。それから、 \fBadjuster\fP を適用します。このアジャスターは \fBEntries.content\fP カラムの中に \fB"groonga"\fP を含むレコードのスコアーを5増やします。 \fBEntries.content\fP カラムに \fB"groonga"\fP が含まれているレコードは1つだけです。 \fB"Groonga"\fP というキーのレコードです。このレコードのスコアーは6( \fB= 1 + 5\fP )になります。 .sp \fBFACTOR\fP は省略できます。 \fBFACTOR\fP を省略すると、1を指定したとみなします。 .sp \fBFACTOR\fP を省略した \fBadjuster\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-filter true \e \-\-adjuster \(aqcontent @ "groonga"\(aq \e \-\-output_columns _key,content,_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "_score", # "Int32" # ] # ], # [ # "The first post!", # "Welcome! This is my first post!", # 1 # ], # [ # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 2 # ], # [ # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1 # ], # [ # "Good\-bye Senna", # "I migrated all Senna system!", # 1 # ], # [ # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドの \fBadjuster\fP は \fBFACTOR\fP がありません。そのため、係数は1になります。 \fBEntries.content\fP カラムに \fB"groonga"\fP を含むレコードは1つだけです。キーが \fB"Groonga"\fP のレコードです。このレコードのスコアーは2( \fB= 1 + 1\fP )になります。 .sp 複数の \fBSCORE_ADJUST_EXPRESSION\fP を使った \fBadjuster\fP の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \e \-\-filter true \e \-\-adjuster \(aqcontent @ "groonga" * 5 + content @ "started" * 3\(aq \e \-\-output_columns _key,content,_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "_score", # "Int32" # ] # ], # [ # "The first post!", # "Welcome! This is my first post!", # 1 # ], # [ # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 9 # ], # [ # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 4 # ], # [ # "Good\-bye Senna", # "I migrated all Senna system!", # 1 # ], # [ # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドの \fBadjuster\fP には2つの \fBSCORE_ADJUST_EXPRESSION\fP があります。最終的なスコアーの増分はすこれらの \fBSCORE_ADJUST_EXPRESSION\fP のスコアーの合計になります。この \fBselect\fP コマンドのすべての \fBSCORE_ADJUST_EXPRESSION\fP はキーが \fB"Groonga"\fP のレコードに適用されます。そのため、このレコードの最終的なスコアーの増分はすべての \fBSCORE_ADJUST_EXPRESSION\fP の合計になります。 .sp 最初の \fBSCORE_ADJUST_EXPRESSION\fP は \fBcontent @ "groonga" * 5\fP です。これは、スコアーを5増やします。 .sp 2番目の \fBSCORE_ADJUST_EXPRESSION\fP は \fBcontent @ "started" * 3\fP です。これはスコアーを3増やします。 .sp 最終的なスコアーの増分は9( \fB= 1 + 5 + 3\fP )です。 .sp 1つの \fBSCORE_ADJUST_EXPRESSION\fP は \fB"KEYWORD"\fP に対して1つの係数を持ちます。これは、 \fB"KEYWORD"\fP を持つすべてのレコードでスコアーの増加分は同じということです。 \fB"KEYWORD"\fP を持つそれぞれのレコード毎にスコアーの増加分を変えることができます。これは検索スコアーをチューニングするときに便利です。詳細は weight\-vector\-column を参照してください。 .SS 戻り値 .sp \fBselect\fP は以下のフォーマットのレスポンスを返します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, [ SEARCH_RESULT, DRILLDOWN_RESULT_1, DRILLDOWN_RESULT_2, ..., DRILLDOWN_RESULT_N ] ] .ft P .fi .UNINDENT .UNINDENT .sp \fBselect\fP が失敗すると、 \fBHEADER\fP にエラーの詳細が含まれます。 .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .sp 0個以上の \fBDRILLDOWN_RESULT\fP があります。もし、 \fBdrilldown\fP も \fBdrilldown[${LABEL}].keys\fP も指定していない場合、次のように \fBDRILLDOWN_RESULT\fP は出力されません: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, [ SEARCH_RESULT ] ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-drilldown "_key, column1, column2"\fP というように \fBdrilldown\fP に2つ以上のキーがある場合、複数の \fBDRILLDOWN_RESULT\fP が存在します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, [ SEARCH_RESULT, DRILLDOWN_RESULT_FOR_KEY, DRILLDOWN_RESULT_FOR_COLUMN1, DRILLDOWN_RESULT_FOR_COLUMN2 ] ] .ft P .fi .UNINDENT .UNINDENT .sp もし \fBdrilldown[${LABEL}].keys\fP を使っているなら、 \fBDRILLDOWN_RESULT\fP が1つだけ存在します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, [ SEARCH_RESULT, DRILLDOWN_RESULT_FOR_LABELED_DRILLDOWN ] ] .ft P .fi .UNINDENT .UNINDENT .sp \fBDRILLDOWN_RESULT\fP のフォーマットは \fBdrilldown\fP と \fBdrilldown[${LABEL}].keys\fP で違います。これについては後述します。 .sp \fBSEARCH_RESULT\fP は以下のフォーマットです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ [N_HITS], COLUMNS, RECORDS ] .ft P .fi .UNINDENT .UNINDENT .sp このフォーマットの具体例は \fI\%簡単な使い方\fP を見てください。 .sp \fBN_HITS\fP は \fI\%limit\fP を適用する前のマッチしたレコード数です。 .sp \fBCOLUMNS\fP は \fI\%output_columns\fP で指定した出力カラムの情報を表しています。これは次のフォーマットになっています: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ [COLUMN_NAME_1, COLUMN_TYPE_1], [COLUMN_NAME_2, COLUMN_TYPE_2], ..., [COLUMN_NAME_N, COLUMN_TYPE_N] ] .ft P .fi .UNINDENT .UNINDENT .sp \fBCOLUMNS\fP は1つ以上の出力カラムの情報を含んでいます。各出力カラムの情報は次の情報を含んでいます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 カラム名(文字列) .IP \(bu 2 カラムの型(文字列または \fBnull\fP ) .UNINDENT .UNINDENT .UNINDENT .sp カラム名は \fI\%output_columns\fP で指定された値から抽出しています。 .sp カラムの方はGroongaでの型名または \fBnull\fP です。カラムがベクターかスカラーかの情報は持っていません。実際のカラムの値が配列かどうかで判断する必要があります。 .sp 型の詳細は \fB/reference/types\fP を見てください。 .sp \fBnull\fP になるときはカラムの値の型を決められないときです。たとえば、 \fB\-\-output_columns "snippet_html(content)"\fP というように \fI\%output_columns\fP の中で関数呼び出しを使ったときは \fBnull\fP になります。 .sp 以下は \fBCOLUMNS\fP の使用例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ ["_id", "UInt32"], ["_key", "ShortText"], ["n_likes", "UInt32"], ] .ft P .fi .UNINDENT .UNINDENT .sp \fBRECORDS\fP はマッチした各レコードのカラムの値を含んでいます。 \fBRECORDS\fP に含まれるレコードは \fI\%offset\fP と \fI\%limit\fP で選択されたレコードです。 \fBRECORDS\fP は次のフォーマットです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ [ RECORD_1_COLUMN_1, RECORD_1_COLUMN_2, ..., RECORD_1_COLUMN_N ], [ RECORD_2_COLUMN_1, RECORD_2_COLUMN_2, ..., RECORD_2_COLUMN_N ], ... [ RECORD_N_COLUMN_1, RECORD_N_COLUMN_2, ..., RECORD_N_COLUMN_N ] ] .ft P .fi .UNINDENT .UNINDENT .sp 以下は \fBRECORDS\fP の例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ [ 1, "The first post!", 5 ], [ 2, "Groonga", 10 ], [ 3, "Mroonga", 15 ] ] .ft P .fi .UNINDENT .UNINDENT .sp \fBDRILLDOWN_RESULT\fP のフォーマットは \fBdrilldown\fP と \fBdrilldown[${LABEL}].keys\fP で違います。 .sp \fBdrilldown\fP は \fBSEARCH_RESULT\fP と同じフォーマットです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ [N_HITS], COLUMNS, RECORDS ] .ft P .fi .UNINDENT .UNINDENT .sp \fI\%drilldown\fP で1つ以上のキーを指定すると、 \fBdrilldown\fP は1つ以上の \fBDRILLDOWN_RESULT\fP を出力します。 .sp \fBdrilldown[${LABEL}].keys\fP は次のフォーマットを使います。複数の \fBdrilldown[${LABEL}].keys\fP は1つのオブジェクト(キーと値のペアの集合)になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C { "LABEL_1": [ [N_HITS], COLUMNS, RECORDS ], "LABEL_2": [ [N_HITS], COLUMNS, RECORDS ], ..., "LABEL_N": [ [N_HITS], COLUMNS, RECORDS ] } .ft P .fi .UNINDENT .UNINDENT .sp 各 \fBdrilldown[${LABEL}].keys\fP は次の部分に対応します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C "LABEL": [ [N_HITS], COLUMNS, RECORDS ] .ft P .fi .UNINDENT .UNINDENT .sp 以下の値の部分は \fBSEARCH_RESULT\fP と同じフォーマットです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ [N_HITS], COLUMNS, RECORDS ] .ft P .fi .UNINDENT .UNINDENT .sp \fBdrilldown[${LABEL}]\fP スタイルのドリルダウンの出力形式については \fI\%drilldown[${LABEL}] スタイルの出力フォーマット\fP も見てください。 .SS 参考 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB/reference/grn_expr/query_syntax\fP .IP \(bu 2 \fB/reference/grn_expr/script_syntax\fP .UNINDENT .UNINDENT .UNINDENT .SS \fBshutdown\fP .SS 概要 .sp shutdown \- サーバプロセスの停止 .sp Groonga組込コマンドの一つであるshutdownについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入 力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp shutdownは、接続しているgroongaサーバプロセスを停止します。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shutdown .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shutdown .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp ありません。 .SS 戻り値 .sp ありません。 .SS \fBstatus\fP .SS 概要 .sp \fBstatus\fP はこのリクエストを処理しているコンテキストの現在のステータスを返します。 .sp コンテキストはリクエストを処理する単位です。通常、各スレッドごとにコンテキストを作ります。 .SS 構文 .sp このコマンドに引数はありません: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C status .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C status # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "uptime": 0, # "max_command_version": 2, # "start_time": 1441980651, # "cache_hit_rate": 0.0, # "version": "5.0.7\-126\-gb6fd7f7", # "alloc_count": 206, # "command_version": 1, # "starttime": 1441980651, # "default_command_version": 1, # "n_queries": 0 # } # ] .ft P .fi .UNINDENT .UNINDENT .sp このリクエストを処理しているコンテキストの現在のステータスを返します。詳細は \fI\%戻り値\fP を参照してください。 .SS 引数 .sp このセクションではすべての引数について説明します。 .SS 必須引数 .sp 必須の引数はありません。 .SS 省略可能引数 .sp 省略可能な引数はありません。 .SS 戻り値 .sp このコマンドはオブジェクトとして現在のステータスを返します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, { "alloc_count": ALLOC_COUNT, "cache_hit_rate": CACHE_HIT_RATE, "command_version": COMMAND_VERSION, "default_command_version": DEFAULT_COMMAND_VERSION, "max_command_version": MAX_COMMAND_VERSION, "n_queries": N_QUERIES, "start_time": START_TIME, "starttime": STARTTIME, "uptime": UPTIME, "version": VERSION } ] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .sp 以下は値の説明です。実際の値は \fI\%使い方\fP を参照してください。 .TS center; |l|l|l|. _ T{ キー T} T{ 説明 T} T{ 例 T} _ T{ \fBalloc_count\fP T} T{ まだ解放されていないメモリーブロックの数です。もし、この値が継続的に増えていっているならメモリーリークがあるかもしれません。 T} T{ \fB1400\fP T} _ T{ \fBcache_hit_rate\fP T} T{ このGroongaプロセスがキャッシュを使って返したレスポンスの割合です。もし、10リクエストのうち7つのレスポンスはキャッシュを使ったなら、 \fBcache_hit_rate\fP は \fB70.0\fP になります。この割合はキャッシュをサポートしているコマンドを使ったリクエストのみで計算します。 .sp 以下はキャッシュをサポートしているコマンドです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBselect\fP .IP \(bu 2 \fBlogical_select\fP .IP \(bu 2 \fBlogical_range_filter\fP .IP \(bu 2 \fBlogical_count\fP .UNINDENT .UNINDENT .UNINDENT T} T{ \fB29.4\fP T} _ T{ \fBcommand_version\fP T} T{ このコンテキストが使っている \fB/reference/command/command_version\fP です。 T} T{ \fB1\fP T} _ T{ \fBdefault_command_version\fP T} T{ このGroongaプロセスのデフォルト \fB/reference/command/command_version\fP です。 T} T{ \fB1\fP T} _ T{ \fBmax_command_version\fP T} T{ このGroongaプロセスがサポートしている最大 \fB/reference/command/command_version\fP です。 T} T{ \fB2\fP T} _ T{ \fBn_queries\fP T} T{ このGroongaプロセスが処理したリクエスト数です。ただし、キャッシュをサポートしたコマンドを使ったリクエストだけを数えます。 .sp 以下はキャッシュをサポートしているコマンドです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBselect\fP .IP \(bu 2 \fBlogical_select\fP .IP \(bu 2 \fBlogical_range_filter\fP .IP \(bu 2 \fBlogical_count\fP .UNINDENT .UNINDENT .UNINDENT T} T{ \fB29\fP T} _ T{ \fBstart_time\fP T} T{ バージョン 5.0.8 で追加. .sp このGroongaプロセスが起動した時間です。UNIX時間です。 T} T{ \fB1441761403\fP T} _ T{ \fBstarttime\fP T} T{ バージョン 5.0.8 で撤廃: 代わりに \fBstart_time\fP を使ってください。 T} T{ \fB1441761403\fP T} _ T{ \fBuptime\fP T} T{ このGroongaプロセスが起動してから経過した時間です。単位は秒です。 .sp たとえば、 \fB216639\fP は \fB2.5\fP (= \fB216639 / 60 / 60 / 24 = 2.507\fP )日という意味です。 T} T{ \fB216639\fP T} _ T{ \fBversion\fP T} T{ このGroongaプロセスのバージョンです。 T} T{ \fB5.0.7\fP T} _ .TE .SS \fBsuggest\fP .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 サジェスト機能の仕様はまだ確定していません。仕様は変更される可能性があります。 .UNINDENT .UNINDENT .SS 概要 .sp suggest \- 指定されたクエリーに対する補完・補正・提案候補を返す。 .sp suggestコマンドは指定されたクエリーに対する補完・補正・提案候補を返します。 .sp 補完・補正・提案については \fB/reference/suggest/introduction\fP を参照してください。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C suggest types table column query [sortby [output_columns [offset [limit [frequency_threshold [conditional_probability_threshold [prefix_search]]]]]]] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 以下は補完用の学習データです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table event_query \-\-each \(aqsuggest_preparer(_id, type, item, sequence, time, pair_query)\(aq [ {"sequence": "1", "time": 1312950803.86057, "item": "e"}, {"sequence": "1", "time": 1312950803.96857, "item": "en"}, {"sequence": "1", "time": 1312950804.26057, "item": "eng"}, {"sequence": "1", "time": 1312950804.56057, "item": "engi"}, {"sequence": "1", "time": 1312950804.76057, "item": "engin"}, {"sequence": "1", "time": 1312950805.86057, "item": "engine", "type": "submit"} ] # [[0, 1337566253.89858, 0.000355720520019531], 6] .ft P .fi .UNINDENT .UNINDENT .sp 以下は補正用の学習データです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table event_query \-\-each \(aqsuggest_preparer(_id, type, item, sequence, time, pair_query)\(aq [ {"sequence": "2", "time": 1312950803.86057, "item": "s"}, {"sequence": "2", "time": 1312950803.96857, "item": "sa"}, {"sequence": "2", "time": 1312950804.26057, "item": "sae"}, {"sequence": "2", "time": 1312950804.56057, "item": "saer"}, {"sequence": "2", "time": 1312950804.76057, "item": "saerc"}, {"sequence": "2", "time": 1312950805.76057, "item": "saerch", "type": "submit"}, {"sequence": "2", "time": 1312950809.76057, "item": "serch"}, {"sequence": "2", "time": 1312950810.86057, "item": "search", "type": "submit"} ] # [[0, 1337566253.89858, 0.000355720520019531], 8] .ft P .fi .UNINDENT .UNINDENT .sp 以下は提案用の学習データです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table event_query \-\-each \(aqsuggest_preparer(_id, type, item, sequence, time, pair_query)\(aq [ {"sequence": "3", "time": 1312950803.86057, "item": "search engine", "type": "submit"}, {"sequence": "3", "time": 1312950808.86057, "item": "web search realtime", "type": "submit"} ] # [[0, 1337566253.89858, 0.000355720520019531], 2] .ft P .fi .UNINDENT .UNINDENT .sp 以下は補完例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C suggest \-\-table item_query \-\-column kana \-\-types complete \-\-frequency_threshold 1 \-\-query en # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "complete": [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "engine", # 1 # ] # ] # } # ] .ft P .fi .UNINDENT .UNINDENT .sp 以下は補正例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C suggest \-\-table item_query \-\-column kana \-\-types correct \-\-frequency_threshold 1 \-\-query saerch # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "correct": [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "search", # 1 # ] # ] # } # ] .ft P .fi .UNINDENT .UNINDENT .sp 以下は提案例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C suggest \-\-table item_query \-\-column kana \-\-types suggest \-\-frequency_threshold 1 \-\-query search # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "suggest": [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "search engine", # 1 # ], # [ # "web search realtime", # 1 # ] # ] # } # ] .ft P .fi .UNINDENT .UNINDENT .sp 以下は補完・補正・提案を混ぜた例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C suggest \-\-table item_query \-\-column kana \-\-types complete|correct|suggest \-\-frequency_threshold 1 \-\-query search # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "suggest": [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "search engine", # 1 # ], # [ # "web search realtime", # 1 # ] # ], # "complete": [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "search", # 2 # ], # [ # "search engine", # 2 # ] # ], # "correct": [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "search", # 2 # ] # ] # } # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .INDENT 0.0 .TP .B \fBtypes\fP suggestコマンドでどの種類の候補を返すかを指定します。 .sp 指定できる種類は以下の通りです。 .INDENT 7.0 .INDENT 3.5 .INDENT 0.0 .TP .B \fBcomplete\fP 補完を実行します。 .TP .B \fBcorrect\fP 補正を実行します。 .TP .B \fBsuggest\fP 提案を実行します。 .UNINDENT .UNINDENT .UNINDENT .sp 1つ以上の種類を指定できます。複数の種類を指定する場合は \fB|\fP で区切ります。以下が例です。: .INDENT 7.0 .INDENT 3.5 補正候補を返します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C correct .ft P .fi .UNINDENT .UNINDENT .sp 補正候補と提案候補を返します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C correct|suggest .ft P .fi .UNINDENT .UNINDENT .sp 補完候補と補正候補と提案候補を返します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C complete|correct|suggest .ft P .fi .UNINDENT .UNINDENT .UNINDENT .UNINDENT .TP .B \fBtable\fP \fBitem_${データセット名}\fP というフォーマットのテーブル名を指定します。例えば、以下のコマンドでデータセットを作成した場合はテーブル名として \fBitem_query\fP を指定します: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C groonga\-suggest\-create\-dataset /tmp/db\-path query .ft P .fi .UNINDENT .UNINDENT .TP .B \fBcolumn\fP \fBtable\fP で指定したテーブルにあるふりがな情報を含むカラムを指定します。ふりがなはカタカナで指定します。 .TP .B \fBquery\fP 補完・補正・提案対象のクエリーを指定します。 .TP .B \fBsortby\fP ソートキーを指定します。 .INDENT 7.0 .TP .B Default: \fB\-_score\fP .UNINDENT .TP .B \fBoutput_columns\fP 出力するカラムを指定します。 .INDENT 7.0 .TP .B Default: \fB_key,_score\fP .UNINDENT .TP .B \fBoffset\fP 返されるレコードのオフセットを指定します。 .INDENT 7.0 .TP .B Default: \fB0\fP .UNINDENT .TP .B \fBlimit\fP 返されるレコード数を指定します。 .INDENT 7.0 .TP .B Default: \fB10\fP .UNINDENT .TP .B \fBfrequency_threshold\fP 出現頻度に対する閾値を指定します。返されるレコードの \fB_score\fP 値は \fBfrequency_threshold\fP 以上になります。 .INDENT 7.0 .TP .B Default: \fB100\fP .UNINDENT .UNINDENT .sp \fBconditional_probability_threshold\fP .INDENT 0.0 .INDENT 3.5 条件付き確率に対する閾値を指定します。学習データに対して条件付き確率を使います。ここで使う条件付き確率は、入力した \fBquery\fP と同じ入力があったときにクエリが検索された確率です。返されるレコードの条件付き確率は \fBconditional_probability_threshold\fP 以上になります。 .INDENT 0.0 .TP .B Default: \fB0.2\fP .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B \fBprefix_search\fP 補完時に前方一致検索を実行するかどうかを指定します。 .sp 指定可能な値は以下の通りです。 .INDENT 7.0 .INDENT 3.5 .INDENT 0.0 .TP .B \fByes\fP 常に前方一致検索を実行します。 .TP .B \fBno\fP 前方一致検索を実行しません。 .TP .B \fBauto\fP 他の検索でレコードが見つからない場合のみ前方一致検索を実行します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 7.0 .TP .B Default: \fBauto\fP .UNINDENT .TP .B \fBsimilar_search\fP 補正時に類似検索を実行するかどうかを指定します。 .sp 指定可能な値は以下の通りです。 .INDENT 7.0 .INDENT 3.5 .INDENT 0.0 .TP .B \fByes\fP 常に類似検索を実行します。 .TP .B \fBno\fP 類似検索を実行しません。 .TP .B \fBauto\fP 他の検索でレコードが見つからない場合のみ類似検索を実行します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 7.0 .TP .B Default: \fBauto\fP .UNINDENT .UNINDENT .SS 戻り値 .sp 返されるJSON形式は以下の通りです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C {"type1": [["candidate1", score of candidate1], ["candidate2", score of candidate2], ...], "type2": [["candidate1", score of candidate1], ["candidate2", score of candidate2], ...], ...} .ft P .fi .UNINDENT .UNINDENT .sp \fBtype\fP .INDENT 0.0 .INDENT 3.5 \fBtypes\fP で指定した値。 .UNINDENT .UNINDENT .sp \fBcandidate\fP .INDENT 0.0 .INDENT 3.5 補完・補正・提案候補。 .UNINDENT .UNINDENT .sp \fBscore of candidate\fP .INDENT 0.0 .INDENT 3.5 対応する \fBcandidate\fP のスコアです。スコアが高いほど補完・補正・提案候補として有力という意味になります。デフォルトでは候補は \fBscore of candidate\fP の降順でソートされています。 .UNINDENT .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/suggest\fP .IP \(bu 2 \fB/reference/executables/groonga\-suggest\-create\-dataset\fP .UNINDENT .SS \fBtable_create\fP .SS 概要 .sp \fBtable_create\fP は現在のデータベースに新しいテーブルを作成します。データを保存したり検索したりするために、1つ以上のテーブルを作成する必要があります。 .SS 構文 .sp このコマンドにはたくさんの引数があります。 .sp 必須の引数は \fBname\fP だけで、残りは省略できます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create name [flags=TABLE_HASH_KEY] [key_type=null] [value_type=null] [default_tokenizer=null] [normalizer=null] [token_filters=null] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp \fBtable_create\fP コマンドは新しく永続テーブルを作成します。テーブルの詳細については \fB/reference/tables\fP を参照してください。 .SS データ保存用テーブルの作成 .sp データ保存用のテーブルにはどの種類のテーブルでも使えます。テーブルの種類については \fB/reference/tables\fP を参照してください。 .sp テーブルの型は \fBTABLE_${TYPE}\fP を \fBflags\fP 引数に指定します。 .sp 以下は \fBTABLE_NO_KEY\fP テーブルを使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Logs TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp この \fBtable_create\fP コマンドは \fBLogs\fP という名前で \fBTABLE_NO_KEY\fP 型のテーブルを作成します。 .sp キーでレコードを検索しないのであれば、 \fBTABLE_NO_KEY\fP 型のテーブルが適切です。なぜなら、 \fBTABLE_NO_KEY\fP はキーをサポートしていませんが、速くて小さいサイズのテーブルだからです。ログをGroongaのデータベースに保存するという使い方はこのケースです。 .sp キーでレコードを検索したり、カラムからレコードを参照したりする場合は、 \fBTABLE_NO_KEY\fP 型は適していません。全文検索用の語彙表として使うケースはこのケースです。 .SS 語彙表テーブルの作成 .sp 語彙表テーブル用のテーブルには \fBTABLE_NO_KEY\fP 以外の型のテーブルを使います。語彙表テーブルはキーをサポートしていないといけませんが、 \fBTABLE_NO_KEY\fP はキーをサポートしていません。 .sp 以下は \fBTABLE_PAT_KEY\fP テーブルを作る例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Lexicon TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp この \fBtable_create\fP コマンドは以下のテーブルを作成します。 .INDENT 0.0 .IP \(bu 2 このテーブルは \fBLexicon\fP という名前です。 .IP \(bu 2 このテーブルは \fBTABLE_PAT_KEY\fP 型のテーブルです。 .IP \(bu 2 このテーブルのキーは \fBShortText\fP 型です。 .IP \(bu 2 このテーブルは正規化されたテキストからトークンを抽出するために \fBTokenBigram\fP トークナイザーを使います。 .IP \(bu 2 このテーブルはテキストを正規化するために \fBNormalizerAuto\fP ノーマライザーを使います。 .UNINDENT .sp 語彙表テーブルには \fBTABLE_PAT_KEY\fP が適切なテーブルの型です。語彙表テーブルは全文検索に使われます。 .sp 全文検索では、あいまい検索をするために前方一致検索を使っています。前方一致検索は \fBTABLE_PAT_KEY\fP と \fBTABLE_DAT_KEY\fP がサポートしています。 .sp 全文検索対象のテキストには大量のトークンが含まれるので、語彙表テーブルのキーも大量になります。大量のキーを格納するテーブルの場合はテーブルのサイズを意識する必要があります。これは、大きなテーブルはそれだけ多くのメモリーを必要とするからです。多くのメモリーが必要になると、ディスクI/Oが発生することもあります。ディスクI/Oが発生すると高速に検索できなくなります。そのため、大量のキーがあるテーブルの場合はテーブルのサイズが重要になります。 \fBTABLE_PAT_KEY\fP は \fBTABLE_DAT_KEY\fP よりもテーブルのサイズが小さいです。 .sp 上記の理由から、 \fBTABLE_PAT_KEY\fP が語彙表テーブルに適したテーブルの型です。 .SS タグインデックス用テーブルの作成 .sp タグインデックス用のテーブルには \fBTABLE_NO_KEY\fP 以外の型のテーブルを使えます。タグインデックス用のテーブルはキーのサポートが必要ですが、 \fBTABLE_NO_KEY\fP はキーをサポートしていません。 .sp 以下は \fBTABLE_HASH_KEY\fP 型のテーブルを作る例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Tags TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp この \fBtable_create\fP コマンドは \fBTags\fP という名前で \fBTABLE_HASH_KEY\fP 型のテーブルを作ります。このテーブルのキーは \fBShortText\fP 型です。 .sp タグインデックス用のテーブルには \fBTABLE_HASH_KEY\fP あるいは \fBTABLE_DAT_KEY\fP が適切なテーブルの型です。 .sp 完全一致でタグを検索する機能だけが必要なら、 \fBTABLE_HASH_KEY\fP が適切です。多くの場合はこのケースです。 .sp もし、前方一致検索機能も必要な場合(例えば、 \fB"gr"\fP というキーワードで \fB"groonga"\fP を検索する場合)は、 \fBTABLE_DAT_KEY\fP が適切です。 \fBTABLE_DAT_KEY\fP はサイズの大きなテーブルですが、タグの数はそれほど多くならないので、サイズは重要ではありません。 .SS 範囲検索用のインデックステーブルの作成 .sp 範囲検索用のインデックステーブルには \fBTABLE_PAT_KEY\fP 型と \fBTABLE_DAT_KEY\fP 型を使えます。範囲検索用のインデックステーブルは範囲検索をサポートしている必要がありますが、 \fBTABLE_NO_KEY\fP 型と \fBTABLE_HASH_KEY\fP 型はサポートしていません。 .sp 以下は \fBTABLE_DAT_KEY\fP テーブルを作成する例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Ages TABLE_DAT_KEY UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp この \fBtable_create\fP コマンドは \fBAges\fP という名前で \fBTABLE_DAT_KEY\fP 型のテーブルを作成します。このテーブルのキーの型は \fBUInt32\fP です。 .sp 範囲検索用のインデックステーブルには \fBTABLE_PAT_KEY\fP 型と \fBTABLE_DAT_KEY\fP 型が適切なテーブルの型です。 .sp インデックス対象の項目が少なければ、 \fBTABLE_DAT_KEY\fP 型が適切です。前述の例では、年齢(age)用のインデックスがこのケースになります。年齢のインデックスはせいぜい0から100項目くらいにしかなりません。これは、人はそんなに長生きできないからです。 .sp インデックス対象が大量にある場合は、 \fBTABLE_PAT_KEY\fP 型が適切です。なぜなら、 \fBTABLE_PAT_KEY\fP 型は \fBTABLE_DAT_KEY\fP 型よりもサイズが小さいからです。 .SS 引数 .sp このセクションではすべての引数について説明します。 .SS \fBname\fP .sp 作成するテーブル名を指定します。 \fBname\fP は必ず指定しなければいけません。 .sp 利用可能な文字は以下の通りです。 .INDENT 0.0 .IP \(bu 2 \fB0\fP .. \fB9\fP (数字) .IP \(bu 2 \fBa\fP .. \fBz\fP (アルファベット。小文字) .IP \(bu 2 \fBA\fP .. \fBZ\fP (アルファベット。大文字) .IP \(bu 2 \fB#\fP (シャープ) .IP \(bu 2 \fB@\fP (アットマーク) .IP \(bu 2 \fB\-\fP (ハイフン) .IP \(bu 2 \fB_\fP (アンダースコア)(注: 最初の文字としてアンダースコアを使うことはできません。) .UNINDENT .sp 上記の文字を1つ以上使って名前を決めます。 \fB_name\fP というように、最初の文字に \fB_\fP を使えないことに注意してください。 .SS \fBflags\fP .sp テーブルの型とテーブルをカスタマイズするオプションを指定します。 .sp 指定可能なフラグは以下の通りです。 .TS center; |l|l|. _ T{ フラグ T} T{ 説明 T} _ T{ \fBTABLE_NO_KEY\fP T} T{ 配列テーブル。 T} _ T{ \fBTABLE_HASH_KEY\fP T} T{ ハッシュテーブル。 T} _ T{ \fBTABLE_PAT_KEY\fP T} T{ パトリシアトライ。 T} _ T{ \fBTABLE_DAT_KEY\fP T} T{ ダブル配列トライ。 T} _ T{ \fBKEY_WITH_SIS\fP T} T{ 半無限文字列を有効にします。 \fBTABLE_PAT_KEY\fP を使う必要があります。 T} _ .TE .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 Groonga 2.1.0から \fBKEY_NORMALIZE\fP フラグは非推奨になりました。代わりに、 \fBnormalizer\fP オプションに \fBNormalizerAuto\fP を指定してください。 .UNINDENT .UNINDENT .sp \fBTABLE_${TYPE}\fP フラグのどれか1つを指定します。 \fBTABLE_${TYPE}\fP フラグを2つ以上指定することはできません。例えば、 \fBTABLE_NO_KEY|TABLE_HASH_KEY\fP は不正な指定方法です。 .sp \fBTABLE_PAT_KEY|KEY_WITH_SIS\fP というように、 \fB|\fP (縦棒)で複数のフラグを組み合わせることができます。 .sp それぞれのテーブルの型の違いは \fB/reference/tables\fP を参照してください。 .sp デフォルトのフラグは \fBTABLE_HASH_KEY\fP です。 .SS \fBkey_type\fP .sp キーの型を指定します。 .sp \fBflags\fP パラメーターに \fBTABLE_HASH_KEY\fP 、 \fBTABLE_PAT_KEY\fP または \fBTABLE_DAT_KEY\fP を指定した場合は、 \fBkey_type\fP オプションを指定する必要があります。 .sp 型の一覧は \fB/reference/types\fP にあります。 .sp デフォルト値はありません。 .SS \fBvalue_type\fP .sp 値の型を指定します。 .sp \fBflags\fP パラメーターに \fBTABLE_NO_KEY\fP 、 \fBTABLE_HASH_KEY\fP または \fBTABLE_PAT_KEY\fP を指定した場合は「値」を使うことができます。「値」の型は固定長でなければいけません。例えば、 \fBUInt32\fP は使えますが、 \fBShortText\fP は使えません。この場合は値ではなく、カラムを使ってください。 .sp デフォルト値はありません。 .SS \fBdefault_tokenizer\fP .sp デフォルトトークナイザーを指定します。これは、検索時とデータロード時に使われます。 .sp テーブルを全文検索インデックスの語彙表として使う場合は \fBdefault_tokenizer\fP を指定しなければいけません。利用可能なトークナイザーは \fB/reference/tokenizers\fP を参照してください。全文検索する場合はこのリストの中からトークナイザーを選んでください。 .sp 次の場合は \fBdefault_tokenizer\fP を指定する必要はありません。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 テーブルを語彙表として使わないとき。 .IP \(bu 2 テーブルを語彙表として使うが、全文検索をしないとき。例: .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 インデックス対象のデータが \fBInt32\fP や \fBTime\fP のようにテキストデータでないとき。 .IP \(bu 2 完全一致検索や前方一致検索などだけが必要なとき。 .UNINDENT .UNINDENT .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp \fBTABLE_NO_KEY\fP フラグと一緒に \fBdefault_tokenizer\fP を使うことはできません。これは、 \fBTABLE_NO_KEY\fP フラグを使っているテーブルは語彙表として使うことはできないからです。 .sp テーブルを語彙表として使いたいときは、 \fI\%flags\fP に \fBTABLE_HASH_KEY\fP 、 \fBTABLE_PAT_KEY\fP 、 \fBTABLE_DAT_KEY\fP のどれかを指定してください。 .sp デフォルト値はありません。 .SS \fBnormalizer\fP .sp キーを正規化するために使うノーマライザーを指定します。 .sp \fBTABLE_NO_KEY\fP はキーをサポートしていないので、 \fBTABLE_NO_KEY\fP と \fBnormalizer\fP を一緒に指定することはできません。 .sp ノーマライザーの一覧は \fB/reference/normalizers\fP にあります。 .sp デフォルト値はありません。 .SS \fBtoken_filters\fP .sp トークナイズされたトークンに所定の処理を行うために使うトークンフィルターを指定します。 .sp \fBTABLE_NO_KEY\fP はキーをサポートしていないので、 \fBTABLE_NO_KEY\fP と \fBtoken_filters\fP を一緒に指定することはできません。 .sp トークンフィルターの一覧は \fB/reference/token_filters\fP にあります。 .sp デフォルト値はありません。 .SS 戻り値 .sp \fBtable_create\fP が成功したときは以下のようにボディは \fBtrue\fP になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, true] .ft P .fi .UNINDENT .UNINDENT .sp \fBtable_create\fP が失敗すると、エラーの詳細は \fBHEADER\fP に含まれます。 .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/tables\fP .IP \(bu 2 \fB/reference/commands/column_create\fP .IP \(bu 2 \fB/reference/tokenizers\fP .IP \(bu 2 \fB/reference/normalizers\fP .IP \(bu 2 \fB/reference/command/output_format\fP .UNINDENT .SS \fBtable_list\fP .SS 概要 .sp table_list \- DBに定義されているテーブルをリスト表示 .sp Groonga組込コマンドの一つであるtable_listについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。 .sp table_listは、DBに定義されているテーブルのリストを表示します。 .SS 構文 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_list .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_list # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # "id", # "UInt32" # ], # [ # "name", # "ShortText" # ], # [ # "path", # "ShortText" # ], # [ # "flags", # "ShortText" # ], # [ # "domain", # "ShortText" # ], # [ # "range", # "ShortText" # ], # [ # "default_tokenizer", # "ShortText" # ], # [ # "normalizer", # "ShortText" # ] # ], # [ # 259, # "Ages", # "/tmp/groonga\-databases/commands_table_create.0000103", # "TABLE_DAT_KEY|PERSISTENT", # "UInt32", # null, # null, # null # ], # [ # 257, # "Lexicon", # "/tmp/groonga\-databases/commands_table_create.0000101", # "TABLE_PAT_KEY|PERSISTENT", # "ShortText", # null, # "TokenBigram", # "NormalizerAuto" # ], # [ # 256, # "Logs", # "/tmp/groonga\-databases/commands_table_create.0000100", # "TABLE_NO_KEY|PERSISTENT", # null, # null, # null, # null # ], # [ # 258, # "Tags", # "/tmp/groonga\-databases/commands_table_create.0000102", # "TABLE_HASH_KEY|PERSISTENT", # "ShortText", # null, # null, # null # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp ありません。 .SS 戻り値 .sp テーブル名一覧が以下の形式で返却されます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [[[テーブル情報名1,テーブル情報型1],...], テーブル情報1,...] .ft P .fi .UNINDENT .UNINDENT .sp \fBテーブル情報名n\fP .INDENT 0.0 .INDENT 3.5 \fBテーブル情報n\fP には複数の情報が含まれますが、そこに入る情報がどんな内容かを示す名前を出力します。 情報名は以下の通りです。 .sp \fBid\fP .INDENT 0.0 .INDENT 3.5 テーブルオブジェクトに割り当てられたID .UNINDENT .UNINDENT .sp \fBname\fP .INDENT 0.0 .INDENT 3.5 テーブル名 .UNINDENT .UNINDENT .sp \fBpath\fP .INDENT 0.0 .INDENT 3.5 テーブルのレコードを格納するファイル名 .UNINDENT .UNINDENT .sp \fBflags\fP .INDENT 0.0 .INDENT 3.5 テーブルのflags属性 .UNINDENT .UNINDENT .sp \fBdomain\fP .INDENT 0.0 .INDENT 3.5 主キー値の属する型 .UNINDENT .UNINDENT .sp \fBrange\fP .INDENT 0.0 .INDENT 3.5 valueが属する型 .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp \fBテーブル情報型n\fP .INDENT 0.0 .INDENT 3.5 テーブル情報の型を出力します。 .UNINDENT .UNINDENT .sp \fBテーブル情報n\fP .INDENT 0.0 .INDENT 3.5 \fBテーブル情報名n\fP で示された情報の配列を出力します。 情報の順序は \fBテーブル情報名n\fP の順序と同じです。 .UNINDENT .UNINDENT .SS \fBtable_remove\fP .SS 概要 .sp \fBtable_remove\fP はテーブルとそのカラムを削除します。もし、テーブルのキーあるいはそのテーブルのカラムにインデックスが張ってある場合はそれらも削除されます。 .SS 構文 .sp このコマンドの引数は1つで必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_remove name .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 削除したいテーブルの名前を指定するだけです。 \fBtable_remove\fP は指定されたテーブルとそのテーブルのカラムを削除します。もし、テーブルとそのテーブルのカラムにインデックスが張ってある場合は、張ってあるすべてのインデックスも削除します。 .sp このセクションでは次のことについて説明します。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 基本的な使い方 .IP \(bu 2 削除できないケース .IP \(bu 2 利用リソースの削減 .UNINDENT .UNINDENT .UNINDENT .SS 基本的な使い方 .sp 次のケースを考えてみましょう。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBEntries\fP というテーブルがあります。 .IP \(bu 2 \fBEntries\fP テーブルにはいくつかカラムがあります。 .IP \(bu 2 \fBEntries\fP テーブルのキーにはインデックスが張ってあります。 .IP \(bu 2 \fBEntries\fP のあるカラムにはインデックスが張ってあります。 .UNINDENT .UNINDENT .UNINDENT .sp 以下は \fBEntries\fP テーブルを作成するコマンドです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entries TABLE_HASH_KEY UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries title COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 以下は \fBEntries\fP テーブルのキーにインデックスを張るコマンドです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create EntryKeys TABLE_HASH_KEY UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create EntryKeys key_index COLUMN_INDEX Entries _key # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 以下は \fBEntries\fP テーブルのカラムにインデックスを張るコマンドです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Terms TABLE_PAT_KEY ShortText \e \-\-default_tokenizer TokenBigram \e \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms content_index COLUMN_INDEX Entries content # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fBtable_remove\fP を実行する前に現在のスキーマを確認しましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C dump # table_create Entries TABLE_HASH_KEY UInt32 # column_create Entries content COLUMN_SCALAR Text # column_create Entries title COLUMN_SCALAR ShortText # # table_create EntryKeys TABLE_HASH_KEY UInt32 # # table_create Terms TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # # column_create EntryKeys key_index COLUMN_INDEX Entries _key # column_create Terms content_index COLUMN_INDEX Entries content .ft P .fi .UNINDENT .UNINDENT .sp \fBEntries\fP テーブルを削除すると、次のテーブルとカラムが削除されます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBEntries\fP .IP \(bu 2 \fBEntries.title\fP .IP \(bu 2 \fBEntries.context\fP .IP \(bu 2 \fBEntryKeys.key_index\fP .IP \(bu 2 \fBTerms.content_index\fP .UNINDENT .UNINDENT .UNINDENT .sp 次のテーブル(語彙表)は削除されません。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBEntryKeys\fP .IP \(bu 2 \fBTerms\fP .UNINDENT .UNINDENT .UNINDENT .sp \fBtable_remove\fP を実行しましょう。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_remove Entries # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 以下が \fBtable_remove\fP 実行後のスキーマです。 \fBEntryKeys\fP と \fBTerms\fP だけが残っています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C dump # table_create EntryKeys TABLE_HASH_KEY UInt32 # # table_create Terms TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto .ft P .fi .UNINDENT .UNINDENT .SS 削除できないケース .sp 以下は削除できないケースです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 1つ以上のテーブルがこの削除対象のテーブルをキーの型として使っている。 .IP \(bu 2 1つ以上のカラムがこの削除対象のテーブルを値の型として使っている。 .UNINDENT .UNINDENT .UNINDENT .sp どちらのケースも参照先がなくなることを防ぎます。もし、削除対象のテーブルが型として参照されているままそのテーブルが削除されてしまうと、そのテーブルを参照しているテーブルとカラムは壊れてしまいます。 .sp もし、削除対象のテーブルがどれかの条件を満たしたら \fBtable_remove\fP は失敗します。削除対象のテーブルも削除対象のテーブルのカラムも削除されません。 .sp 以下は削除対象のテーブルがキーの型に使われるケースの例です。 .sp 次のコマンドは削除対象のテーブルとそのテーブルをキーの型として使うテーブルを作成します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create ReferencedByTable TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create ReferenceTable TABLE_HASH_KEY ReferencedByTable # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fBReferencedByTable\fP に対する \fBtable_remove\fP は失敗します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_remove ReferencedByTable # [ # [ # \-2, # 1337566253.89858, # 0.000355720520019531, # "[table][remove] a table that references the table exists: \-> ", # [ # [ # "is_removable_table", # "db.c", # 8480 # ] # ] # ], # false # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBReferencedByTable\fP を削除する前に \fBReferenceTable\fP を削除する必要があります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_remove ReferenceTable # [[0, 1337566253.89858, 0.000355720520019531], true] table_remove ReferencedByTable # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 以下は削除対象のテーブルが値の型に使われるケースの例です。 .sp 次のコマンドは削除対象のテーブルとそのテーブルを値の型として使うカラムを作成します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create ReferencedByColumn TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Table TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Table reference_column COLUMN_SCALAR ReferencedByColumn # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fBReferencedByColumn\fP に対する \fBtable_remove\fP は失敗します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_remove ReferencedByColumn # [ # [ # \-2, # 1337566253.89858, # 0.000355720520019531, # "[table][remove] a column that references the table exists: \-> ", # [ # [ # "is_removable_table", # "db.c", # 8500 # ] # ] # ], # false # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBReferencedByColumn\fP を削除する前に \fBTable.reference_column\fP を削除する必要があります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_remove Table reference_column # [[0, 1337566253.89858, 0.000355720520019531], true] table_remove ReferencedByColumn # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .SS 利用リソースの削減 .sp \fBtable_remove\fP は \fI\%削除できないケース\fP のチェックをするためにデータベース内のすべてのテーブルとカラムを開きます。 .sp もし、大量のテーブルとカラムがある場合、 \fBtable_remove\fP はたくさんのリソースを使うかもしれません。このケース用の回避策があります。 .sp \fBtable_remove\fP は最大スレッド数が \fB1\fP のときはチェック用に一時的に開いたテーブルとカラムを閉じます。 .sp \fBthread_limit\fP を使うと現在の最大スレッド数を確認・変更できます。 .sp この機能は次のケースでは使われます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entries TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] thread_limit 2 # [[0, 1337566253.89858, 0.000355720520019531], 1] table_remove Entries # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp この機能は次のケースでは使われません。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entries TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] thread_limit 2 # [[0, 1337566253.89858, 0.000355720520019531], 1] table_remove Entries # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションではすべての引数について説明します。 .SS 必須引数 .sp 1つだけ必須の引数があります。 .SS \fBname\fP .sp 削除するテーブルの名前を指定します。 .sp このパラメーターの使い方は \fI\%使い方\fP を参照してください。 .SS 戻り値 .sp このコマンドが成功したときは以下のようにボディは \fBtrue\fP になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, true] .ft P .fi .UNINDENT .UNINDENT .sp このコマンドが失敗すると、 \fBHEADER\fP にエラーの詳細が含まれます。 .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS \fBtable_rename\fP .SS 概要 .sp \fBtable_rename\fP コマンドはテーブル名を変更します。 .sp これは軽い操作です。名前とテーブルオブジェクト間の関係を変更するだけです。テーブルの値とテーブルのカラムの値をコピーしません。 .sp これは危険な操作です。 \fBtable_rename\fP を実行している間、読み取り操作を含むすべての操作を停止しなければいけません。以下のケースが起こった場合、Groongaプロセスはクラッシュするかもしれません。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 現在のテーブル名で名前を変更しようとしているテーブルにアクセスする操作(たとえば \fBselect\fP )を開始します。以降、現在のテーブル名を \fB古いテーブル名\fP と呼ぶことにします。これは、今、このテーブル名を変更しようとしているからです。 .IP \(bu 2 \fBtable_rename\fP を実行します。 \fBselect\fP は実行中です。 .IP \(bu 2 \fBselect\fP は古いテーブル名で、名前が変更されたテーブルにアクセスします。しかし、テーブルはすでに新しいテーブル名に変更されているため、 \fBselect\fP は古いテーブル名でテーブルを見つけることができません。このときGroongaプロセスがクラッシュするかもしれません。 .UNINDENT .UNINDENT .UNINDENT .SS 構文 .sp このコマンドには2つの引数があります。 .sp すべての引数は必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_rename name new_name .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 以下は \fBtable_rename\fP コマンドの簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Users TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Users score COLUMN_SCALAR Int32 # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Users [ {"_key": "Alice", "score": 2}, {"_key": "Bob", "score": 0}, {"_key": "Carlos", "score": \-1} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] table_rename Users Players # [[0, 1337566253.89858, 0.000355720520019531], true] table_list # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # "id", # "UInt32" # ], # [ # "name", # "ShortText" # ], # [ # "path", # "ShortText" # ], # [ # "flags", # "ShortText" # ], # [ # "domain", # "ShortText" # ], # [ # "range", # "ShortText" # ], # [ # "default_tokenizer", # "ShortText" # ], # [ # "normalizer", # "ShortText" # ] # ], # [ # 256, # "Players", # "/tmp/groonga\-databases/commands_table_rename.0000100", # "TABLE_PAT_KEY|PERSISTENT", # "ShortText", # null, # null, # null # ] # ] # ] select Players # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "score", # "Int32" # ] # ], # [ # 1, # "Alice", # 2 # ], # [ # 2, # "Bob", # 0 # ], # [ # 3, # "Carlos", # \-1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションでは \fBtable_rename\fP の引数について説明します。 .SS 必須引数 .sp すべての引数は必須です。 .SS \fBname\fP .sp 名前を変更するテーブルの名前を指定します。 .SS \fBnew_name\fP .sp 新しいテーブル名を指定します。 .SS 戻り値 .sp このコマンドが成功したときは以下のようにボディは \fBtrue\fP になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, true] .ft P .fi .UNINDENT .UNINDENT .sp このコマンドが失敗すると、 \fBHEADER\fP にエラーの詳細が含まれます。 .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS \fBtable_tokenize\fP .SS 概要 .sp \fBtable_tokenize\fP コマンドは指定したテーブルのトークナイザーでテキストをトークナイズします。 .SS 構文 .sp このコマンドにはたくさんの引数があります。 .sp \fBtable\fP と \fBstring\fP は必須の引数です。残りは省略できます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_tokenize table string [flags=NONE] [mode=GET] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C register token_filters/stop_word # [[0,0.0,0.0],true] table_create Terms TABLE_PAT_KEY ShortText \e \-\-default_tokenizer TokenBigram \e \-\-normalizer NormalizerAuto \e \-\-token_filters TokenFilterStopWord # [[0,0.0,0.0],true] column_create Terms is_stop_word COLUMN_SCALAR Bool # [[0,0.0,0.0],true] load \-\-table Terms [ {"_key": "and", "is_stop_word": true} ] # [[0,0.0,0.0],1] table_tokenize Terms "Hello and Good\-bye" \-\-mode GET # [ # [ # 0, # 0.0, # 0.0 # ], # [ # { # "value": "hello", # "position": 0 # }, # { # "value": "good", # "position": 2 # }, # { # "value": "\-", # "position": 3 # }, # { # "value": "bye", # "position": 4 # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBTerms\fP テーブルには、 \fBTokenBigram\fP トークナイザーと、 \fBNormalizerAuto\fP ノーマライザーと、 \fBTokenFilterStopWord\fP トークンフィルターがセットされています。 この例は \fBTokenBigram\fP トークナイザーで \fB"Hello and Good\-bye"\fP をトークナイズしたトークンを返します。トークンは、 \fBNormalizerAuto\fP ノーマライザーで正規化されています。 \fBand\fP トークンは、 \fBTokenFilterStopWord\fP トークンフィルターで除去されています。 .SS 引数 .sp このセクションではすべての引数について説明します。引数はカテゴリわけしています。 .SS 必須引数 .sp 必須の引数は2つです。 \fBtable\fP と \fBstring\fP です。 .SS \fBtable\fP .sp 語彙表テーブルを指定します。 \fBtable_tokenize\fP コマンドは、語彙表テーブルにセットされたトークナイザーとノーマライザーとトークンフィルターを使います。 .SS \fBstring\fP .sp トークナイズしたい文字列を指定します。 .sp 詳細は、 \fB/reference/commands/tokenize\fP の tokenize\-string オプションを参照してください。 .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBflags\fP .sp トークナイズ処理をカスタマイズするオプションを指定します。「 \fB|\fP 」で区切って複数のオプションを指定することができます。 .sp デフォルト値は \fBNONE\fP です。 .sp 詳細は、 \fB/reference/commands/tokenize\fP の tokenize\-flags オプションを参照してください。 .SS \fBmode\fP .sp トークナイズモードを指定します。 .sp デフォルト値は \fBGET\fP です。 .sp 詳細は、 \fB/reference/commands/tokenize\fP の tokenize\-mode オプションを参照してください。 .SS 戻り値 .sp \fBtable_tokenize\fP コマンドはトークナイズしたトークンを返します。 .sp 詳細は、 \fB/reference/commands/tokenize\fP の tokenize\-return\-value オプションを参照してください。 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/tokenizers\fP .IP \(bu 2 \fB/reference/commands/tokenize\fP .UNINDENT .SS \fBthread_limit\fP .SS 概要 .sp バージョン 5.0.7 で追加. .sp \fBthread_limit\fP は次の2つの機能を提供します。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 最大スレッド数を返します。 .IP \(bu 2 最大スレッド数を設定します。 .UNINDENT .UNINDENT .UNINDENT .sp \fB/reference/executables/groonga\fP は \fBthread_limit\fP のすべての機能を提供する唯一のGroongaサーバーです。 .sp \fB/reference/executables/groonga\-httpd\fP は最大スレッド数を返す機能だけをサポートしています。 \fB/reference/executables/groonga\-httpd\fP の最大スレッド数は常に1です。なぜなら、 \fB/reference/executables/groonga\-httpd\fP はシングルスレッドモデルを採用しているからです。 .sp Groongaをライブラリーとして使っている場合、 \fBgrn_thread_set_get_limit_func()\fP と \fBgrn_thread_set_set_limit_func()\fP でカスタム関数を設定しない限り動きません。 \fBgrn_thread_set_get_limit_func()\fP でカスタム関数を設定すると最大スレッド数を返す機能が動きます。 \fBgrn_thread_set_set_limit_func()\fP でカスタム関数を設定すると最大スレッド数を設定する機能が動きます。 .SS 構文 .sp このコマンドの引数は1つで省略できます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C thread_limit [max=null] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 引数なしで呼び出すと最大スレッド数を得られます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C thread_limit # [[0, 1337566253.89858, 0.000355720520019531], 2] .ft P .fi .UNINDENT .UNINDENT .sp \fB0\fP が返ってきたら、そのGroongaサーバーはこの機能をサポートしていないということです。 .sp \fBmax\fP 引数つきで呼び出すと最大スレッド数を設定できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C thread_limit \-\-max 4 # [[0, 1337566253.89858, 0.000355720520019531], 2] .ft P .fi .UNINDENT .UNINDENT .sp \fBmax\fP 引数を渡したときは設定前の最大スレッド数が返ります。 .SS 引数 .sp このセクションではすべての引数について説明します。 .SS 必須引数 .sp 必須の引数はありません。 .SS 省略可能引数 .sp 省略可能な引数が1つあります。 .SS \fBmax\fP .sp 新しい最大スレッド数を指定します。 .sp 正の整数を指定してください。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C thread_limit \-\-max 3 # [[0, 1337566253.89858, 0.000355720520019531], 4] .ft P .fi .UNINDENT .UNINDENT .sp \fBmax\fP 引数を指定した場合、 \fBthread_limit\fP は \fBmax\fP を適用する前の最大スレッド数を返します。 .SS 戻り値 .sp このコマンドのボディは最大スレッド数になります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, N_MAX_THREADS] .ft P .fi .UNINDENT .UNINDENT .sp \fBmax\fP を指定したときは \fBN_MAX_THREADS\fP は \fBmax\fP を適用する前の最大スレッド数になります。 .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS \fBtokenize\fP .SS 概要 .sp \fBtokenize\fP コマンドは指定したトークナイザーでテキストをトークナイズします。これはトークナイズ処理のデバッグに便利です。 .SS 構文 .sp このコマンドにはたくさんの引数があります。 .sp \fBtokenizer\fP と \fBstring\fP が必須の引数で、他の引数はすべて省略できます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize tokenizer string [normalizer=null] [flags=NONE] [mode=ADD] [token_filters=NONE] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "Fulltext Search" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "Fu" # }, # { # "position": 1, # "force_prefix": false, # "value": "ul" # }, # { # "position": 2, # "force_prefix": false, # "value": "ll" # }, # { # "position": 3, # "force_prefix": false, # "value": "lt" # }, # { # "position": 4, # "force_prefix": false, # "value": "te" # }, # { # "position": 5, # "force_prefix": false, # "value": "ex" # }, # { # "position": 6, # "force_prefix": false, # "value": "xt" # }, # { # "position": 7, # "force_prefix": false, # "value": "t " # }, # { # "position": 8, # "force_prefix": false, # "value": " S" # }, # { # "position": 9, # "force_prefix": false, # "value": "Se" # }, # { # "position": 10, # "force_prefix": false, # "value": "ea" # }, # { # "position": 11, # "force_prefix": false, # "value": "ar" # }, # { # "position": 12, # "force_prefix": false, # "value": "rc" # }, # { # "position": 13, # "force_prefix": false, # "value": "ch" # }, # { # "position": 14, # "force_prefix": false, # "value": "h" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この例では必須のパラメーターだけ使っています。 \fBtokenizer\fP には \fBTokenBigram\fP を、 \fBstring\fP には \fB"Fulltext Search"\fP を指定しています。この例は \fBTokenBigram\fP トークナイザーで \fB"Fulltext Search"\fP をトークナイズしたトークンを返します。この例では \fB"Fulltext Search"\fP を正規化していません。 .SS 引数 .sp このセクションではすべての引数について説明します。引数はカテゴリわけしています。 .SS 必須引数 .sp 必須引数は二つあります。 \fBtokenizer\fP と \fBstring\fP です。 .SS \fBtokenizer\fP .sp トークナイザー名を指定します。 \fBtokenize\fP コマンドは \fBtokenizer\fP で指定された名前のトークナイザーを使います。 .sp 組み込みのトークナイザーについては \fB/reference/tokenizers\fP を参照してください。 .sp 以下は組み込みの \fBTokenTrigram\fP トークナイザーを使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenTrigram "Fulltext Search" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "Ful" # }, # { # "position": 1, # "force_prefix": false, # "value": "ull" # }, # { # "position": 2, # "force_prefix": false, # "value": "llt" # }, # { # "position": 3, # "force_prefix": false, # "value": "lte" # }, # { # "position": 4, # "force_prefix": false, # "value": "tex" # }, # { # "position": 5, # "force_prefix": false, # "value": "ext" # }, # { # "position": 6, # "force_prefix": false, # "value": "xt " # }, # { # "position": 7, # "force_prefix": false, # "value": "t S" # }, # { # "position": 8, # "force_prefix": false, # "value": " Se" # }, # { # "position": 9, # "force_prefix": false, # "value": "Sea" # }, # { # "position": 10, # "force_prefix": false, # "value": "ear" # }, # { # "position": 11, # "force_prefix": false, # "value": "arc" # }, # { # "position": 12, # "force_prefix": false, # "value": "rch" # }, # { # "position": 13, # "force_prefix": false, # "value": "ch" # }, # { # "position": 14, # "force_prefix": false, # "value": "h" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 他のトークナイザーを使いたい場合は、 \fBregister\fP コマンドでトークナイザープラグインを登録する必要があります。例えば、 \fI\%KyTea\fP ベースのトークナイザーを \fBtokenizers/kytea\fP を登録することで使えます。 .SS \fBstring\fP .sp トークナイズしたい文字列を指定します。 .sp \fBstring\fP の中に文字列を含める場合は、シングルクォート( \fB\(aq\fP )またはダブルクォート( \fB"\fP )で \fBstring\fP をクォートする必要があります。 .sp \fBstring\fP の中で空白を使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "Groonga is a fast fulltext earch engine!" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "Gr" # }, # { # "position": 1, # "force_prefix": false, # "value": "ro" # }, # { # "position": 2, # "force_prefix": false, # "value": "oo" # }, # { # "position": 3, # "force_prefix": false, # "value": "on" # }, # { # "position": 4, # "force_prefix": false, # "value": "ng" # }, # { # "position": 5, # "force_prefix": false, # "value": "ga" # }, # { # "position": 6, # "force_prefix": false, # "value": "a " # }, # { # "position": 7, # "force_prefix": false, # "value": " i" # }, # { # "position": 8, # "force_prefix": false, # "value": "is" # }, # { # "position": 9, # "force_prefix": false, # "value": "s " # }, # { # "position": 10, # "force_prefix": false, # "value": " a" # }, # { # "position": 11, # "force_prefix": false, # "value": "a " # }, # { # "position": 12, # "force_prefix": false, # "value": " f" # }, # { # "position": 13, # "force_prefix": false, # "value": "fa" # }, # { # "position": 14, # "force_prefix": false, # "value": "as" # }, # { # "position": 15, # "force_prefix": false, # "value": "st" # }, # { # "position": 16, # "force_prefix": false, # "value": "t " # }, # { # "position": 17, # "force_prefix": false, # "value": " f" # }, # { # "position": 18, # "force_prefix": false, # "value": "fu" # }, # { # "position": 19, # "force_prefix": false, # "value": "ul" # }, # { # "position": 20, # "force_prefix": false, # "value": "ll" # }, # { # "position": 21, # "force_prefix": false, # "value": "lt" # }, # { # "position": 22, # "force_prefix": false, # "value": "te" # }, # { # "position": 23, # "force_prefix": false, # "value": "ex" # }, # { # "position": 24, # "force_prefix": false, # "value": "xt" # }, # { # "position": 25, # "force_prefix": false, # "value": "t " # }, # { # "position": 26, # "force_prefix": false, # "value": " e" # }, # { # "position": 27, # "force_prefix": false, # "value": "ea" # }, # { # "position": 28, # "force_prefix": false, # "value": "ar" # }, # { # "position": 29, # "force_prefix": false, # "value": "rc" # }, # { # "position": 30, # "force_prefix": false, # "value": "ch" # }, # { # "position": 31, # "force_prefix": false, # "value": "h " # }, # { # "position": 32, # "force_prefix": false, # "value": " e" # }, # { # "position": 33, # "force_prefix": false, # "value": "en" # }, # { # "position": 34, # "force_prefix": false, # "value": "ng" # }, # { # "position": 35, # "force_prefix": false, # "value": "gi" # }, # { # "position": 36, # "force_prefix": false, # "value": "in" # }, # { # "position": 37, # "force_prefix": false, # "value": "ne" # }, # { # "position": 38, # "force_prefix": false, # "value": "e!" # }, # { # "position": 39, # "force_prefix": false, # "value": "!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBnormalizer\fP .sp ノーマライザー名を指定します。 \fBtokenize\fP コマンドは \fBnormalizer\fP という名前のノーマライザーを使います。ノーマライザーは \fBTokenBigrma\fP など、N\-gram関連のトークナイザーにとってとても重要です。 .sp ノーマライザーはノーマライズ中にそれぞれの文字の種類を検出します。N\-gram系のトークナイザーはトークナイズ中に文字の種類を利用します。 .sp 以下はノーマライザーを使わない例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "Fulltext Search" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "Fu" # }, # { # "position": 1, # "force_prefix": false, # "value": "ul" # }, # { # "position": 2, # "force_prefix": false, # "value": "ll" # }, # { # "position": 3, # "force_prefix": false, # "value": "lt" # }, # { # "position": 4, # "force_prefix": false, # "value": "te" # }, # { # "position": 5, # "force_prefix": false, # "value": "ex" # }, # { # "position": 6, # "force_prefix": false, # "value": "xt" # }, # { # "position": 7, # "force_prefix": false, # "value": "t " # }, # { # "position": 8, # "force_prefix": false, # "value": " S" # }, # { # "position": 9, # "force_prefix": false, # "value": "Se" # }, # { # "position": 10, # "force_prefix": false, # "value": "ea" # }, # { # "position": 11, # "force_prefix": false, # "value": "ar" # }, # { # "position": 12, # "force_prefix": false, # "value": "rc" # }, # { # "position": 13, # "force_prefix": false, # "value": "ch" # }, # { # "position": 14, # "force_prefix": false, # "value": "h" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp すべてのアルファベットが2文字ごとトークナイズされています。例えば、 \fBFu\fP で1つのトークンになっています。 .sp 以下はノーマライザーを使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "Fulltext Search" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "fulltext" # }, # { # "position": 1, # "force_prefix": false, # "value": "search" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 連続するアルファベットが1つのトークンにトークナイズされています。例えば、 \fBfulltext\fP で1つのトークンになっています。 .sp ノーマライザーを使いながら2文字でトークナイズしたい場合は \fBTokenBigramSplitSymbolAlpha\fP を使って下さい。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigramSplitSymbolAlpha "Fulltext Search" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "fu" # }, # { # "position": 1, # "force_prefix": false, # "value": "ul" # }, # { # "position": 2, # "force_prefix": false, # "value": "ll" # }, # { # "position": 3, # "force_prefix": false, # "value": "lt" # }, # { # "position": 4, # "force_prefix": false, # "value": "te" # }, # { # "position": 5, # "force_prefix": false, # "value": "ex" # }, # { # "position": 6, # "force_prefix": false, # "value": "xt" # }, # { # "position": 7, # "force_prefix": false, # "value": "t" # }, # { # "position": 8, # "force_prefix": false, # "value": "se" # }, # { # "position": 9, # "force_prefix": false, # "value": "ea" # }, # { # "position": 10, # "force_prefix": false, # "value": "ar" # }, # { # "position": 11, # "force_prefix": false, # "value": "rc" # }, # { # "position": 12, # "force_prefix": false, # "value": "ch" # }, # { # "position": 13, # "force_prefix": false, # "value": "h" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp すべてのアルファベットが2文字ごとにトークナイズされています。そして、すべての文字が小文字にノーマライズされています。例えば、 \fBfu\fP で1つのトークンになっています。 .SS \fBflags\fP .sp トークナイズ処理をカスタマイズするオプションを指定します。「 \fB|\fP 」で区切って複数のオプションを指定することができます。例えば、 \fBNONE|ENABLE_TOKENIZED_DELIMITER\fP というように指定できます。 .sp 指定可能なフラグは以下の通りです。 .TS center; |l|l|. _ T{ フラグ T} T{ 説明 T} _ T{ \fBNONE\fP T} T{ 無視されます。 T} _ T{ \fBENABLE_TOKENIZED_DELIMITER\fP T} T{ トークナイズ済み区切り文字を有効にします。トークナイズ済み区切り文字の詳細は \fB/reference/tokenizers\fP を参照してください。 T} _ .TE .sp 以下は \fBENABLE_TOKENIZED_DELIMITER\fP を使った例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenDelimit "Full￾text Sea￾crch" NormalizerAuto ENABLE_TOKENIZED_DELIMITER # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "full" # }, # { # "position": 1, # "force_prefix": false, # "value": "text sea" # }, # { # "position": 2, # "force_prefix": false, # "value": "crch" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBTokenDelimit\fP トークナイザーはトークナイズ済み区切り文字をサポートしているトークナイザーの1つです。 \fBENABLE_TOKENIZED_DELIMITER\fP でトークナイズ済み区切り文字を有効に出来ます。トークナイズ済み区切り文字はトークンの区切りを表す特別な文字です。この文字は \fBU+FFFE\fP です。この文字コードはどの文字にも割り当てられていません。つまり、通常の文字列にはこの文字は現れません。よって、トークンの区切りを表すという目的には適切な文字です。 \fBENABLE_TOKENIZED_DELIMITER\fP が有効のときは、対象文字列はすでにトークナイズ済みであると扱われます。トークナイザーは単にトークナイズ済み区切り文字で区切ってトークナイズします。 .SS \fBmode\fP .sp トークナイズモードを指定します。 \fBADD\fP を指定すると、ドキュメント追加時と同じルールでトークナイズされます。 \fBGET\fP を指定すると、ドキュメント検索時と同じルールでトークナイズされます。省略された場合、 \fBADD\fP モードでトークナイズされます。 .sp デフォルトのモードは \fBADD\fP です。 .sp 以下は \fBADD\fP モードの例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "Fulltext Search" \-\-mode ADD # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "Fu" # }, # { # "position": 1, # "force_prefix": false, # "value": "ul" # }, # { # "position": 2, # "force_prefix": false, # "value": "ll" # }, # { # "position": 3, # "force_prefix": false, # "value": "lt" # }, # { # "position": 4, # "force_prefix": false, # "value": "te" # }, # { # "position": 5, # "force_prefix": false, # "value": "ex" # }, # { # "position": 6, # "force_prefix": false, # "value": "xt" # }, # { # "position": 7, # "force_prefix": false, # "value": "t " # }, # { # "position": 8, # "force_prefix": false, # "value": " S" # }, # { # "position": 9, # "force_prefix": false, # "value": "Se" # }, # { # "position": 10, # "force_prefix": false, # "value": "ea" # }, # { # "position": 11, # "force_prefix": false, # "value": "ar" # }, # { # "position": 12, # "force_prefix": false, # "value": "rc" # }, # { # "position": 13, # "force_prefix": false, # "value": "ch" # }, # { # "position": 14, # "force_prefix": false, # "value": "h" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 最後のアルファベットは1文字でトークナイズされています。 .sp 以下は \fBGET\fP モードの例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "Fulltext Search" \-\-mode GET # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "Fu" # }, # { # "position": 1, # "force_prefix": false, # "value": "ul" # }, # { # "position": 2, # "force_prefix": false, # "value": "ll" # }, # { # "position": 3, # "force_prefix": false, # "value": "lt" # }, # { # "position": 4, # "force_prefix": false, # "value": "te" # }, # { # "position": 5, # "force_prefix": false, # "value": "ex" # }, # { # "position": 6, # "force_prefix": false, # "value": "xt" # }, # { # "position": 7, # "force_prefix": false, # "value": "t " # }, # { # "position": 8, # "force_prefix": false, # "value": " S" # }, # { # "position": 9, # "force_prefix": false, # "value": "Se" # }, # { # "position": 10, # "force_prefix": false, # "value": "ea" # }, # { # "position": 11, # "force_prefix": false, # "value": "ar" # }, # { # "position": 12, # "force_prefix": false, # "value": "rc" # }, # { # "position": 13, # "force_prefix": false, # "value": "ch" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 最後のアルファベットは2文字でトークナイズされています。 .SS \fBtoken_filters\fP .sp トークンフィルターを指定します。 \fBtokenize\fP コマンドは \fBtoken_filters\fP という名前のトークンフィルターを使います。 .sp トークンフィルターについては \fB/reference/token_filters\fP を参照してください。 .SS 戻り値 .sp \fBtokenize\fP コマンドはトークナイズしたトークンをすべて返します。各トークンはトークン自身の文字列情報以外にいくつかの属性を持ちます。属性は今後増えていく可能性があります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, tokens] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBtokens\fP .INDENT 0.0 .INDENT 3.5 \fBtokens\fP はトークンの配列です。トークンは以下の属性を持ったオブジェクトです。 .TS center; |l|l|. _ T{ 名前 T} T{ 説明 T} _ T{ \fBvalue\fP T} T{ トークン自身 T} _ T{ \fBposition\fP T} T{ N番目のトークン。 T} _ .TE .UNINDENT .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/tokenizers\fP .UNINDENT .SS \fBtokenizer_list\fP .SS 概要 .sp \fBtokenizer_list\fP コマンドはデータベースに登録されているトークナイザーの一覧を返します。 .SS 構文 .sp このコマンドに引数はありません: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenizer_list .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenizer_list # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "name": "TokenMecab" # }, # { # "name": "TokenDelimit" # }, # { # "name": "TokenUnigram" # }, # { # "name": "TokenBigram" # }, # { # "name": "TokenTrigram" # }, # { # "name": "TokenBigramSplitSymbol" # }, # { # "name": "TokenBigramSplitSymbolAlpha" # }, # { # "name": "TokenBigramSplitSymbolAlphaDigit" # }, # { # "name": "TokenBigramIgnoreBlank" # }, # { # "name": "TokenBigramIgnoreBlankSplitSymbol" # }, # { # "name": "TokenBigramIgnoreBlankSplitSymbolAlpha" # }, # { # "name": "TokenBigramIgnoreBlankSplitSymbolAlphaDigit" # }, # { # "name": "TokenDelimitNull" # }, # { # "name": "TokenRegexp" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp データベースに登録されているトークナイザーの一覧を返します。 .SS 戻り値 .sp \fBtokenizer_list\fP コマンドはトークナイザーの一覧を返します。各トークナイザーは属性を持っています。例えば名前です。将来、属性は増えるかもしれません。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, tokenizers] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBtokenizers\fP .INDENT 0.0 .INDENT 3.5 \fBtokenizers\fP はトークナイザーの配列です。トークナイザーは次の属性を持つオブジェクトです。 .TS center; |l|l|. _ T{ 名前 T} T{ 説明 T} _ T{ \fBname\fP T} T{ トークナイザー名。 T} _ .TE .UNINDENT .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/tokenizers\fP .IP \(bu 2 \fB/reference/commands/tokenize\fP .UNINDENT .SS \fBtruncate\fP .SS 概要 .sp \fBtruncate\fP コマンドは指定したテーブルのレコードをすべて削除します。カラムを指定した場合はカラムの値をすべて削除します。 .SS 構文 .sp このコマンドの引数は1つで必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C truncate target_name .ft P .fi .UNINDENT .UNINDENT .sp バージョン 4.0.9 で追加: \fBtarget_name\fP parameter can be used since 4.0.9. You need to use \fBtable\fP parameter for 4.0.8 or earlier. .sp For backward compatibility, \fBtruncate\fP command accepts \fBtable\fP parameter. But it should not be used for newly written code. .SS 使い方 .sp 以下はテーブルに対して \fBtruncate\fP コマンドを実行する簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Users TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Users score COLUMN_SCALAR Int32 # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Users [ {"_key": "Alice", "score": 2}, {"_key": "Bob", "score": 0}, {"_key": "Carlos", "score": \-1} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] select Users # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "score", # "Int32" # ] # ], # [ # 1, # "Alice", # 2 # ], # [ # 2, # "Bob", # 0 # ], # [ # 3, # "Carlos", # \-1 # ] # ] # ] # ] truncate Users # [[0, 1337566253.89858, 0.000355720520019531], true] select Users # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 0 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "score", # "Int32" # ] # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 以下はカラムに対して \fBtruncate\fP コマンドを実行する簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Users TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Users score COLUMN_SCALAR Int32 # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Users [ {"_key": "Alice", "score": 2}, {"_key": "Bob", "score": 0}, {"_key": "Carlos", "score": \-1} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] select Users # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "score", # "Int32" # ] # ], # [ # 1, # "Alice", # 2 # ], # [ # 2, # "Bob", # 0 # ], # [ # 3, # "Carlos", # \-1 # ] # ] # ] # ] truncate Users.score # [[0, 1337566253.89858, 0.000355720520019531], true] select Users # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "score", # "Int32" # ] # ], # [ # 1, # "Alice", # 0 # ], # [ # 2, # "Bob", # 0 # ], # [ # 3, # "Carlos", # 0 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションでは \fBtruncate\fP の引数について説明します。 .SS 必須引数 .sp \fBtarget_name\fP だけが必須の引数です。 .SS \fBtarget_name\fP .sp テーブル名またはカラム名を指定します。 .SS 戻り値 .sp \fBtruncate\fP command returns whether truncation is succeeded or not: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, SUCCEEDED_OR_NOT] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP .INDENT 0.0 .INDENT 3.5 \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .UNINDENT .UNINDENT .sp \fBSUCCEEDED_OR_NOT\fP .INDENT 0.0 .INDENT 3.5 コマンドの実行が成功するとtrueを返します。失敗するとエラーとしてfalseを返します。 .UNINDENT .UNINDENT .SS データ型 .SS 名前 .sp Groonga データ型 .SS 説明 .sp Groonga は、格納するデータの型を区別します。 .sp Groongaのデータベースでは、テーブルの主キーや、カラムの値はいずれも何らかの型に属します。また通常は、一つのテーブルの中の全てのレコードについて、カラムの値は共通となります。 .sp 主キーの型とカラムの型には、Groongaで予め定義済みの型か、ユーザが定義する型、またはユーザが定義したテーブルを指定することができます。 .sp 主キーの型に他のテーブルを指定する場合は、そのテーブルは、主キーの型となるテーブルのサブセットとなります。 .sp カラムの型に他のテーブルを指定する場合は、そのカラムは、カラムの型となるテーブルの参照キーとなります。 .SS 組込型 .sp 以下の型が組込型としてあらかじめ定義されています。 .SS \fBBool\fP .sp ブーリアン型やブール型などと呼ばれる型であり、真偽値を表します。取り得る値はtrueとfalseです。(デフォルト値: false) .sp \fB/reference/commands/load\fP コマンドで値を格納するときは、false、0、空文字列のいずれかを指定するとfalseになり、それ以外を指定するとtrueになります。 .SS \fBInt8\fP .sp 8bit符号付き整数であり、\-128以上127以下の整数を表します。(デフォルト値: 0) .SS \fBUInt8\fP .sp 8bit符号なし整数であり、0以上255以下の整数を表します。(デフォルト値: 0) .SS \fBInt16\fP .sp 16bit符号付き整数であり、\-32,768以上32,767以下の整数を表します。(デフォルト値: 0) .SS \fBUInt16\fP .sp 16bit符号なし整数であり、0以上65,535以下の整数を表します。(デフォルト値: 0) .SS \fBInt32\fP .sp 32bit符号付き整数であり、\-2,147,483,648以上2,147,483,647以下の整数を表します。(デフォルト値: 0) .SS \fBUInt32\fP .sp 32bit符号なし整数であり、0以上4,294,967,295以下の整数を表します。(デフォルト値: 0) .SS \fBInt64\fP .sp 64bit符号付き整数であり、\-9,223,372,036,854,775,808以上9,223,372,036,854,775,807以下の整数を表します。(デフォルト値: 0) .SS \fBUInt64\fP .sp 64bit符号なし整数であり、0以上18,446,744,073,709,551,615以下の整数を表します。(デフォルト値: 0) .SS \fBFloat\fP .sp IEEE 754形式の倍精度浮動小数点数であり、実数を表します。(デフォルト値: 0.0) .sp IEEE 754形式の詳細については、 \fI\%IEEE 754 \- Wikipedia\fP や \fI\%IEEE 754: Standard for Binary Floating\-Point\fP を参照してください。 .SS \fBTime\fP .sp 日時を表す型であり、1970年1月1日0時0分0秒からの経過時間を、マイクロ秒単位で64bit符号付き整数により表現します。(デフォルト値: 0) .sp \fB/reference/commands/load\fP コマンドで値を格納するときは、1970年1月1日0時0分0秒からの経過秒数を指定します。秒単位より詳細な日時を指定するには、小数を使います。 .SS \fBShortText\fP .sp 4,095バイト以下の文字列を表します。(デフォルト値: "") .SS \fBText\fP .sp 65,535バイト以下の文字列を表します。(デフォルト値: "") .SS \fBLongText\fP .sp 2,147,483,647バイト以下の文字列を表します。(デフォルト値: "") .SS \fBTokyoGeoPoint\fP .sp 旧日本測地系による経緯度であり、経度と緯度をミリ秒単位で表現した整数の組により表現します。(デフォルト値: 0x0) .sp 度分秒形式でx度y分z秒となる経度・緯度は、(((x * 60) + y) * 60 + z) * 1000という計算式でミリ秒単位へと変換されます。 .sp \fB/reference/commands/load\fP コマンドで値を格納するときは、"ミリ秒単位の経度xミリ秒単位の緯度" もしくは "経度の小数表記x緯度の小数表記" という文字列表現を使って指定します。経度と緯度の区切りとしては、\(aqx\(aq のほかに \(aq,\(aq を使うことができます。 .sp 測地系の詳細については、 \fI\%測地系 \- Wikipedia\fP を参照してください。 .SS \fBWGS84GeoPoint\fP .sp 世界測地系(World Geodetic System, WGS 84)による経緯度であり、経度と緯度をミリ秒単位で表現した整数の組により表現します。(デフォルト値: 0x0) .sp 度分秒形式からミリ秒形式への変換方法や \fB/reference/commands/load\fP コマンドにおける指定方法はTokyoGeoPointと同じです。 .SS 型に関する制限事項 .SS テーブルの主キーに指定できない型 .sp Text型とLongText型については、テーブルの主キーに指定することはできません。 .SS ベクターとして格納できない型 .sp Groongaのカラムは、ある型のベクターを保存することができます。しかし、ShortText, Text, LongTextの3つの型についてはベクターとして保存したり出力したりすることはできますが、検索条件やドリルダウン条件に指定することができません。 .sp テーブル型は、ベクターとして格納することができます。よって、ShortTextのベクターを検索条件やドリルダウン条件に使用したい場合には、主キーがShortText型のテーブルを別途作成し、そのテーブルを型として利用します。 .SS テーブル .SS 概要 .sp GroongaのテーブルはIDとキーの対応を管理します。Groongaは4つの種類のテーブルを提供しています。 \fBTABLE_NO_KEY\fP 、 \fBTABLE_HASH_KEY\fP 、 \fBTABLE_PAT_KEY\fP 、 \fBTABLE_DAT_KEY\fP です。 .sp \fBTABLE_NO_KEY\fP 以外のすべてのテーブルは高速なキー→ID検索とID→キー検索の両方をサポートしています。 \fBTABLE_NO_KEY\fP はキーをサポートしていません。 \fBTABLE_NO_KEY\fP はIDだけを管理します。そのため、 \fBTABLE_NO_KEY\fP はID検索もキー検索もサポートしていません。 .SS 特徴 .sp 以下はGroongaにあるすべてのテーブルの特性表です。(この表の中では \fBTABLE_\fP プレフィックスは省略しています。) .TS center; |l|l|l|l|l|. _ T{ T} T{ \fBNO_KEY\fP T} T{ \fBHASH_KEY\fP T} T{ \fBPAT_KEY\fP T} T{ \fBDAT_KEY\fP T} _ T{ データ構造 T} T{ 配列 T} T{ ハッシュテーブル T} T{ パトリシアトライ T} T{ ダブル配列トライ T} _ T{ IDサポート T} T{ o T} T{ o T} T{ o T} T{ o T} _ T{ キーサポート T} T{ x T} T{ o T} T{ o T} T{ o T} _ T{ バリューサポート T} T{ o T} T{ o T} T{ o T} T{ x T} _ T{ キー→ID検索速度 .INDENT 0.0 .IP \(bu 2 o: 速い .IP \(bu 2 x: 遅い .UNINDENT T} T{ \- T} T{ oo T} T{ x T} T{ o T} _ T{ 更新速度 .INDENT 0.0 .IP \(bu 2 o: 速い .IP \(bu 2 x: 遅い .UNINDENT T} T{ ooo T} T{ o T} T{ o T} T{ x T} _ T{ サイズ .INDENT 0.0 .IP \(bu 2 o: 小さい .IP \(bu 2 x: 大きい .UNINDENT T} T{ ooo T} T{ o T} T{ oo T} T{ x T} _ T{ キー変更 T} T{ \- T} T{ x T} T{ x T} T{ o T} _ T{ 共通接頭辞検索 T} T{ \- T} T{ x T} T{ o T} T{ o T} _ T{ 前方一致検索 T} T{ \- T} T{ x T} T{ o T} T{ o T} _ T{ 範囲検索 T} T{ \- T} T{ x T} T{ o T} T{ o T} _ .TE .SS \fBTABLE_NO_KEY\fP .sp \fBTABLE_NO_KEY\fP はとても高速でとても小さいのですが、キーをサポートしていません。キーをサポートしていないテーブルは \fBTABLE_NO_KEY\fP だけです。 .sp \fBTABLE_NO_KEY\fP を全文検索用の語彙表として使うことはできません。これは、語彙表はトークンをキーとして保存する必要があるからです。 \fBTABLE_NO_KEY\fP はログのようにキーのないレコードを管理するテーブルとして有用です。 .SS \fBTABLE_HASH_KEY\fP .sp \fBTABLE_HASH_KEY\fP は高速ですが、共通接頭辞検索や前方一致検索といった高度な検索機能をサポートしていません。 .sp \fBTABLE_HASH_KEY\fP はタグ検索のように完全一致検索用のインデックスとして有用です。 .SS \fBTABLE_PAT_KEY\fP .sp \fBTABLE_PAT_KEY\fP は、小さく、高度な検索機能もサポートしています。 .sp \fBTABLE_PAT_KEY\fP は全文検索用の語彙表としても有用ですし、範囲検索用のインデックスとしても有用です。 .SS \fBTABLE_DAT_KEY\fP .sp \fBTABLE_DAT_KEY\fP は高速でキーの更新もサポートしていますが、サイズが大きいです。大量のレコードを保存する用途には向いていません。キーの更新をサポートしているテーブルは \fBTABLE_DAT_KEY\fP だけです。 .sp \fBTABLE_DAT_KEY\fP はGroongaのデータベース内で使われています。Groongaのデータベースは \fBShortText\fP や \fBTokenBigram\fP 、テーブル名などオブジェクトの名前をオブジェクトのIDに変換する必要があります。さらに、Groongaのデータベースはオブジェクト名の変更もサポートする必要があります。これらの機能は \fBTABLE_DAT_KEY\fP で実現されています。オブジェクト数は小さいので \fBTABLE_DAT_KEY\fP のサイズが大きいというデメリットは無視できます。 .SS レコードID .sp レコードIDは自動的に割り当てられます。明示的に割り当てるレコードIDを指定することはできません。 .sp 削除されたレコードのレコードIDは再利用される可能性があります。 .sp 妥当なレコードIDの範囲は1から268435455までです。(1も268435455も妥当なIDです。) .SS 永続テーブルと一時テーブル .sp テーブルは永続テーブルまたは一時テーブルです。 .SS 永続テーブル .sp 永続テーブルは名前がついていてデータベースに登録されています。永続テーブルの中のレコードはテーブルやデータベースを閉じた後でも消えません。 .sp 永続テーブルは \fB/reference/commands/table_create\fP コマンドで作成します。 .SS 一時テーブル .sp 一時テーブルには名前がありません。一時テーブルのレコードはテーブルを閉じると削除されます。一時テーブルは検索結果やソート結果、グループ(ドリルダウン)結果などを格納するために使われています。検索結果とグループ結果には \fBTABLE_HASH_KEY\fP が使われています。ソート結果には \fBTABLE_NO_KEY\fP が使われています。 .SS 制限 .sp 最大レコード数は268435455です。1つのテーブルに268435456以上のレコードを追加できません。 .sp 最大キーサイズは4096バイトです。4097バイト以上の大きいキーは使うことができません。4097バイト以上の大きなサイズのデータはキーではなくカラムに保存してください。 \fBText\fP と \fBLargeText\fP 型は4097バイト以上の大きさのサイズのデータをサポートしています。 .sp キーサイズの合計の最大値は4GiBです。キーサイズの合計が4GiBを超える場合は、テーブルを分割したり、データベースを分割したり(シャーディング)、それぞれのキーのサイズを減らしてください。 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/commands/table_create\fP .UNINDENT .SS カラム .sp カラムはデータストアオブジェクトまたは高速な検索のための転置索引オブジェクトです。 .sp カラムは必ず1つのテーブルに属します。テーブルは0個以上のカラムを持ちます。 .sp データストアカラムもインデックスカラムもどちらも型を持ちます。データストアカラムの型は値域を指定します。言い換えると、データストアカラムの型は「値の型」です。インデックスカラムの型はインデックス対象のドキュメント集合を指定します。Groongaではテーブルがドキュメント集合になります。よって、インデックスカラムの型はテーブルにしなければいけません。 .sp 以下がデータストアカラムです。 .SS スカラーカラム .SS 概要 .sp TODO .SS 使い方 .sp TODO .SS ベクターカラム .SS 概要 .sp ベクターカラムはデータストアオブジェクトです。ベクターカラムは0個以上のスカラー値を保存できます。ざっくり言うと、スカラー値とは数値や文字列といった1つの値のことです。スカラー値の詳細は \fBscalar\fP を参照してください。 .sp ベクターカラムのユースケースの1つはタグの保存です。ベクターカラムを使うとタグの値を複数保存できます。 .sp スカラーカラムと同じように、ベクターカラムもインデックスを使って検索できます。各要素に重みをつけることもできます。1以上の重みがついた要素がマッチすると、重みがついていない場合よりも大きなスコアがつきます。これはベクターカラム特有の機能です。重みも保存できるベクターカラムのことは重み付きベクターカラムと呼びます。 .sp 各要素がテキストなら、各要素に対して全文検索することもできます。しかし、重みを使った場合は検索スコアが高くなりすぎることに注意してください。重み付きベクターカラムに対して全文検索をするときは注意してください。 .SS 使い方 .sp ベクターカラムには3種類あります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 ノーマルベクターカラム .IP \(bu 2 参照型ベクターカラム .IP \(bu 2 重み付きベクターカラム .UNINDENT .UNINDENT .UNINDENT .sp このセクションではこれらの種類の使い方について説明します。 .SS ノーマルベクターカラム .sp ノーマルベクターカラムは0個以上のスカラーデータを保存します。スカラーデータとは、例えば、数値や文字列です。 .sp ノーマルベクターカラムは同じ型の要素だけを保存できます。型を混ぜることはできません。例えば、同じノーマルベクターカラムに数値と文字列を保存できません。 .sp ノーマルベクターカラムは、1つのレコードが、1つのキーに対して複数の値を持っているときに便利です。タグは一番よくあるユースケースです。 .SS 作り方 .sp ノーマルベクターカラムを作るためには \fB/reference/commands/column_create\fP コマンドを使います。ポイントは \fBCOLUMN_VECTOR\fP フラグです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Bookmarks TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Bookmarks tags COLUMN_VECTOR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 1つのブックマークに0個以上のタグを設定できます。 .SS ロード方法 .sp JSONの配列構文で指定してベクターデータをロードします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ELEMENT1, ELEMENT2, ELEMENT3, ...] .ft P .fi .UNINDENT .UNINDENT .sp 以下のデータをロードしましょう。 .TS center; |l|l|. _ T{ \fB_key\fP T} T{ \fBtags\fP T} _ T{ \fBhttp://groonga.org/\fP T} T{ \fB["groonga"]\fP T} _ T{ \fBhttp://mroonga.org/\fP T} T{ \fB["mroonga", "mysql", "groonga"]\fP T} _ T{ \fBhttp://ranguba.org/\fP T} T{ \fB["ruby", "groonga"]\fP T} _ .TE .sp 以下がデータをロードするコマンドです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Bookmarks [ {"_key": "http://groonga.org/", "tags": ["groonga"]}, {"_key": "http://mroonga.org/", "tags": ["mroonga", "mysql", "groonga"]}, {"_key": "http://ranguba.org/", "tags": ["ruby", "groonga"]} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] .ft P .fi .UNINDENT .UNINDENT .sp ロードしたデータはJSONの配列構文で出力されます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Bookmarks # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "tags", # "ShortText" # ] # ], # [ # 1, # "http://groonga.org/", # [ # "groonga" # ] # ], # [ # 2, # "http://mroonga.org/", # [ # "mroonga", # "mysql", # "groonga" # ] # ], # [ # 3, # "http://ranguba.org/", # [ # "ruby", # "groonga" # ] # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 検索方法 .sp ノーマルベクターカラムを検索するにはインデックスを作る必要があります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Tags TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Tags bookmark_index COLUMN_INDEX Bookmarks tags # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp ベクターカラム固有の方法はありません。スカラーカラムにインデックスを作る方法と同じです。 .sp 全文検索と同じ構文で \fBtags\fP 内の要素を検索できます。 .sp select\-match\-columns と select\-query を使った場合: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Bookmarks \-\-match_columns tags \-\-query mysql \-\-output_columns _key,tags,_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "tags", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "http://mroonga.org/", # [ # "mroonga", # "mysql", # "groonga" # ], # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp select\-match\-columns の中で重みを使うこともできます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Bookmarks \-\-match_columns \(aqtags * 3\(aq \-\-query mysql \-\-output_columns _key,tags,_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "tags", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "http://mroonga.org/", # [ # "mroonga", # "mysql", # "groonga" # ], # 3 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp select\-filter を使った場合: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Bookmarks \-\-filter \(aqtags @ "msyql"\(aq \-\-output_columns _key,tags,_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 0 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "tags", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 参照型ベクターカラム .sp TODO .sp Reference vector column is space\-efficient if there are many same value elements. Reference vector column keeps reference record IDs not value itself. Record ID is smaller than value itself. .SS 作り方 .sp TODO .SS ロード方法 .sp TODO .SS 検索方法 .sp TODO .SS 重み付きベクターカラム .sp 重み付きベクターカラムはノーマルベクターカラムに似ています。複数の要素を保存できます。さらに、要素の重みも保存できます。重みとはその要素の重要度です。 .sp 重みは正の整数です。デフォルトの重みは \fB0\fP です。これは重みがないという意味になります。 .sp 重みが1以上なら、検索スコアーに重みが加算されます。重みが \fB0\fP なら検索スコアーは \fB1\fP です。重みが \fB10\fP なら検索スコアーは \fB11\fP ( \fB= 1 + 10\fP )です。 .sp 重み付きベクターカラムは検索スコアーのチューニングに便利です。 select\-adjuster も参照してください。特定のレコードの検索スコアーを増やすことができます。 .SS 制限 .sp 今のところいくつか制限があります。将来的には解消される予定です。 .sp 以下が制限です。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 ロード時に要素の値を文字列での表現で指定しなければいけません。例えば、数値の29を指定するために、 \fB29\fP を使うことはできません。 \fB"29"\fP と文字列で表記する必要があります。 .UNINDENT .UNINDENT .UNINDENT .SS 作り方 .sp 重み付きベクターカラムを作るには \fB/reference/commands/column_create\fP を使います。ポイントは \fBCOLUMN_VECTOR|WITH_WEIGHT\fP フラグです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Bookmarks TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Bookmarks tags COLUMN_VECTOR|WITH_WEIGHT ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fBWITH_WEIGHT\fP フラグを指定しないと、ただのノーマルベクターカラムになります。 .sp 1つのブックマークに重み付きで0個以上のタグを設定できます。 .SS ロード方法 .sp JSONのオブジェクト構文でベクターデータをロードします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C {"ELEMENT1": WEIGHT1, "ELEMENT2": WEIGHT2, "ELEMENT3": WEIGHT3, ...} .ft P .fi .UNINDENT .UNINDENT .sp 以下のデータをロードしましょう。 .TS center; |l|l|. _ T{ \fB_key\fP T} T{ \fBtags\fP T} _ T{ \fBhttp://groonga.org/\fP T} T{ \fB{"groonga": 100}\fP T} _ T{ \fBhttp://mroonga.org/\fP T} T{ \fB{"mroonga": 100, "mysql": 50, "groonga": 10}\fP T} _ T{ \fBhttp://ranguba.org/\fP T} T{ \fB{"ruby": 100, "groonga": 50}\fP T} _ .TE .sp 以下がデータをロードするコマンドです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Bookmarks [ {"_key": "http://groonga.org/", "tags": {"groonga": 100}}, {"_key": "http://mroonga.org/", "tags": {"mroonga": 100, "mysql": 50, "groonga": 10}}, {"_key": "http://ranguba.org/", "tags": {"ruby": 100, "groonga": 50}} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] .ft P .fi .UNINDENT .UNINDENT .sp ロードしたデータはJSONのオブジェクト構文で出力されます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Bookmarks # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "tags", # "ShortText" # ] # ], # [ # 1, # "http://groonga.org/", # { # "groonga": 100 # } # ], # [ # 2, # "http://mroonga.org/", # { # "mroonga": 100, # "groonga": 10, # "mysql": 50 # } # ], # [ # 3, # "http://ranguba.org/", # { # "ruby": 100, # "groonga": 50 # } # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 検索方法 .sp 重み付きベクターを検索するためにはインデックスを作る必要があります。 \fBcolumn_create\fP に \fBWITH_WEIGHT\fP フラグを指定することを忘れないでください。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Tags TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Tags bookmark_index COLUMN_INDEX|WITH_WEIGHT Bookmarks tags # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fBWITH_WEIGHT\fP 以外は重み付きベクターカラムに特有の方法はありません。スカラーカラムにインデックスを作る方法と同じです。 .sp 全文検索と同じ構文で \fBtags\fP 内の要素を検索できます。 .sp select\-match\-columns と select\-query を使った場合: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Bookmarks \-\-match_columns tags \-\-query groonga \-\-output_columns _key,tags,_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "tags", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "http://groonga.org/", # { # "groonga": 100 # }, # 101 # ], # [ # "http://mroonga.org/", # { # "mroonga": 100, # "groonga": 10, # "mysql": 50 # }, # 11 # ], # [ # "http://ranguba.org/", # { # "ruby": 100, # "groonga": 50 # }, # 51 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp select\-match\-columns の重みと一緒に使うこともできます。スコアーは \fB(1 + 重み付きベクターの重み) * match_columnsの重み\fP 。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Bookmarks \-\-match_columns \(aqtags * 3\(aq \-\-query groonga \-\-output_columns _key,tags,_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "tags", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "http://groonga.org/", # { # "groonga": 100 # }, # 303 # ], # [ # "http://mroonga.org/", # { # "mroonga": 100, # "groonga": 10, # "mysql": 50 # }, # 33 # ], # [ # "http://ranguba.org/", # { # "ruby": 100, # "groonga": 50 # }, # 153 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp select\-filter を使った場合: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Bookmarks \-\-filter \(aqtags @ "groonga"\(aq \-\-output_columns _key,tags,_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "tags", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "http://groonga.org/", # { # "groonga": 100 # }, # 101 # ], # [ # "http://mroonga.org/", # { # "mroonga": 100, # "groonga": 10, # "mysql": 50 # }, # 11 # ], # [ # "http://ranguba.org/", # { # "ruby": 100, # "groonga": 50 # }, # 51 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 重みだけを適用する方法 .sp マッチしたレコード集合を変更せずに、重み付きベクターカラムの重みの分だけ検索スコアーを増やすことができます。 .sp この用途には select\-adjuster を使います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Bookmarks \e \-\-filter true \e \-\-adjuster \(aqtags @ "mysql" * 10 + tags @ "groonga" * 5\(aq \e \-\-output_columns _key,tags,_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "tags", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "http://groonga.org/", # { # "groonga": 100 # }, # 506 # ], # [ # "http://mroonga.org/", # { # "mroonga": 100, # "groonga": 10, # "mysql": 50 # }, # 566 # ], # [ # "http://ranguba.org/", # { # "ruby": 100, # "groonga": 50 # }, # 256 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fBselect\fP コマンドは \fB\-\-filter true\fP を使っています。そのため、すべてのレコードがマッチし、スコアーは1になります。それから、 \fB\-\-adjuster\fP を適用します。アジャスターは以下のことをします。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBtags @ "mysql" * 10\fP は \fB"mysql"\fP タグを含むレコードのスコアーを \fB(1 + 重み) * 10\fP 増やします。 .IP \(bu 2 \fBtags @ "groonga" * 5\fP は \fB"groonga"\fP タグを含むレコードのスコアーを \fB(1 + 重み) * 5\fP 増やします。 .UNINDENT .UNINDENT .UNINDENT .sp 例えば、 \fB"http://mroonga.org/"\fP レコードは \fB"mysql"\fP タグと \fB"groonga"\fP タグを両方持っています。そのため、スコアーは \fB565\fP ( \fB= ((1 + 50) * 10) + ((1 + 10) * 5) = (51 * 10) + (11 * 5) = 510 + 55\fP )増えます。 \fB\-\-adjuster\fP を適用する前は、\fB\-\-filter true\fP によって検索スコアーは1になっています。そのため、 \fB"http://mroonga.org/"\fP レコードの最終的な検索スコアーは \fB566\fP ( \fB= 1 + 565\fP )になります。 .SS 擬似カラム .SS 名前 .sp 疑似カラム .SS 説明 .sp Groongaのデータベースで作成したテーブルには、いくつかのカラムが自動的に定義されます。 .sp これらのカラムはいずれもアンダースコア(\(aq_\(aq)で始まる名前が付与されます。定義される疑似カラムは、テーブルの種類によって異なります。 .sp \fB_id\fP .INDENT 0.0 .INDENT 3.5 レコードに付与される一意な番号です。全てのテーブルに定義されます。値の範囲は1〜1073741824の整数で、通常はレコードを追加した順に1ずつ加算されます。_idの値は不変で、レコードが存在する限り変更することはできません。ただし、削除されたレコードの_idの値は再利用されます。 .UNINDENT .UNINDENT .sp \fB_key\fP .INDENT 0.0 .INDENT 3.5 レコードの主キー値を表します。主キーを持つテーブルのみに定義されます。主キー値はテーブルの中で一意であり、変更することはできません。 .UNINDENT .UNINDENT .sp \fB_value\fP .INDENT 0.0 .INDENT 3.5 レコードの値を表します。value_typeを指定したテーブルのみに定義されます。自由に変更可能です。 .UNINDENT .UNINDENT .sp \fB_score\fP .INDENT 0.0 .INDENT 3.5 各レコードのスコア値を表します。検索結果として生成されたテーブルのみに定義されます。 .sp 検索処理を実行する過程で値が設定されますが、自由に変更可能です。 .UNINDENT .UNINDENT .sp \fB_nsubrecs\fP .INDENT 0.0 .INDENT 3.5 主キーの値が同一であったレコードの件数を表します。検索結果として生成されたテーブルのみに定義されます。グループ化(drilldown)処理を実行すると、グループ化前のテーブルにおいて、グループ化キーの値が同一であったレコードの件数が、グループ化処理の結果を格納するテーブルの_nsubrecsに記録されます。 .UNINDENT .UNINDENT .sp 以下がインデックスカラムです。 .SS インデックスカラム .SS 概要 .sp TODO .SS 使い方 .sp TODO .SS ノーマライザー .SS 概要 .sp Groongaには正規化をするノーマライザーモジュールがあります。これはテキストをトークナイズするときとテーブルのキーを保存するときに使われます。例えば、正規化をした後は \fBA\fP と \fBa\fP は同じ文字として扱われます。 .sp ノーマライザーモジュールはプラグインとして追加できます。ノーマライザープラグインをGroongaに追加することでテキストの正規化方法をカスタマイズできます。 .sp ノーマライザーモジュールはテーブルに関連付いています。テーブルは0個か1個のノーマライザーモジュールを持つことができます。 \fB/reference/commands/table_create\fP の table\-create\-normalizer オプションでテーブルにノーマライザーオプションを関連付けることができます。 .sp 以下は \fBNormalizerAuto\fP ノーマライザーモジュールを使う \fBtable_create\fP の例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Dictionary TABLE_HASH_KEY ShortText \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 Groonga 2.0.9以前には \fBtable_create\fP に \fB\-\-normalizer\fP オプションはありません。代わりに \fBKEY_NORMALIZE\fP フラグを使っていました。 .sp Groonga 2.1.0以降で古いデータベースを開くことができます。ここでいう古いデータベースとはGroonga 2.0.9以前で作ったデータベースということです。しかし、一度新しいGroongaで開いたデータベースを2.0.9以前のGroongaで開くことはできません。一度 Groonga 2.1.0以降のGroongaでデータベースを開くと、 \fBKEY_NORMALIZE\fP フラグ情報がノーマライザー情報に変換されます。そのため、2.0.9以前のGroongaは、一度Groonga 2.1.0以降で開いたデータベース内から \fBKEY_NROMALIZE\fP フラグの情報を見つけることができません。 .UNINDENT .UNINDENT .sp ノーマライザーモジュールを持っているテーブルのキーは正規化されます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Dictionary [ {"_key": "Apple"}, {"_key": "black"}, {"_key": "COLOR"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] select Dictionary # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ] # ], # [ # 1, # "apple" # ], # [ # 2, # "black" # ], # [ # 3, # "color" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBNormalizerAuto\fP ノーマライザーはテキストを小文字に正規化します。例えば、 \fB"Apple"\fP は \fB"apple"\fP に正規化され、 \fB"black"\fP は \fB"blank"\fP に正規化され、 \fB"COLOR"\fP は \fB"color"\fP に正規化されます。 .sp テーブルが全文検索用の語彙表の場合、トークナイズされたトークンは正規化されます。なぜなら、トークンはテーブルのキーとして保存されるからです。テーブルのキーは前述のように正規化されます。 .SS 組み込みノーマライザー .sp 以下は組み込みのノーマライザーのリストです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBNormalizerAuto\fP .IP \(bu 2 \fBNormalizerNFKC51\fP .UNINDENT .UNINDENT .UNINDENT .SS \fBNormalizerAuto\fP .sp 通常は \fBNormalizerAuto\fP ノーマライザーを使うべきです。 \fBNormalizerAuto\fP はGroonga 2.0.9以前で使っていたノーマライザーと同じものです。2.0.9以前のGroongaの \fBtable_create\fP の \fBKEY_NORMALIZE\fP フラグは、2.1.0以降のGroongaの \fBtable_create\fP の \fB\-\-normalizer NormalizerAuto\fP と同じです。 .sp \fBNormalizerAuto\fP はすべてのエンコーディングに対応しています。UTF\-8でエンコードされたテキストにはUnicodeのNFKC(Normalization Form Compatibility Composition)を使います。他のエンコーディング用にはエンコーディング毎に独自の正規化をします。これらの独自の正規化の結果はNFKCでの結果と似たものになります。 .sp 例えば、半角カタカナ(例えば「カ」: U+FF76 HALFWIDTH KATAKANA LETTER KA) + 半角カタカナの濁点(「゙」: U+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK)は濁点付きの全角カタカナ(「ガ」: U+30AC KATAKANA LETTER GA)に正規化されます。前者は2文字ですが、後者は1文字です。 .sp 以下は \fBNormalizerAuto\fP ノーマライザーを使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create NormalLexicon TABLE_HASH_KEY ShortText \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .SS \fBNormalizerNFKC51\fP .sp \fBNormalizerNFKC51\fP はUnicode 5.1用のUnicode NFKC(Normalization Form Compatibility Composition)を使ってテキストを正規化します。UTF\-8エンコーディングのみをサポートしています。 .sp 通常、 \fBNormalizerNFKC51\fP を明示的に使う必要はありません。代わりに \fBNormalizerAuto\fP を使ってください。 .sp 以下は \fBNormalizerNFKC51\fP ノーマライザーを使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create NFKC51Lexicon TABLE_HASH_KEY ShortText \-\-normalizer NormalizerNFKC51 # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .SS 追加のノーマライザー一覧 .sp いくつか追加のノーマライザーがあります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%groonga\-normalizer\-mysql\fP .UNINDENT .UNINDENT .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/commands/table_create\fP .UNINDENT .SS トークナイザー .SS 概要 .sp Groongaにはテキストをトークナイズするトークナイザーモージュールがあります。次のケースのときにトークナイザーを使います。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 テキストのインデックスを構築するとき .INDENT 2.0 .INDENT 2.5 [画像] テキストのインデックスを構築するときにトークナイザーを使います。.UNINDENT .UNINDENT .IP \(bu 2 クエリーで検索するとき .INDENT 2.0 .INDENT 2.5 [画像] クエリーで検索するときにトークナイザーを使います。.UNINDENT .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp 全文検索ではトークナイザーは重要なモジュールです。トークナイザーを変えることで \fI\%適合率と再現率\fP のトレードオフを調整することができます。 .sp 一般的に \fI\%TokenBigram\fP が適切なトークナイザーです。トークナイザーについてよく知らない場合は \fI\%TokenBigram\fP を使うことをオススメします。 .sp \fB/reference/commands/tokenize\fP コマンドと \fB/reference/commands/table_tokenize\fP コマンドを使うことでトークナイザーを試すことができます。 \fB/reference/commands/tokenize\fP コマンドを使って \fI\%TokenBigram\fP トークナイザーを試す例を以下に示します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "Hello World" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "He" # }, # { # "position": 1, # "force_prefix": false, # "value": "el" # }, # { # "position": 2, # "force_prefix": false, # "value": "ll" # }, # { # "position": 3, # "force_prefix": false, # "value": "lo" # }, # { # "position": 4, # "force_prefix": false, # "value": "o " # }, # { # "position": 5, # "force_prefix": false, # "value": " W" # }, # { # "position": 6, # "force_prefix": false, # "value": "Wo" # }, # { # "position": 7, # "force_prefix": false, # "value": "or" # }, # { # "position": 8, # "force_prefix": false, # "value": "rl" # }, # { # "position": 9, # "force_prefix": false, # "value": "ld" # }, # { # "position": 10, # "force_prefix": false, # "value": "d" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 「トークナイズ」とはなにか .sp 「トークナイズ」はテキストから0個以上のトークンを抽出する処理です。「トークナイズ」する方法はいくつかあります。 .sp 例えば、バイグラムというトークナイズ方法では \fBHello World\fP は次のトークンにトークナイズされます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBHe\fP .IP \(bu 2 \fBel\fP .IP \(bu 2 \fBll\fP .IP \(bu 2 \fBlo\fP .IP \(bu 2 \fBo_\fP ( \fB_\fP は空白文字という意味) .IP \(bu 2 \fB_W\fP ( \fB_\fP は空白文字という意味) .IP \(bu 2 \fBWo\fP .IP \(bu 2 \fBor\fP .IP \(bu 2 \fBrl\fP .IP \(bu 2 \fBld\fP .UNINDENT .UNINDENT .UNINDENT .sp 上記の例では、 \fBHello World\fP から10個のトークンを抽出しました。 .sp 例えば、空白区切りのトークナイズ方法では \fBHello World\fP は次のトークンにトークナイズされます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBHello\fP .IP \(bu 2 \fBWorld\fP .UNINDENT .UNINDENT .UNINDENT .sp 上記の例では、\fBHello World\fP から2つのトークンを抽出しました。 .sp トークンは検索時のキーとして使われます。使用したトークナイズ方法で抽出したトークンでしかインデックス化されたドキュメントを探すことはできません。例えば、トークナイズ方法としてバイグラムを使った場合は \fBll\fP で \fBHello World\fP を見つけることができます。しかし、空白区切りのトークナイズ方法を使ったときは \fBll\fP で \fBHello World\fP を見つけることはできません。なぜなら、空白区切りのトークナイズ方法は \fBll\fP というトークンを抽出していないからです。空白区切りのトークナイズ方法は \fBHello\fP というトークンと \fBWorld\fP というトークンしか抽出していません。 .sp 一般的に、小さいトークンを生成するトークナイズ方法は再現率が高い代わりに適合率が低くなりがちです。一方、大きいトークンを生成するトークナイズ方法は適合率が高い代わりに再現率が低くなりがちです。 .sp 例えば、バイグラムというトークナイズ方法では \fBor\fP で \fBHello World\fP と \fBA or B\fP を検索できます。しかし、「論理和」を検索したい人にとっては \fBHello World\fP は不要な結果です。これは、適合率が下がったということです。しかし、再現率は上がっています。 .sp 空白区切りのトークナイズ方法を使った場合は \fBor\fP で \fBA or B\fP だけが見つかります。なぜなら、空白区切りのトークナイズ方法では \fBWorld\fP は \fBWorld\fP という1つのトークンだけにトークナイズされるからです。これは、「論理和」を探したい人にとっては適合率が挙がっています。しかし、 \fBHello World\fP も \fBor\fP を含んでいるのに見つかっていないので再現率が下がっています。 .SS 組み込みトークナイザー .sp 以下は組み込みのトークナイザーのリストです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBTokenBigram\fP .IP \(bu 2 \fBTokenBigramSplitSymbol\fP .IP \(bu 2 \fBTokenBigramSplitSymbolAlpha\fP .IP \(bu 2 \fBTokenBigramSplitSymbolAlphaDigit\fP .IP \(bu 2 \fBTokenBigramIgnoreBlank\fP .IP \(bu 2 \fBTokenBigramIgnoreBlankSplitSymbol\fP .IP \(bu 2 \fBTokenBigramIgnoreBlankSplitAlpha\fP .IP \(bu 2 \fBTokenBigramIgnoreBlankSplitAlphaDigit\fP .IP \(bu 2 \fBTokenUnigram\fP .IP \(bu 2 \fBTokenTrigram\fP .IP \(bu 2 \fBTokenDelimit\fP .IP \(bu 2 \fBTokenDelimitNull\fP .IP \(bu 2 \fBTokenMecab\fP .IP \(bu 2 \fBTokenRegexp\fP .UNINDENT .UNINDENT .UNINDENT .SS \fBTokenBigram\fP .sp \fBTokenBigram\fP はバイグラムベースのトークナイザーです。多くのケースでは、このトークナイザーを使うことをオススメします。 .sp バイグラムというトークナイズ方法は、隣り合った2つの文字を1つのトークンとしてテキストをトークナイズします。例えば、 \fBHello\fP は次のトークンにトークナイズします。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBHe\fP .IP \(bu 2 \fBel\fP .IP \(bu 2 \fBll\fP .IP \(bu 2 \fBlo\fP .UNINDENT .UNINDENT .UNINDENT .sp バイグラムというトークナイズ方法は再現性に優れています。なぜなら、2文字以上の文字のクエリーに対してはすべてのテキストを見つけることができるからです。 .sp 一般的に、1文字のクエリーではすべてのテキストを見つけることはできません。なぜなら、1つの文字のトークンが存在しないからです。しかし、Groongaでは1文字のクエリーでもすべてのテキストを見つけることができます。なぜなら、Groongaは前方一致検索によりクエリーで指定した文字で始まるトークンをすべて見つけることができるからです。例えば、Groongaは \fBl\fP というクエリーから \fBll\fP というトークンと \fBlo\fP というトークンを見つけることができます。 .sp バイグラムというトークナイズ方法は適合率はそれほど優れていません。なぜなら、単語の一部にクエリーが含まれていればすべてのテキストが見つかってしまうからです。例えば、 \fBor\fP で \fBworld\fP が見つかります。これは非ASCIIを使う言語よりASCIIのみを使う言語で顕著です。以降の説明で触れる通り、 \fBTokenBigram\fP はこの問題を解決しています。 .sp \fBTokenBigram\fP の挙動は \fB/reference/normalizers\fP を使うかどうかで変わります。 .sp ノーマライザーを使っていない場合は \fBTokenBigram\fP は純粋なバイグラム(最後のトークンをのぞいてすべてのトークンを2文字にする)のトークナイズ方法を使います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "Hello World" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "He" # }, # { # "position": 1, # "force_prefix": false, # "value": "el" # }, # { # "position": 2, # "force_prefix": false, # "value": "ll" # }, # { # "position": 3, # "force_prefix": false, # "value": "lo" # }, # { # "position": 4, # "force_prefix": false, # "value": "o " # }, # { # "position": 5, # "force_prefix": false, # "value": " W" # }, # { # "position": 6, # "force_prefix": false, # "value": "Wo" # }, # { # "position": 7, # "force_prefix": false, # "value": "or" # }, # { # "position": 8, # "force_prefix": false, # "value": "rl" # }, # { # "position": 9, # "force_prefix": false, # "value": "ld" # }, # { # "position": 10, # "force_prefix": false, # "value": "d" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp ノーマライザーを使っている場合は \fBTokenBigram\fP はASCIIの文字には空白区切りのようなトークナイズ方法を使います。非ASCII文字にはバイグラムのトークナイズ方法を使います。 .sp もしかしたら、複数の方法が混ざったこの挙動はわかりにくいかもしれません。しかし、英語のテキスト(ASCII文字列のみ)や日本語テキスト(ASCII文字列と非ASCII文字列が混ざっている)ような多くのユースケースでは合理的な方法です。 .sp ASCII文字しか使わない多くの言語は単語の区切りに空白文字を使っています。このようなケースに空白区切りのトークナイズ方法は適切です。 .sp 非ASCII文字を使う言語では単語の区切りに空白文字を使いません。このケースにはバイグラムなトークナイズ方法は適切です。 .sp 複数の言語が混ざっている場合は、複数の方法を組み合わせたトークナイズ方法が適切です。 .sp ASCII文字にバイグラムなトークナイズ方法を使いたい場合は \fI\%TokenBigramSplitSymbolAlpha\fP のような \fBTokenBigramSplitXXX\fP というトークナイザーを参照してください。 .sp 例を使いながら \fBTokenBigram\fP の挙動を確認しましょう。 .sp \fBTokenBigram\fP はASCII文字には1つ以上の空白文字をトークンの区切りとして使います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "Hello World" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "hello" # }, # { # "position": 1, # "force_prefix": false, # "value": "world" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBTokenBigram\fP はASCII文字には文字の種類が変わったところをトークンの区切りとします。文字の種類は次のどれかです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 アルファベット .IP \(bu 2 数字 .IP \(bu 2 記号(たとえば \fB(\fP 、 \fB)\fP 、 \fB!\fP など) .IP \(bu 2 ひらがな .IP \(bu 2 カタカナ .IP \(bu 2 漢字 .IP \(bu 2 その他 .UNINDENT .UNINDENT .UNINDENT .sp 次の例は2つのトークン区切りを示しています。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB100\fP (数字)と \fBcents\fP (アルファベット)の間のところ .IP \(bu 2 \fBcents\fP (アルファベット)と \fB!!!\fP (記号)の間のところ .UNINDENT .UNINDENT .UNINDENT .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "100cents!!!" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "100" # }, # { # "position": 1, # "force_prefix": false, # "value": "cents" # }, # { # "position": 2, # "force_prefix": false, # "value": "!!!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 以下は \fBTokenBigram\fP が非ASCII文字にはトークナイズ方法としてバイグラムを使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "日本語の勉強" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "日本" # }, # { # "position": 1, # "force_prefix": false, # "value": "本語" # }, # { # "position": 2, # "force_prefix": false, # "value": "語の" # }, # { # "position": 3, # "force_prefix": false, # "value": "の勉" # }, # { # "position": 4, # "force_prefix": false, # "value": "勉強" # }, # { # "position": 5, # "force_prefix": false, # "value": "強" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenBigramSplitSymbol\fP .sp \fBTokenBigramSplitSymbol\fP は \fI\%TokenBigram\fP と似ています。違いは記号の扱いです。 \fBTokenBigramSplitSymbol\fP は記号のトークナイズ方法にバイグラムを使います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigramSplitSymbol "100cents!!!" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "100" # }, # { # "position": 1, # "force_prefix": false, # "value": "cents" # }, # { # "position": 2, # "force_prefix": false, # "value": "!!" # }, # { # "position": 3, # "force_prefix": false, # "value": "!!" # }, # { # "position": 4, # "force_prefix": false, # "value": "!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenBigramSplitSymbolAlpha\fP .sp \fBTokenBigramSplitSymbolAlpha\fP は \fI\%TokenBigram\fP と似ています。違いは記号とアルファベットの扱いです。 \fBTokenBigramSplitSymbolAlpha\fP は記号とアルファベットのトークナイズ方法にバイグラムを使います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigramSplitSymbolAlpha "100cents!!!" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "100" # }, # { # "position": 1, # "force_prefix": false, # "value": "ce" # }, # { # "position": 2, # "force_prefix": false, # "value": "en" # }, # { # "position": 3, # "force_prefix": false, # "value": "nt" # }, # { # "position": 4, # "force_prefix": false, # "value": "ts" # }, # { # "position": 5, # "force_prefix": false, # "value": "s!" # }, # { # "position": 6, # "force_prefix": false, # "value": "!!" # }, # { # "position": 7, # "force_prefix": false, # "value": "!!" # }, # { # "position": 8, # "force_prefix": false, # "value": "!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenBigramSplitSymbolAlphaDigit\fP .sp \fBTokenBigramSplitSymbolAlphaDigit\fP は \fI\%TokenBigram\fP と似ています。違いは記号とアルファベットと数字の扱いです。 \fBTokenBigramSplitSymbolAlphaDigit\fP は記号とアルファベット数字のトークナイズ方法にバイグラムを使います。つまり、すべての文字をバイグラムでトークナイズします。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigramSplitSymbolAlphaDigit "100cents!!!" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "10" # }, # { # "position": 1, # "force_prefix": false, # "value": "00" # }, # { # "position": 2, # "force_prefix": false, # "value": "0c" # }, # { # "position": 3, # "force_prefix": false, # "value": "ce" # }, # { # "position": 4, # "force_prefix": false, # "value": "en" # }, # { # "position": 5, # "force_prefix": false, # "value": "nt" # }, # { # "position": 6, # "force_prefix": false, # "value": "ts" # }, # { # "position": 7, # "force_prefix": false, # "value": "s!" # }, # { # "position": 8, # "force_prefix": false, # "value": "!!" # }, # { # "position": 9, # "force_prefix": false, # "value": "!!" # }, # { # "position": 10, # "force_prefix": false, # "value": "!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenBigramIgnoreBlank\fP .sp \fBTokenBigramIgnoreBlank\fP は \fI\%TokenBigram\fP と似ています。違いは空白文字の扱いです。 \fBTokenBigramIgnoreBlank\fP は連続する記号と非ASCII文字の間にある空白文字を無視します。 .sp \fB日 本 語 ! ! !\fP というテキストを使うと違いがわかります。なぜならこのテキストは記号と非ASCII文字を両方含んでいるからです。 .sp \fI\%TokenBigram\fP での実行結果です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "日 本 語 ! ! !" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "日" # }, # { # "position": 1, # "force_prefix": false, # "value": "本" # }, # { # "position": 2, # "force_prefix": false, # "value": "語" # }, # { # "position": 3, # "force_prefix": false, # "value": "!" # }, # { # "position": 4, # "force_prefix": false, # "value": "!" # }, # { # "position": 5, # "force_prefix": false, # "value": "!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBTokenBigramIgnoreBlank\fP での実行結果です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigramIgnoreBlank "日 本 語 ! ! !" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "日本" # }, # { # "position": 1, # "force_prefix": false, # "value": "本語" # }, # { # "position": 2, # "force_prefix": false, # "value": "語" # }, # { # "position": 3, # "force_prefix": false, # "value": "!!!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenBigramIgnoreBlankSplitSymbol\fP .sp \fBTokenBigramIgnoreBlankSplitSymbol\fP は \fI\%TokenBigram\fP と似ています。違いは次の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 空白文字の扱い .IP \(bu 2 記号の扱い .UNINDENT .UNINDENT .UNINDENT .sp \fBTokenBigramIgnoreBlankSplitSymbol\fP は連続した記号と非ASCII文字の間の空白文字を無視します。 .sp \fBTokenBigramIgnoreBlankSplitSymbol\fP は記号をバイグラムでトークナイズします。 .sp \fB日 本 語 ! ! !\fP というテキストを使うと違いがわかります。なぜならこのテキストは記号と非ASCII文字を両方含んでいるからです。 .sp \fI\%TokenBigram\fP での実行結果です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "日 本 語 ! ! !" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "日" # }, # { # "position": 1, # "force_prefix": false, # "value": "本" # }, # { # "position": 2, # "force_prefix": false, # "value": "語" # }, # { # "position": 3, # "force_prefix": false, # "value": "!" # }, # { # "position": 4, # "force_prefix": false, # "value": "!" # }, # { # "position": 5, # "force_prefix": false, # "value": "!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBTokenBigramIgnoreBlankSplitSymbol\fP の実行結果です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigramIgnoreBlankSplitSymbol "日 本 語 ! ! !" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "日本" # }, # { # "position": 1, # "force_prefix": false, # "value": "本語" # }, # { # "position": 2, # "force_prefix": false, # "value": "語!" # }, # { # "position": 3, # "force_prefix": false, # "value": "!!" # }, # { # "position": 4, # "force_prefix": false, # "value": "!!" # }, # { # "position": 5, # "force_prefix": false, # "value": "!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenBigramIgnoreBlankSplitSymbolAlpha\fP .sp \fBTokenBigramIgnoreBlankSplitSymbolAlpha\fP は \fI\%TokenBigram\fP と似ています。違いは次の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 空白文字の扱い .IP \(bu 2 記号とアルファベットの扱い .UNINDENT .UNINDENT .UNINDENT .sp \fBTokenBigramIgnoreBlankSplitSymbolAlpha\fP は連続した記号と非ASCII文字の間の空白文字を無視します。 .sp \fBTokenBigramIgnoreBlankSplitSymbolAlpha\fP は記号とアルファベットをバイグラムでトークナイズします。 .sp \fBHello 日 本 語 ! ! !\fP というテキストを使うと違いがわかります。なぜなら空白文字入りの記号と非ASCII文字だけでなく、アルファベットも含んでいるからです。 .sp \fI\%TokenBigram\fP での実行結果です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "Hello 日 本 語 ! ! !" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "hello" # }, # { # "position": 1, # "force_prefix": false, # "value": "日" # }, # { # "position": 2, # "force_prefix": false, # "value": "本" # }, # { # "position": 3, # "force_prefix": false, # "value": "語" # }, # { # "position": 4, # "force_prefix": false, # "value": "!" # }, # { # "position": 5, # "force_prefix": false, # "value": "!" # }, # { # "position": 6, # "force_prefix": false, # "value": "!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBTokenBigramIgnoreBlankSplitSymbolAlpha\fP の実行結果です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigramIgnoreBlankSplitSymbolAlpha "Hello 日 本 語 ! ! !" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "he" # }, # { # "position": 1, # "force_prefix": false, # "value": "el" # }, # { # "position": 2, # "force_prefix": false, # "value": "ll" # }, # { # "position": 3, # "force_prefix": false, # "value": "lo" # }, # { # "position": 4, # "force_prefix": false, # "value": "o日" # }, # { # "position": 5, # "force_prefix": false, # "value": "日本" # }, # { # "position": 6, # "force_prefix": false, # "value": "本語" # }, # { # "position": 7, # "force_prefix": false, # "value": "語!" # }, # { # "position": 8, # "force_prefix": false, # "value": "!!" # }, # { # "position": 9, # "force_prefix": false, # "value": "!!" # }, # { # "position": 10, # "force_prefix": false, # "value": "!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenBigramIgnoreBlankSplitSymbolAlphaDigit\fP .sp \fBTokenBigramIgnoreBlankSplitSymbolAlphaDigit\fP は \fI\%TokenBigram\fP と似ています。違いは次の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 空白文字の扱い .IP \(bu 2 記号とアルファベットと数字の扱い .UNINDENT .UNINDENT .UNINDENT .sp \fBTokenBigramIgnoreBlankSplitSymbolAlphaDigit\fP は連続した記号と非ASCII文字の間の空白文字を無視します。 .sp \fBTokenBigramIgnoreBlankSplitSymbolAlphaDigit\fP は記号、アルファベット、数字をバイグラムでトークナイズします。つまり、すべての文字をバイグラムでトークナイズします。 .sp \fBHello 日 本 語 ! ! ! 777\fP というテキストを使うと違いがわかります。なぜなら、このテキストは空白文字入りの記号と非ASCII文字だけでなく、アルファベットと数字も含んでいるからです。 .sp \fI\%TokenBigram\fP での実行結果です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigram "Hello 日 本 語 ! ! ! 777" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "hello" # }, # { # "position": 1, # "force_prefix": false, # "value": "日" # }, # { # "position": 2, # "force_prefix": false, # "value": "本" # }, # { # "position": 3, # "force_prefix": false, # "value": "語" # }, # { # "position": 4, # "force_prefix": false, # "value": "!" # }, # { # "position": 5, # "force_prefix": false, # "value": "!" # }, # { # "position": 6, # "force_prefix": false, # "value": "!" # }, # { # "position": 7, # "force_prefix": false, # "value": "777" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBTokenBigramIgnoreBlankSplitSymbolAlphaDigit\fP の実行結果です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenBigramIgnoreBlankSplitSymbolAlphaDigit "Hello 日 本 語 ! ! ! 777" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "he" # }, # { # "position": 1, # "force_prefix": false, # "value": "el" # }, # { # "position": 2, # "force_prefix": false, # "value": "ll" # }, # { # "position": 3, # "force_prefix": false, # "value": "lo" # }, # { # "position": 4, # "force_prefix": false, # "value": "o日" # }, # { # "position": 5, # "force_prefix": false, # "value": "日本" # }, # { # "position": 6, # "force_prefix": false, # "value": "本語" # }, # { # "position": 7, # "force_prefix": false, # "value": "語!" # }, # { # "position": 8, # "force_prefix": false, # "value": "!!" # }, # { # "position": 9, # "force_prefix": false, # "value": "!!" # }, # { # "position": 10, # "force_prefix": false, # "value": "!7" # }, # { # "position": 11, # "force_prefix": false, # "value": "77" # }, # { # "position": 12, # "force_prefix": false, # "value": "77" # }, # { # "position": 13, # "force_prefix": false, # "value": "7" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenUnigram\fP .sp \fBTokenUnigram\fP は \fI\%TokenBigram\fP に似ています。違いはトークンの単位です。 \fI\%TokenBigram\fP は各トークンが2文字ですが、 \fBTokenUnigram\fP は各トークンが1文字です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenUnigram "100cents!!!" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "100" # }, # { # "position": 1, # "force_prefix": false, # "value": "cents" # }, # { # "position": 2, # "force_prefix": false, # "value": "!!!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenTrigram\fP .sp \fBTokenTrigram\fP は \fI\%TokenBigram\fP に似ています。違いはトークンの単位です。 \fI\%TokenBigram\fP は各トークンが2文字ですが、 \fBTokenTrigram\fP は各トークンが3文字です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenTrigram "10000cents!!!!!" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "10000" # }, # { # "position": 1, # "force_prefix": false, # "value": "cents" # }, # { # "position": 2, # "force_prefix": false, # "value": "!!!!!" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenDelimit\fP .sp \fBTokenDelimit\fP は1つ以上の空白文字( \fBU+0020\fP )で分割してトークンを抽出します。たとえば、 \fBHello World\fP は \fBHello\fP と \fBWorld\fP にトークナイズされます。 .sp \fBTokenDelimit\fP はタグテキストに適切です。 \fBgroonga full\-text\-search http\fP というテキストから \fBgroonga\fP 、 \fBfull\-text\-search\fP 、 \fBhttp\fP を抽出します。 .sp 以下は \fBTokenDelimit\fP の例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenDelimit "Groonga full\-text\-search HTTP" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "groonga" # }, # { # "position": 1, # "force_prefix": false, # "value": "full\-text\-search" # }, # { # "position": 2, # "force_prefix": false, # "value": "http" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenDelimitNull\fP .sp \fBTokenDelimitNull\fP は \fI\%TokenDelimit\fP に似ています。違いは区切り文字です。 \fI\%TokenDelimit\fP は空白文字( \fBU+0020\fP )を使いますが、 \fBTokenDelimitNull\fP はNUL文字( \fBU+0000\fP )を使います。 .sp \fBTokenDelimitNull\fP もタグテキストに適切です。 .sp 以下は \fBTokenDelimitNull\fP の例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenDelimitNull "Groonga\eu0000full\-text\-search\eu0000HTTP" NormalizerAuto # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "groongau0000full\-text\-searchu0000http" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenMecab\fP .sp \fBTokenMecab\fP は \fI\%MeCab\fP 形態素解析器をベースにしたトークナイザーです。 .sp MeCabは日本語に依存していません。その言語用の辞書を用意すれば日本語以外でもMeCabを使えます。日本語用の辞書には \fI\%NAIST Japanese Dictionary\fP を使えます。 .sp \fBTokenMecab\fP は再現率より適合率に優れています。 \fI\%TokenBigram\fP では \fB京都\fP というクエリーで \fB東京都\fP も \fB京都\fP も見つかりますが、この場合は \fB東京都\fP は期待した結果ではありません。 \fBTokenMecab\fP を使うと \fB京都\fP というクエリーで \fB京都\fP だけを見つけられます。 .sp 新語をサポートしたい場合は、MeCabの辞書を更新し続ける必要があります。これはメンテナンスコストがかかります。( \fI\%TokenBigram\fP には辞書のメンテナンスコストはありません。なぜなら、 \fI\%TokenBigram\fP は辞書を使っていないからです。)新語への対応に \fI\%mecab\-ipadic\-NEologd : Neologism dictionary for MeCab\fP が役に立つかもしれません。 .sp 以下は \fBTokenMeCab\fP の例です。 \fB東京都\fP は \fB東京\fP と \fB都\fP にトークナイズされています。 \fB京都\fP というトークンはありません。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenMecab "東京都" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "東京" # }, # { # "position": 1, # "force_prefix": false, # "value": "都" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBTokenRegexp\fP .sp バージョン 5.0.1 で追加. .sp \fBご用心:\fP .INDENT 0.0 .INDENT 3.5 このトークナイザーは実験的です。仕様が変わる可能性があります。 .UNINDENT .UNINDENT .sp \fBご用心:\fP .INDENT 0.0 .INDENT 3.5 このトークナイザーはUTF\-8でしか使えません。EUC\-JPやShift_JISなどと一緒には使えません。 .UNINDENT .UNINDENT .sp \fBTokenRegexp\fP はインデックスを使った正規表現検索をサポートするトークナイザーです。 .sp 一般的に、正規表現検索は逐次検索で実行します。しかし、次のケースはインデックスを使って検索できます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBhello\fP のようにリテラルしかないケース .IP \(bu 2 \fB\eA/home/alice\fP のようにテキストの最初でのマッチとリテラルのみのケース .IP \(bu 2 \fB\e.txt\ez\fP のようにテキストの最後でのマッチとリテラルのみのケース .UNINDENT .UNINDENT .UNINDENT .sp 多くのケースでは、逐次検索よりもインデックスを使った検索の方が高速です。 .sp \fBTokenRegexp\fP はベースはバイグラムを使います。 \fBTokenRegexp\fP は、インデックス時に、テキストの先頭にテキストの先頭であるというマーク( \fBU+FFEF\fP )を入れ、テキストの最後にテキストの最後であるというマーク( \fBU+FFF0\fP )を入れます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tokenize TokenRegexp "/home/alice/test.txt" NormalizerAuto \-\-mode ADD # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "position": 0, # "force_prefix": false, # "value": "￯" # }, # { # "position": 1, # "force_prefix": false, # "value": "/h" # }, # { # "position": 2, # "force_prefix": false, # "value": "ho" # }, # { # "position": 3, # "force_prefix": false, # "value": "om" # }, # { # "position": 4, # "force_prefix": false, # "value": "me" # }, # { # "position": 5, # "force_prefix": false, # "value": "e/" # }, # { # "position": 6, # "force_prefix": false, # "value": "/a" # }, # { # "position": 7, # "force_prefix": false, # "value": "al" # }, # { # "position": 8, # "force_prefix": false, # "value": "li" # }, # { # "position": 9, # "force_prefix": false, # "value": "ic" # }, # { # "position": 10, # "force_prefix": false, # "value": "ce" # }, # { # "position": 11, # "force_prefix": false, # "value": "e/" # }, # { # "position": 12, # "force_prefix": false, # "value": "/t" # }, # { # "position": 13, # "force_prefix": false, # "value": "te" # }, # { # "position": 14, # "force_prefix": false, # "value": "es" # }, # { # "position": 15, # "force_prefix": false, # "value": "st" # }, # { # "position": 16, # "force_prefix": false, # "value": "t." # }, # { # "position": 17, # "force_prefix": false, # "value": ".t" # }, # { # "position": 18, # "force_prefix": false, # "value": "tx" # }, # { # "position": 19, # "force_prefix": false, # "value": "xt" # }, # { # "position": 20, # "force_prefix": false, # "value": "t" # }, # { # "position": 21, # "force_prefix": false, # "value": "￰" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS トークンフィルター .SS 概要 .sp Groongaにはトークナイズされたトークンに所定の処理を行うトークンフィルターモジュールがあります。 .sp トークンフィルターモジュールはプラグインとして追加できます。 .sp トークンフィルタープラグインをGroongaに追加することでトークナイズされたトークンをカスタマイズできます。 .sp テーブルは0個以上のトークンフィルターを持てます。テーブルにトークンフィルターを付けるには \fB/reference/commands/table_create\fP の table\-create\-token\-filters オプションを使います。 .sp 以下は \fBTokenFilterStopWord\fP トークンフィルターモジュールを使う \fBtable_create\fP の例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C register token_filters/stop_word # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \e \-\-default_tokenizer TokenBigram \e \-\-normalizer NormalizerAuto \e \-\-token_filters TokenFilterStopWord # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .SS 利用可能なトークンフィルター .sp 以下は組み込みのトークンフィルターのリストです。 .INDENT 0.0 .IP \(bu 2 \fBTokenFilterStopWord\fP .IP \(bu 2 \fBTokenFilterStem\fP .UNINDENT .SS \fBTokenFilterStopWord\fP .sp \fBTokenFilterStopWord\fP は、文書を検索する時にトークナイズされたトークンからストップワードを除去します。 .sp \fBTokenFilterStopWord\fP は、文書を検索する時のみトークン除去するため、文書を追加した後でストップワードを指定することもできます。 .sp ストップワードは、語彙表の \fBis_stop_word\fP カラムで指定します。 .sp 以下は \fBTokenFilterStopWord\fP トークンフィルターを使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C register token_filters/stop_word # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Memos TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Memos content COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \e \-\-default_tokenizer TokenBigram \e \-\-normalizer NormalizerAuto \e \-\-token_filters TokenFilterStopWord # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms memos_content COLUMN_INDEX|WITH_POSITION Memos content # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms is_stop_word COLUMN_SCALAR Bool # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Terms [ {"_key": "and", "is_stop_word": true} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] load \-\-table Memos [ {"content": "Hello"}, {"content": "Hello and Good\-bye"}, {"content": "Good\-bye"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] select Memos \-\-match_columns content \-\-query "Hello and" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "content", # "ShortText" # ] # ], # [ # 1, # "Hello" # ], # [ # 2, # "Hello and Good\-bye" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBand\fP というトークンは \fBTerms\fP テーブルでストップワードと指定されています。 .sp \fB"Hello"\fP は文書内に \fBand\fP がありませんがマッチしています。なぜなら、 \fBand\fP はストップワードと指定されているため、クエリーから除去されているからです。 .SS \fBTokenFilterStem\fP .sp \fBTokenFilterStem\fP は、トークナイズされたトークンをステミングします。 .sp 以下は \fBTokenFilterStem\fP トークンフィルターを使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C register token_filters/stem # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Memos TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Memos content COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \e \-\-default_tokenizer TokenBigram \e \-\-normalizer NormalizerAuto \e \-\-token_filters TokenFilterStem # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms memos_content COLUMN_INDEX|WITH_POSITION Memos content # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Memos [ {"content": "I develop Groonga"}, {"content": "I\(aqm developing Groonga"}, {"content": "I developed Groonga"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] select Memos \-\-match_columns content \-\-query "develops" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "content", # "ShortText" # ] # ], # [ # 1, # "I develop Groonga" # ], # [ # 2, # "I\(aqm developing Groonga" # ], # [ # 3, # "I developed Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBdevelop\fP も \fBdeveloping\fP も \fBdeveloped\fP も \fBdevelops\fP も、すべてステミングすると \fBdevelop\fP になります。そのため、 \fBdevelops\fP というクエリーで \fBdevelop\fP も \fBdeveloping\fP も \fBdeveloped\fP も検索できます。 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/commands/table_create\fP .UNINDENT .SS クエリー展開オブジェクト一覧 .SS QueryExpanderTSV .SS 概要 .sp \fBQueryExpanderTSV\fP はクエリー展開プラグインです。同義語はTSV(データをタブで区切るファイルフォーマット)ファイルから読み込みます。このプラグインは組み込みのクエリー展開機能よりも機能が少ないです。例えば、単語の正規化をサポートしていません。しかし、TSVファイルで同義語を管理できるためこちらの方が使いやすいかもしれません。TSVファイルなのでExcelなどの表計算ソフトで同義語を編集できます。組み込みのクエリー展開機能では、Groongaのテーブルとして同義語を管理します。 .SS インストール .sp \fBQueryExpanderTSV\fP を使う前に \fBquery_expanders/tsv\fP をプラグインとして登録します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_register query_expanders/tsv .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp \fBselect\fP コマンドに \fB\-\-query_expander QueryExpanderTSV\fP パラメーターを追加します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-query "QUERY" \-\-query_expander QueryExpanderTSV .ft P .fi .UNINDENT .UNINDENT .sp \fBQUERY\fP 内に登録済みの同義語がある場合はそれらが展開されます。例えば、以下の同義語があるとします。 .TS center; |l|l|l|. _ T{ 単語 T} T{ 同義語1 T} T{ 同義語2 T} _ T{ groonga T} T{ groonga T} T{ Senna T} _ T{ mroonga T} T{ mroonga T} T{ groonga MySQL T} _ .TE .sp この表は、 \fB単語\fP の同義語は \fB同義語1\fP と \fB同義語2\fP という意味です。例えば、 \fBgroonga\fP の同義語は \fBgroonga\fP と \fBSenna\fP です。また、 \fBmroonga\fP の同義語は \fBmroonga\fP と \fBgroonga MySQL\fP です。 .sp クエリーが \fBgroonga\fP のときのクエリー展開の例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-query "groonga" \-\-query_expander QueryExpanderTSV .ft P .fi .UNINDENT .UNINDENT .sp 上記のコマンドは以下のコマンドと同じ意味です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-query "groonga OR Senna" \-\-query_expander QueryExpanderTSV .ft P .fi .UNINDENT .UNINDENT .sp クエリーが \fBmroonga search\fP のときのクエリー展開の例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-query "mroonga search" \-\-query_expander QueryExpanderTSV .ft P .fi .UNINDENT .UNINDENT .sp 上記のコマンドは以下のコマンドと同じ意味です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-query "(mroonga OR (groonga MySQL)) search" \-\-query_expander QueryExpanderTSV .ft P .fi .UNINDENT .UNINDENT .sp 登録されている単語だけ(ここでは \fBgroonga\fP と \fBmroonga\fP )クエリー展開されて、登録されていない単語(ここでは \fBsearch\fP )はクエリー展開されていないことが大事なポイントです。また、再帰的にクエリー展開しません。クエリー展開した結果の \fB(mroonga OR (groonga MySQL))\fP の中に \fBgroonga\fP がありますが、これは展開されません。 .sp 通常、同義語の中に \fB単語\fP 自身も含める必要があります。例えば、 \fBgroonga\fP と \fBmroonga\fP が同義語の中に含まれています。もし、 \fB単語\fP 自身を無視したい場合は同義語の中に \fB単語\fP を含めないでください。例えば、クエリー展開機能をスペル訂正機能として使う場合は、以下のような同義語を使ってください。 .TS center; |l|l|. _ T{ 単語 T} T{ 同義語 T} _ T{ gronga T} T{ groonga T} _ .TE .sp \fB単語\fP の \fBgronga\fP には誤字があります。 \fBo\fP がひとつ足りません。 \fB同義語\fP の \fBgroonga\fP が正しい単語です。 .sp スペル訂正機能としてクエリー展開機能を使う例です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-query "gronga" \-\-query_expander QueryExpanderTSV .ft P .fi .UNINDENT .UNINDENT .sp 上記のコマンドは以下のコマンドと同じ意味です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select \-\-query "groonga" \-\-query_expander QueryExpanderTSV .ft P .fi .UNINDENT .UNINDENT .sp 前者のコマンドは \fB\-\-query\fP の値に誤字がありますが、後者のコマンドは誤字がありません。 .SS TSVファイル .sp 同義語はTSVフォーマットのファイルで定義します。このセクションでは定義方法について説明します。 .SS 場所 .sp TSVファイルのファイル名は \fBsynonyms.tsv\fP で、設定ディレクトリに置かなければいけません。例えば、 \fB/etc/groonga/synonyms.tsv\fP がTSVファイルの場所になります。場所はビルド時に決まります。 .sp 環境変数 \fBGRN_QUERY_EXPANDER_TSV_SYNONYMS_FILE\fP を指定することで実行時に場所を変更することもできます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % env GRN_QUERY_EXPANDER_TSV_SYNONYMS_FILE=/tmp/synonyms.tsv groonga .ft P .fi .UNINDENT .UNINDENT .sp 上述のコマンドでは \fB/tmp/synonyms.tsv\fP ファイルが使われます。 .SS フォーマット .sp TSVファイル内に0個以上の同義語を定義することができます。1行につき \fB単語\fP と \fB同義語リスト\fP のペアを定義します。 \fB\-\-query\fP の値の中にでてきた \fB単語\fP は \fB同義語リスト\fP に展開されます。 \fB同義語リスト\fP は \fBOR\fP でまとめます。例えば、同義語リスト \fBgroonga\fP と \fBSenna\fP は \fBgroonga OR Senna\fP と展開されます。 .sp 最初のカラムが \fB単語\fP で、残りのカラムが \fB単語\fP の \fB同義語リスト\fP になります。以下は、 \fB単語\fP が \fBgroonga\fP で、 \fB同義語リスト\fP が \fBgroonga\fP と \fBsynonyms\fP の例です。 \fB(TAB)\fP はタブ文字( \fBU+0009\fP )という意味です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga(TAB)groonga(TAB)Senna .ft P .fi .UNINDENT .UNINDENT .sp コメント行をサポートしています。 \fB#\fP から始まる行は無視します。以下はコメント行の例です。 \fBgroonga\fP とある行はコメント行として無視されます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C #groonga(TAB)groonga(TAB)Senna mroonga(TAB)mroonga(TAB)groonga MySQL .ft P .fi .UNINDENT .UNINDENT .SS 制限 .sp 同義語を再読み込みするにはgroongaを再起動する必要があります。TSVファイルはプラグイン読み込み時に一度だけ読み込みます。 .SS 参考 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 詳細については select\-query\-expander を参照してください。 .UNINDENT .UNINDENT .UNINDENT .SS スコアラー .SS 概要 .sp Groongaにはスコアー関数をカスタマイズするスコアーモジュールがあります。スコアー関数はマッチしたレコードのスコアーを計算します。デフォルトのスコアー関数は出現単語数をスコアーにします。これはTF(term frequency。単語の出現数)と呼ばれている計算方法です。 .sp TFは高速なスコアー関数ですが、次のケースには適していません。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 検索クエリーが「the」や「a」のように非常によく出現する単語を含んでいる。 .IP \(bu 2 文書中に「They are keyword, keyword, keyword ... and keyword」というように同じキーワードが大量に含まれている。検索エンジンのスパマーはこのテクニックを使うかもしれません。 .UNINDENT .UNINDENT .UNINDENT .sp スコアー関数でこれらのケースを解決できます。例えば、 \fI\%TF\-IDF\fP (term frequency\-inverse document frequency。その文書中での単語の出現数を、文書全体での単語の出現数で割ったもの)は最初のケースを解決できます。 \fI\%Okapi BM25\fP は2番目のケースを解決できます。しかし、これらはTFより遅いです。 .sp Groongaは \fB/reference/scorers/scorer_tf_idf\fP としてTF\-IDFベースのスコアラーを提供しています。しかし、Okapi BM25ベースのスコアラーはまだ提供していません。 .INDENT 0.0 .INDENT 3.5 スコアー関数だけでスコアの計算をする必要はありません。スコアー関数は検索クエリーに非常に依存しています。検索クエリーだけでなく、マッチしたレコードのメタデータも使えないか検討しましょう。 .sp たとえば、Googleはスコアーの計算に \fI\%ページランク\fP を使っています。あなたも、データの種類(たとえば、「メモ」データよりも「タイトル」データの方が重要など)、タグ、位置情報などを使えないか検討してみましょう。 .sp スコアーの計算をスコアー関数だけで考えることはやめましょう。 .UNINDENT .UNINDENT .SS 使い方 .sp このセクションではスコアラーの使い方について説明します。 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp サンプルスキーマ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Memos TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Memos title COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Memos content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \e \-\-default_tokenizer TokenBigram \e \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms title_index COLUMN_INDEX|WITH_POSITION Memos title # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms content_index COLUMN_INDEX|WITH_POSITION Memos content # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp サンプルデータ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Memos [ { "_key": "memo1", "title": "Groonga is easy", "content": "Groonga is very easy full text search engine!" }, { "_key": "memo2", "title": "Mroonga is easy", "content": "Mroonga is more easier full text search engine!" }, { "_key": "memo3", "title": "Rroonga is easy", "content": "Ruby is very helpful." }, { "_key": "memo4", "title": "Groonga is fast", "content": "Groonga! Groonga! Groonga! Groonga is very fast!" }, { "_key": "memo5", "title": "PGroonga is fast", "content": "PGroonga is very fast!" }, { "_key": "memo6", "title": "PGroonga is useful", "content": "SQL is easy because many client libraries exist." }, { "_key": "memo7", "title": "Mroonga is also useful", "content": "MySQL has replication feature. Mroonga can use it." } ] # [[0, 1337566253.89858, 0.000355720520019531], 7] .ft P .fi .UNINDENT .UNINDENT .sp select\-match\-columns の中でscore関数を使うことができます。次に構文を示します。 .sp \fB/reference/scorers/scorer_tf_idf\fP のように、いくつかのスコアー関数には引数はありません。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C SCORE_FUNCTION(COLUMN) .ft P .fi .UNINDENT .UNINDENT .sp 重みを指定することができます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C SCORE_FUNCTION(COLUMN) * WEIGHT .ft P .fi .UNINDENT .UNINDENT .sp \fB/reference/scorers/scorer_tf_at_most\fP のように引数が必要なスコアー関数もあります。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C SCORE_FUNCTION(COLUMN, ARGUMENT1, ARGUMENT2, ...) .ft P .fi .UNINDENT .UNINDENT .sp 重みを指定することができます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C SCORE_FUNCTION(COLUMN, ARGUMENT1, ARGUMENT2, ...) * WEIGHT .ft P .fi .UNINDENT .UNINDENT .sp select\-match\-columns ではカラムごとに異なるスコア関数を使うことができます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C SCORE_FUNCTION1(COLUMN1) || SCORE_FUNCTION2(COLUMN2) * WEIGHT || SCORE_FUNCTION3(COLUMN3, ARGUMENT1) || ... .ft P .fi .UNINDENT .UNINDENT .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Memos \e \-\-match_columns "scorer_tf_idf(content)" \e \-\-query "Groonga" \e \-\-output_columns "content, _score" \e \-\-sortby "\-_score" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "content", # "Text" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Groonga! Groonga! Groonga! Groonga is very fast!", # 2 # ], # [ # "Groonga is very easy full text search engine!", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBGroonga! Groonga! Groonga! Groonga is very fast!\fP には \fBGroonga\fP が4つ含まれています。デフォルトのTFベースのスコアラーを使うと、 \fB_score\fP は \fB4\fP です。しかし、実際は \fB_score\fP は \fB2\fP になります。なぜなら、この \fBselect\fP コマンドはTF\-IDFベースの \fBscorer_tf_idf()\fP スコアラーを使っているからです。 .sp 以下は重みを使った例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Memos \e \-\-match_columns "scorer_tf_idf(content) * 10" \e \-\-query "Groonga" \e \-\-output_columns "content, _score" \e \-\-sortby "\-_score" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "content", # "Text" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Groonga! Groonga! Groonga! Groonga is very fast!", # 22 # ], # [ # "Groonga is very easy full text search engine!", # 10 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBGroonga! Groonga! Groonga! Groonga is very fast!\fP の \fB_score\fP は \fB22\fP です。重みを指定していない前の例では \fB_score\fP は \fB2\fP でした。 .sp 以下は必ず引数を1つ指定しなければいけないスコアラーを使う例です。 \fB/reference/scorers/scorer_tf_at_most\fP スコアラーには引数を1つ指定しなければいけません。このスコアラーを使うと、TFのスコアーの最大値を制限することができます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Memos \e \-\-match_columns "scorer_tf_at_most(content, 2.0)" \e \-\-query "Groonga" \e \-\-output_columns "content, _score" \e \-\-sortby "\-_score" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "content", # "Text" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Groonga! Groonga! Groonga! Groonga is very fast!", # 2 # ], # [ # "Groonga is very easy full text search engine!", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBGroonga! Groonga! Groonga! Groonga is very fast!\fP は \fBGroonga\fP を4つ含んでいます。もし、デフォルトのスコアラーである標準のTFベースのスコアラーを使っていた場合、 \fB_score\fP は \fB4\fP になります。しかし、実際の \fB_score\fP は \fB2\fP です。なぜなら、この \fBselect\fP コマンドが使っているスコアラーは最大スコアーを \fB2\fP に制限しているからです。 .sp 以下は複数のスコアラーを使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Memos \e \-\-match_columns "scorer_tf_idf(title) || scorer_tf_at_most(content, 2.0)" \e \-\-query "Groonga" \e \-\-output_columns "title, content, _score" \e \-\-sortby "\-_score" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "title", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Groonga is fast", # "Groonga! Groonga! Groonga! Groonga is very fast!", # 3 # ], # [ # "Groonga is easy", # "Groonga is very easy full text search engine!", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fB\-\-match_columns\fP は \fBscorer_tf_idf(title)\fP と \fBscorer_tf_at_most(content, 2.0)\fP を使っています。 \fB_score\fP の値はこれら2つの値の合計になります。 .sp 同じ \fB\-\-match_columns\fP の中でデフォルトのスコアラーとカスタムスコアラーを使うことができます。単にマッチ対象のカラムを指定するとデフォルトのスコアラーを使います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Memos \e \-\-match_columns "title || scorer_tf_at_most(content, 2.0)" \e \-\-query "Groonga" \e \-\-output_columns "title, content, _score" \e \-\-sortby "\-_score" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "title", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Groonga is fast", # "Groonga! Groonga! Groonga! Groonga is very fast!", # 3 # ], # [ # "Groonga is easy", # "Groonga is very easy full text search engine!", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この \fB\-\-match_columns\fP は \fBtitle\fP にはデフォルトのスコアラー(TF)を使い、 \fBcontent\fP には \fB/reference/scorers/scorer_tf_at_most\fP を使います。 \fB_score\fP の値はこれらのスコアラーの結果の合計になります。 .SS 組み込みスコアラー .sp 以下は組み込みのスコアラーです。 .SS \fBscorer_tf_at_most\fP .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 スコアラーは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.1 で追加. .SS 概要 .sp \fBscorer_tf_at_most\fP はTF(term frequency。単語の出現数)ベースのスコアラーです。 .sp TF\-IDFベースのスコアラーを含むTFベースのスコアラーは次のケースに対して適していません。 .sp 文書中に「They are keyword, keyword, keyword ... and keyword」というように同じキーワードが大量に含まれているとその文書のスコアーが高くなってしまいます。これは意図した挙動ではありません。検索エンジンのスパマーはこのテクニックを使うかもしれません。 .sp \fBscorer_tf_at_most\fP はTFベースのスコアラーですが、このケースを解決できます。 .sp \fBscorer_tf_at_most\fP はスコアーの最大値を制限します。つまり、 \fBscorer_tf_at_most\fP は1つのマッチの影響を制限することができるということです。 .sp 文書中に「They are keyword, keyword, keyword ... and keyword」というように同じキーワードが大量に含まれていても、 \fBscorer_tf_at_most(column, 2.0)\fP はスコアーの値として大きくても \fB2\fP しか返しません。 .INDENT 0.0 .INDENT 3.5 スコアー関数だけでスコアの計算をする必要はありません。スコアー関数は検索クエリーに非常に依存しています。検索クエリーだけでなく、マッチしたレコードのメタデータも使えないか検討しましょう。 .sp たとえば、Googleはスコアーの計算に \fI\%ページランク\fP を使っています。あなたも、データの種類(たとえば、「メモ」データよりも「タイトル」データの方が重要など)、タグ、位置情報などを使えないか検討してみましょう。 .sp スコアーの計算をスコアー関数だけで考えることはやめましょう。 .UNINDENT .UNINDENT .SS 構文 .sp このスコアラーの引数は1つです。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C scorer_tf_at_most(column, max) scorer_tf_at_most(index, max) .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp このセクションではscorerの使い方について説明します。 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp サンプルスキーマ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Logs TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs message COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \e \-\-default_tokenizer TokenBigram \e \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms message_index COLUMN_INDEX|WITH_POSITION Logs message # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp サンプルデータ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Logs [ {"message": "Notice"}, {"message": "Notice Notice"}, {"message": "Notice Notice Notice"}, {"message": "Notice Notice Notice Notice"}, {"message": "Notice Notice Notice Notice Notice"} ] # [[0, 1337566253.89858, 0.000355720520019531], 5] .ft P .fi .UNINDENT .UNINDENT .sp 次のように select\-match\-columns で \fBscorer_tf_at_most\fP を指定します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \e \-\-match_columns "scorer_tf_at_most(message, 3.0)" \e \-\-query "Notice" \e \-\-output_columns "message, _score" \e \-\-sortby "\-_score" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "message", # "Text" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Notice Notice Notice Notice Notice", # 3 # ], # [ # "Notice Notice Notice Notice", # 3 # ], # [ # "Notice Notice Notice", # 3 # ], # [ # "Notice Notice", # 2 # ], # [ # "Notice", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp もし、文書が \fBNotice\fP という単語を3個以上含んでいたら、スコアーは \fB3\fP になります。なぜなら、この \fBselect\fP ではスコアーの最大値を \fB3.0\fP と指定しているからです。 .sp もし、文書が \fBNotice\fP という単語を1つか2つしか含んでいなかったら、スコアーは \fB1\fP か \fB2\fP になります。なぜなら、スコアーが指定された最大値 \fB3.0\fP より小さいからです。 .SS 引数 .sp このセクションではすべての引数について説明します。 .SS 必須引数 .sp 1つだけ必須の引数があります。 .SS \fBcolumn\fP .sp マッチ対象のデータカラムです。このデータカラムにはインデックスが張られていなければいけません。 .SS \fBindex\fP .sp 検索に使うインデックスカラムです。 .SS 省略可能引数 .sp 省略可能な引数はありません。 .SS 戻り値 .sp このスコアラーは builtin\-type\-float でスコアーの値を返します。 .sp \fB/reference/commands/select\fP は \fBFloat\fP ではなく \fBInt32\fP で \fB_score\fP を返します。これは、後方互換性を維持するために \fBFloat\fP から \fBInt32\fP にキャストしているためです。 .sp スコアーは制限つきのTFで計算します。 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB\&../scorer\fP .UNINDENT .SS \fBscorer_tf_idf\fP .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 スコアラーは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.1 で追加. .SS 概要 .sp \fBscorer_tf_idf\fP は \fI\%TF\-IDF\fP (term frequency\-inverse document frequency。その文書中での単語の出現数を、その単語を文書の数で割ったもの)ベースのスコアー関数です。 .sp 簡単に言うと、TF\-IDFとはTF(term frequency。その文書中での単語出現数)をDF(document frequency。その単語を含むドキュメント数)で割ったものです。「TF」は「単語がたくさん出現している方がより重要」という意味を表します。「TFをDFで割る」というのは「重要な単語がたくさん出現している方がより重要」という意味を表します。 .sp Groongaのデフォルトのスコアー関数はTF(term frequency。単語の出現数)です。この関数は単語の重要度は考慮しませんが高速です。 .sp TF\-IDFは単語の重要度を考慮しますが、TFより遅くなります。 .sp TF\-IDFは多くの場合でTFよりも適切なスコアーを計算しますが、完璧ではありません。 .sp 「They are keyword, keyword, keyword ... and keyword」のように文書中に同じキーワードがたくさん含まれている場合、TFでもTF\-IDFでもスコアーが増えます。検索エンジンのスパマーはこのテクニックを使うかもしれません。しかし、TF\-IDFはこのテクニックを防ぐことができません。 .sp \fI\%Okapi BM25\fP はこのケースを解決できます。しかし、TF\-IDFよりも遅くなります。また、Groongaではまだ実装されていません。 .sp Groongaは \fBscorer_tf_at_most\fP スコアラーという別の方法でこのケースを解決できるスコアラーを提供しています。 .INDENT 0.0 .INDENT 3.5 スコアー関数だけでスコアの計算をする必要はありません。スコアー関数は検索クエリーに非常に依存しています。検索クエリーだけでなく、マッチしたレコードのメタデータも使えないか検討しましょう。 .sp たとえば、Googleはスコアーの計算に \fI\%ページランク\fP を使っています。あなたも、データの種類(たとえば、「メモ」データよりも「タイトル」データの方が重要など)、タグ、位置情報などを使えないか検討してみましょう。 .sp スコアーの計算をスコアー関数だけで考えることはやめましょう。 .UNINDENT .UNINDENT .SS 構文 .sp このスコアラーの引数は1つです。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C scorer_tf_idf(column) scorer_tf_idf(index) .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp このセクションではscorerの使い方について説明します。 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp サンプルスキーマ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Logs TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs message COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \e \-\-default_tokenizer TokenBigram \e \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms message_index COLUMN_INDEX|WITH_POSITION Logs message # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp サンプルデータ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Logs [ {"message": "Error"}, {"message": "Warning"}, {"message": "Warning Warning"}, {"message": "Warning Warning Warning"}, {"message": "Info"}, {"message": "Info Info"}, {"message": "Info Info Info"}, {"message": "Info Info Info Info"}, {"message": "Notice"}, {"message": "Notice Notice"}, {"message": "Notice Notice Notice"}, {"message": "Notice Notice Notice Notice"}, {"message": "Notice Notice Notice Notice Notice"} ] # [[0, 1337566253.89858, 0.000355720520019531], 13] .ft P .fi .UNINDENT .UNINDENT .sp select\-match\-columns の中で \fBscorer_tf_idf\fP を次のようにして指定できます: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \e \-\-match_columns "scorer_tf_idf(message)" \e \-\-query "Error OR Info" \e \-\-output_columns "message, _score" \e \-\-sortby "\-_score" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "message", # "Text" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Info Info Info Info", # 3 # ], # [ # "Error", # 2 # ], # [ # "Info Info Info", # 2 # ], # [ # "Info Info", # 1 # ], # [ # "Info", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBInfo Info Info\fP には \fBInfo\fP という単語が3回もでてきますが、 \fBInfo Info Info\fP も \fBError\fP もどちらもスコアーは \fB2\fP です。なぜなら、 \fBError\fP は \fBInfo\fP よりもより重要な単語だからです。 \fBInfo\fP を含むドキュメントの数は \fB4\fP です。 \fBError\fP を含むドキュメントの数は \fB1\fP です。少しのドキュメントにしか含まれていない単語はより特徴的な単語です。特徴的な単語は重要な単語です。 .SS 引数 .sp このセクションではすべての引数について説明します。 .SS 必須引数 .sp 1つだけ必須の引数があります。 .SS \fBcolumn\fP .sp マッチ対象のデータカラムです。このデータカラムにはインデックスが張られていなければいけません。 .SS \fBindex\fP .sp 検索に使うインデックスカラムです。 .SS 省略可能引数 .sp 省略可能な引数はありません。 .SS 戻り値 .sp このスコアラーは builtin\-type\-float でスコアーの値を返します。 .sp \fB/reference/commands/select\fP は \fBFloat\fP ではなく \fBInt32\fP で \fB_score\fP を返します。これは、後方互換性を維持するために \fBFloat\fP から \fBInt32\fP にキャストしているためです。 .sp スコアーはTF\-IDFベースのアルゴリズムで計算します。 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB\&../scorer\fP .UNINDENT .SS grn_expr .sp grn_exprは特定の条件にマッチするレコードを検索したり、データベースを操作するオブジェクトです。 \fBぐるんしき\fP と読みます。(由来は「Groongaの式」。) .sp データベースからレコードを検索する条件は条件式を集合演算で結合して表現できます。例えば、条件式には \fB等価条件式\fP や \fB小なり条件式\fP などがあります。集合演算には \fB積(AND)\fP 、 \fB和(OR)\fP 、 \fB差(NOT)\fP などがあります。gnr_exprはこれらの条件を使ってレコードを検索します。類似文書検索や近傍検索などといった高度な検索もgrn_exprで実行できます。柔軟な全文検索も実行できます。例えば、特定の単語にマッチしたときのヒットスコアを調整したり、検索結果数によって検索漏れの少ないアルゴリズムで再検索し、再現率を向上するといったことも実現できます。 .sp grn_exprを作る方法は3つあります: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB/reference/grn_expr/query_syntax\fP の文字列をパースする。 .IP \(bu 2 \fB/reference/grn_expr/script_syntax\fP の文字列をパースする。 .IP \(bu 2 grn_expr関連のAPIを呼ぶ。 .UNINDENT .UNINDENT .UNINDENT .sp \fB/reference/grn_expr/query_syntax\fP は一般的なインターネット検索サイトにある検索フォーム用の構文です。シンプルで使いやすいですが、制限があります。 \fB/reference/grn_expr/query_syntax\fP では実行できない条件式や集合演算があります。 \fB/reference/grn_expr/query_syntax\fP は \fB/reference/commands/select\fP の \fBquery\fP オプションで指定する検索条件で使えます。 .sp \fB/reference/grn_expr/script_syntax\fP はECMAScriptに似た構文です。 \fB/reference/grn_expr/script_syntax\fP ではすべての条件式と集合演算を使えます。 \fB/reference/grn_expr/script_syntax\fP は \fB/reference/commands/select\fP の \fBfilter\fP オプションで指定する検索条件や \fBscorer\fP オプションで指定する式で使えます。 .sp groongaをライブラリとして使うと、grn_expr関連のAPIを呼び出してgrn_exprを作ることができます。 \fB/reference/grn_expr/script_syntax\fP のように、APIを呼び出すと全ての機能を使えます。grn_exprを作る構文を新しく作るときにはAPIが便利です。APIは \fI\%rroonga\fP というGroongaのRubyバインディングで使われています。rroongaでは文字列をパースするのではなく、Rubyの構文を使ってgrn_exprを作ることができます。 .SS クエリー構文 .sp クエリー構文は一般的なWebの検索フォームで検索条件を指定するための構文です。Googleの検索フォームで使われている構文に似ています。例えば、 \fBword1 word2\fP は \fBword1\fP と \fBword2\fP の両方の単語を含んだレコードを検索するという意味です。 \fBword1 OR word2\fP は \fBword1\fP または \fBword2\fP のどちらかの単語を含んだレコードを検索します。 .sp クエリー構文は \fB条件式\fP と \fB結合式\fP と \fB代入式\fP から成ります。通常、 \fB代入式\fP は考えなくてよいです。なぜなら、 \fB代入式\fP は \fB/reference/commands/select\fP の \fB\-\-query\fP オプションでは無効になっているからです。groongaをライブラリとして使ったときは、クエリー構文のパーサーのオプションをカスタマイズすることで \fB代入式\fP を有効にすることができます。 .sp \fB条件式\fP は条件を指定します。 \fB結合式\fP は1つ以上の \fB条件式\fP 、 \fB結合式\fP 、 \fB代入式\fP から成ります。 \fB代入式\fP はカラムに値を代入します。 .SS サンプルデータ .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entries TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries n_likes COLUMN_SCALAR UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_key_index COLUMN_INDEX|WITH_POSITION Entries _key # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_content_index COLUMN_INDEX|WITH_POSITION Entries content # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Entries [ {"_key": "The first post!", "content": "Welcome! This is my first post!", "n_likes": 5}, {"_key": "Groonga", "content": "I started to use Groonga. It\(aqs very fast!", "n_likes": 10}, {"_key": "Mroonga", "content": "I also started to use Mroonga. It\(aqs also very fast! Really fast!", "n_likes": 15}, {"_key": "Good\-bye Senna", "content": "I migrated all Senna system!", "n_likes": 3}, {"_key": "Good\-bye Tritonn", "content": "I also migrated all Tritonn system!", "n_likes": 3} ] # [[0, 1337566253.89858, 0.000355720520019531], 5] .ft P .fi .UNINDENT .UNINDENT .sp ブログエントリ用の \fBEntries\fP テーブルがあります。各エントリはタイトルと内容と「いいね!」数を持っています。タイトルは \fBEntries\fP のキーとします。内容は \fBEntries.content\fP カラムの値とします。「いいね!」数は \fBEntries.n_likes\fP カラムの値とします。 .sp \fBEntries._key\fP カラムと \fBEntries.content\fP カラムには \fBTokenBigram\fP トークナイザーを使ったインデックスを作成します。そのため、 \fBEntries._key\fP と \fBEntries.content\fP は両方とも全文検索できます。 .sp これで例を示すためのスキーマとデータの準備ができました。 .SS エスケープ .sp クエリー構文には特別な文字があります。特別な文字それ自体を使うためには文字の前に \fB\e\fP をつけてエスケープしなければいけません。例えば、 \fB"\fP は特別な文字です。これは \fB\e"\fP というようにエスケープします。 .sp 以下が特別な文字のリストです: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB[space]\fP ( \fB[backslash][space]\fP とエスケープする。)( \fB[space]\fP をASCIIで言えば0x20の空白文字に置き換えて、 \fB[backslash]\fP を \fB\e\e\fP に置き換えてください。) .IP \(bu 2 \fB"\fP ( \fB\e"\fP とエスケープする。) .IP \(bu 2 \fB\(aq\fP ( \fB\e\(aq\fP とエスケープする。) .IP \(bu 2 \fB(\fP ( \fB\e(\fP とエスケープする。) .IP \(bu 2 \fB)\fP ( \fB\e)\fP とエスケープする。) .IP \(bu 2 \fB\e\fP ( \fB\e\e\fP とエスケープする。) .UNINDENT .UNINDENT .UNINDENT .sp \fB\e\fP (バックスラッシュ)以外はエスケープする代わりにクォートすることもできます。クォート中でバックスラッシュをエスケープするときは \fB\e\e\fP というようにバックスラッシュを使います。 .sp クォート構文は \fB"..."\fP または \fB\(aq...\(aq\fP です。 \fB"..."\fP クォート構文中では \fB"\fP を \fB\e"\fP にエスケープする必要があります。 \fB\(aq...\(aq\fP クォート構文中では \fB\(aq\fP を \fB\e\(aq\fP にエスケープする必要があります。例えば、 \fBAlice\(aqs brother (Bob)\fP は \fB"Alice\(aqs brother (Bob)"\fP あるいは \fB\(aqAlice\e\(aqs brother (Bob)\(aq\fP とクォートします。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 注意しなければならない大事な点があります。\fB\e\fP (バックスラッシュ)はコマンドラインシェルが解釈します。それゆえ例えば \fB(\fP それ自体を検索したいならシェルでは二重にエスケープ (\fB\e\e(\fP) しなければなりません。コマンドラインシェルは \fB\e\e(\fP を \fB\e(\fP と解釈してからGroongaに渡します。Groongaは \fB\e(\fP を \fB(\fP とみなし、\fB(\fP 自体をデータベースから検索します。もし意図した検索がGroongaで行えないなら、特別な文字を正しくエスケープしているか確認します。 .UNINDENT .UNINDENT .SS 条件式 .sp 以下は利用可能な条件式の一覧です。 .SS 全文検索条件 .sp 構文は \fBkeyword\fP です。 .sp \fB全文検索条件\fP はデフォルトのマッチカラムに対して全文検索するという条件を指定します。マッチカラムとは全文検索対象のカラムのことです。 .sp 全文検索に使うデフォルトのマッチカラムを指定する必要があります。マッチカラムは \fB/reference//commands/select\fP の \fB\-\-match_columns\fP オプションで指定します。デフォルトのマッチカラムを指定していない場合、この条件式は失敗します。 .sp この条件式は \fBkeyword\fP で全文検索をします。 \fBkeyword\fP には空白を含めることはできません。 \fBsearch keyword\fP というように空白を含んでいる場合は、 \fBsearch\fP と \fBkeyword\fP という2つの全文検索条件を指定したことになります。もし、キーワードに空白を含めたい場合は以下で説明する \fBフレーズ検索条件\fP を使ってください。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-match_columns content \-\-query fast # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBcontent\fP カラムの値に \fBfast\fP という単語を含んでいるレコードにマッチします。 .sp \fBcontent\fP カラムはデフォルトのマッチカラムです。 .SS フレーズ検索条件 .sp 構文は \fB"search keyword"\fP です。 .sp \fBフレーズ検索条件\fP はデフォルトのマッチカラムに対してフレーズ検索するという条件を指定します。 .sp 全文検索に使うデフォルトのマッチカラムを指定する必要があります。マッチカラムは \fB/reference//commands/select\fP の \fB\-\-match_columns\fP オプションで指定します。デフォルトのマッチカラムを指定していない場合、この条件式は失敗します。 .sp この条件式は \fBsearch keyword\fP でフレーズ検索をします。フレーズ検索は \fBsearch\fP と \fBkeyword\fP がこの順番で隣接して含まれているレコードにマッチします。つまり、 \fBPut a search keyword in the form\fP にはマッチしますが、 \fBSearch by the keyword\fP や \fBThere is a keyword. Search by it!\fP にはマッチしません。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-match_columns content \-\-query \(aq"I started"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBcontent\fP カラムの値に \fBI started\fP というフレーズを含んでいるレコードにマッチします。 \fBI also started\fP にはマッチしません。これは \fBI\fP と \fBstarted\fP が隣接していないからです。 .sp \fBcontent\fP カラムはデフォルトのマッチカラムです。 .SS 全文検索条件(マッチカラム指定あり) .sp 構文は \fBcolumn:@keyword\fP です。 .sp これは \fB全文検索条件\fP と似ていますが、デフォルトのマッチカラムは必要ありません。全文検索用のマッチカラムは \fB/reference/commands/select\fP の \fB\-\-match_columns\fP オプションではなく \fBcolumn:\fP で指定します。 .sp この条件式は異なったカラムに対して複数の全文検索をしたい場合に便利です。 \fB\-\-match_columns\fP オプションで指定するデフォルトのマッチカラムは複数回指定することができません。2つめのマッチカラムを指定するためにはこの条件式を使う必要があります。 .sp \fB全文検索条件\fP と \fB全文検索条件(マッチカラム指定あり)\fP の違いは高度なマッチカラムをサポートしているかどうかです。 \fB全文検索条件\fP は高度なマッチカラムをサポートしていますが、 \fB全文検索条件(マッチカラム指定あり)\fP はサポートしていません。高度なマッチカラムには以下の機能があります: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 重みをサポートしている。 .IP \(bu 2 複数のカラムを指定できる。 .IP \(bu 2 マッチカラムとしてインデックスカラムを使える。 .UNINDENT .UNINDENT .UNINDENT .sp これらについては \fB/reference/commands/select\fP の \fB\-\-match_columns\fP オプションを参照してください。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query content:@fast # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBcontent\fP カラムの値に \fBfast\fP という単語を含んでいるレコードにマッチします。 .SS フレーズ検索条件(マッチカラム指定あり) .sp 構文は \fBcolumn:@"search keyword"\fP です。 .sp これは \fBフレーズ検索条件\fP に似ていますが、デフォルトのマッチカラムは必要ありません。フレーズ検索用のマッチカラムは \fB/reference/commands/select\fP の \fB\-\-match_columns\fP オプションではなく \fBcolumn:\fP で指定します。 .sp \fBフレーズ検索条件\fP と \fBフレーズ検索条件(マッチカラム指定あり)\fP は \fB全文検索条件\fP と \fB全文検索条件(マッチカラム指定あり)\fP の関係と似ています。 \fBフレーズ検索条件\fP は高度なマッチカラムをサポートしていますが、 \fBフレーズ検索条件(マッチカラム指定あり)\fP はサポートしていません。高度なマッチカラムについては \fB全文検索条件(マッチカラム指定あり)\fP を参照してください。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query \(aqcontent:@"I started"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBcontent\fP カラムの値に \fBI started\fP というフレーズを含んでいるレコードにマッチします。 \fBI also started\fP にはマッチしません。これは \fBI\fP と \fBstarted\fP が隣接していないからです。 .SS 前方一致検索条件 .sp 構文は \fBcolumn:^value\fP または \fBvalue*\fP です。 .sp この条件式は \fBvalue\fP で前方一致検索をします。前方一致検索は \fBvalue\fP で始まる単語を含むレコードを検索します。 .sp カラムの値を高速に前方一致検索できます。ただし、そのカラムにはインデックスを作成し、そのインデックス用のテーブルをパトリシアトライ( \fBTABLE_PAT_KEY\fP )またはダブル配列トライ( \fBTABLE_DAT_KEY\fP )にしなければいけません。あるいは、パトリシアトライテーブルまたはダブル配列テーブルの \fB_key\fP も高速に前方一致検索できます。 \fB_key\fP にインデックスを作成する必要はありません。 .sp 他の種類のテーブルでも前方一致検索を使えますがレコード全件を処理します。レコード数が少ない場合には問題ありませんが、レコード数が多いと時間がかかります。 .sp \fB全文検索条件\fP や \fBフレーズ検索条件\fP と異なり、デフォルトのマッチカラムは必要ありません。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query \(aq_key:^Goo\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3 # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fB_key\fP カラムの値が \fBGoo\fP で始まる単語を含むレコードにマッチします。この式には \fBGood\-bye Senna\fP と \fBGood\-bye Tritonn\fP がマッチします。 .SS 後方一致検索条件 .sp 構文は \fBcolumn:$value\fP です。 .sp この条件式は \fBvalue\fP で後方一致検索します。後方一致検索は \fBvalue\fP で終わる単語を含むレコードを検索します。 .sp カラムの値を高速に後方一致検索できます。ただし、そのカラムにはインデックスを作成し、そのインデックス用のテーブルを \fBKEY_WITH_SIS\fP フラグ付きのパトリシアトライテーブル( \fBTABLE_PAT_KEY\fP )にしなければいけません。 \fBKEY_WITH_SIS\fP フラグ付きのパトリシアトライテーブル( \fBTABLE_PAT_KEY\fP )の \fB_key\fP 擬似カラムの値も高速に後方一致検索できます。 \fB_key\fP にはインデックスを作成する必要はありません。 \fB_key\fP ベースの高速な後方一致検索よりもカラムベースの高速な後方一致検索を使うことをおすすめします。 \fB_key\fP ベースの高速な後方一致検索は自動的に登録された部分文字列も返ってきます。(TODO: 後方一致検索に関するドキュメントを書いてここからリンクを張る。) .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 高速な後方一致検索は日本語のひらがななど非ASCII文字にしか使えません。ASCII文字には高速な後方一致検索を使えません。 .UNINDENT .UNINDENT .sp 後方一致検索は他の種類のテーブルもしくはパトリシアトライを \fBKEY_WITH_SIS\fP フラグなしで使用しているテーブルに対しても使えますが、レコード全件を処理します。レコード数が少ない場合には問題ありませんが、レコード数が多いと時間がかかります。 .sp \fB全文検索条件\fP や \fBフレーズ検索条件\fP と異なり、デフォルトのマッチカラムは必要ありません。 .sp 簡単な例です。ASCII文字ではない文字である日本語のひらがなに対して高速な後方一致検索をしています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Titles TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Titles content COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create SuffixSearchTerms TABLE_PAT_KEY|KEY_WITH_SIS ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create SuffixSearchTerms index COLUMN_INDEX Titles content # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Titles [ {"content": "ぐるんが"}, {"content": "むるんが"}, {"content": "せな"}, {"content": "とりとん"} ] # [[0, 1337566253.89858, 0.000355720520019531], 4] select Titles \-\-query \(aqcontent:$んが\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "content", # "ShortText" # ] # ], # [ # 2, # "むるんが" # ], # [ # 1, # "ぐるんが" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBcontent\fP カラムの値が \fBんが\fP で終わるレコードにマッチします。この場合は \fBぐるんが\fP と \fBむるんが\fP にマッチします。 .SS 等価条件 .sp 構文は \fBcolumn:value\fP です。 .sp \fBcolumn\fP の値が \fBvalue\fP と等しいレコードにマッチします。 .sp \fB全文検索条件\fP や \fBフレーズ検索条件\fP と異なり、デフォルトのマッチカラムは必要ありません。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query _key:Groonga # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fB_key\fP カラムの値が \fBGroonga\fP のレコードにマッチします。 .SS 不等価条件 .sp 構文は \fBcolumn:!value\fP です。 .sp \fBcolumn\fP の値が \fBvalue\fP と等しくないレコードにマッチします。 .sp \fB全文検索条件\fP や \fBフレーズ検索条件\fP と異なり、デフォルトのマッチカラムは必要ありません。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query _key:!Groonga # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 4 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fB_key\fP カラムの値が \fBGroonga\fP ではないレコードにマッチします。 .SS 小なり条件 .sp 構文は \fBcolumn:value\fP です。 .sp \fBcolumn\fP の値が \fBvalue\fP より大きいレコードにマッチします。 .sp \fBcolumn\fP の型が \fBInt32\fP などの数値型の場合、 \fBcolumn\fP の値と \fBvalue\fP は数値として比較します。もし、 \fBcolumn\fP の型が \fBShortText\fP のような文字列型の場合は \fBcolumn\fP の値と \fBvalue\fP はビット列として比較します。 .sp \fB全文検索条件\fP や \fBフレーズ検索条件\fP と異なり、デフォルトのマッチカラムは必要ありません。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query n_likes:>10 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB10\fP より大きいレコードにマッチします。 .SS 以下条件 .sp 構文は \fBcolumn:<=value\fP です。 .sp \fBcolumn\fP の値が \fBvalue\fP 以下のレコードにマッチします。 .sp \fBcolumn\fP の型が \fBInt32\fP などの数値型の場合、 \fBcolumn\fP の値と \fBvalue\fP は数値として比較します。もし、 \fBcolumn\fP の型が \fBShortText\fP のような文字列型の場合は \fBcolumn\fP の値と \fBvalue\fP はビット列として比較します。 .sp \fB全文検索条件\fP や \fBフレーズ検索条件\fP と異なり、デフォルトのマッチカラムは必要ありません。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query n_likes:<=10 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 4 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3 # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB10\fP 以下のレコードにマッチします。 .SS 以上条件 .sp 構文は \fBcolumn:>=value\fP です。 .sp \fBcolumn\fP の値が \fBvalue\fP 以上のレコードにマッチします。 .sp \fBcolumn\fP の型が \fBInt32\fP などの数値型の場合、 \fBcolumn\fP の値と \fBvalue\fP は数値として比較します。もし、 \fBcolumn\fP の型が \fBShortText\fP のような文字列型の場合は \fBcolumn\fP の値と \fBvalue\fP はビット列として比較します。 .sp \fB全文検索条件\fP や \fBフレーズ検索条件\fP と異なり、デフォルトのマッチカラムは必要ありません。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query n_likes:>=10 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB10\fP 以上のレコードにマッチします。 .SS 正規表現条件 .sp バージョン 5.0.1 で追加. .sp 構文は \fBcolumn:~pattern\fP です。 .sp \fBcolumn\fP の値が \fBpattern\fP にマッチするレコードにマッチします。 \fBpattern\fP は正しい \fB/reference/regular_expression\fP でなければいけません。 .sp 以下の例はパターンとして \fB\&.roonga\fP を使っています。このパターンは \fBGroonga\fP 、 \fBMroonga\fP といった文字列にマッチします。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query content:~.roonga # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 多くの場合、各レコードの対して順に正規表現を評価します。そのため、多くのレコードがある場合は遅くなるかもしれません。 .sp いくつかのケースでは、Groongaはインデックスを使って正規表現を評価します。これはとても高速です。詳細は \fB/reference/regular_expression\fP を参照してください。 .SS 結合式 .sp 以下は利用可能な結合式のリストです。 .SS 論理和 .sp 構文は \fBa OR b\fP です。 .sp \fBa\fP と \fBb\fP は条件式または結合式または代入式です。 .sp \fBa\fP と \fBb\fP のうち少なくともひとつの式がマッチすれば \fBa OR b\fP はマッチします。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query \(aqn_likes:>10 OR content:@senna\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB10\fP より大きいか \fBcontent\fP カラムの値に \fBsenna\fP という単語を含んでいるレコードにマッチします。 .SS 論理積 .sp 構文は \fBa + b\fP です。あるいは単に \fBa b\fP と書くこともできます。 .sp \fBa\fP と \fBb\fP は条件式または結合式または代入式です。 .sp \fBa\fP と \fBb\fP の両方にマッチすれば \fBa + b\fP はマッチします。 .sp \fB+a\fP というように最初の式に \fB+\fP を指定することもできます。この場合は \fB+\fP は単に無視されます。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query \(aqn_likes:>=10 + content:@groonga\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB10\fP 以上で \fBcontent\fP カラムの値に \fBgroonga\fP という単語を含むレコードにマッチします。 .SS 論理否定 .sp 構文は \fBa \- b\fP です。 .sp \fBa\fP と \fBb\fP は条件式または結合式または代入式です。 .sp \fBa\fP にマッチして \fBb\fP にマッチしなければ、 \fBa \- b\fP はマッチします。 .sp \fB\-a\fP というように最初の式に \fB\-\fP を指定することはできません。この場合は構文エラーになります。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query \(aqn_likes:>=10 \- content:@groonga\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB10\fP 以上で \fBcontent\fP カラムの値に \fBgroonga\fP という単語を含まないレコードにマッチします。 .SS グループ化 .sp 構文は \fB(...)\fP です。 \fB\&...\fP は空白区切りの式のリストです。 .sp \fB(...)\fP は1つ以上の式をグループ化します。グループ化された式は1つの式として処理されます。 \fBa b OR c\fP は \fBa\fP と \fBb\fP の両方がマッチするか、 \fBc\fP がマッチすれば式全体がマッチする、という意味になります。 \fBa (b OR c)\fP は \fBa\fP がマッチして \fBb\fP と \fBc\fP はどちらか一方がマッチすれば式全体がマッチする、という意味になります。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-query \(aqn_likes:<5 content:@senna OR content:@fast\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] select Entries \-\-query \(aqn_likes:<5 (content:@senna OR content:@fast)\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 最初の式はグループ化していません。この式は \fBn_likes:<5\fP と \fBcontent:@senna\fP の両方がマッチするか \fBcontent:@fast\fP がマッチするレコードにマッチします。 .sp 2番目の式はグループ化しています。この式は \fBn_likes:<5\fP にマッチして、 \fBcontent:@senna\fP と \fBcontent:@fast\fP は少なくともどちらか一方にマッチするレコードにマッチします。 .SS 代入式 .sp このセクションは高度なユーザー向けです。それは、代入式は \fB/reference/commands/select\fP の \fB\-\-query\fP オプションではデフォルトでは無効になっているからです。代入式を有効にするには \fB\-\-query_flags\fP オプションに \fBALLOW_COLUMN|ALLOW_UPDATE\fP を指定してください。 .sp クエリー構文における代入式にはいくつか制限があります。代入にはクエリー構文の代りに \fB/reference/grn_expr/script_syntax\fP を使ってください。 .sp 代入式の構文は1つだけです。 \fBcolumn:=value\fP となります。 .sp \fBvalue\fP は \fBcolumn\fP に代入されます。 \fBvalue\fP は常にクエリー構文では文字列として扱われます。 \fBvalue\fP は \fBcolumn\fP の型へと自動的にキャストされます。 キャストにはいくつか制限があります。例えば \fBtrue\fP や \fBfalse\fP といった真偽値のリテラルを \fBBool\fP 型のカラムに使用することができません。 \fBfalse\fP については空文字列を使う必要がありますが、クエリー構文は \fBcolumn:=\fP 構文をサポートしていません。 .sp キャストについては \fB/reference/cast\fP を参照してください。 .SS スクリプト構文 .sp スクリプト構文は複雑な検索条件を指定するための構文です。この構文はECMAScriptに似ています。例えば、 \fB_key == "book"\fP は \fB_key\fP の値が \fB"book"\fP のレコードを検索するという意味です。 \fBquery_syntax\fP ではすべての値は文字列でしたが、スクリプト構文では値に型があります。例えば、 \fB"book"\fP は文字列で \fB1\fP は整数で、 \fBTokenBigram\fP は \fBTokenBigram\fP という名前のオブジェクトです。 .sp スクリプト構文はECMAScriptの構文と完全に互換性があるわけではありません。例えば、 \fBif\fP 制御文や \fBfor\fP 繰り返し文や変数定義文といった文をサポートしていません。関数定義もサポートしていません。しかし、独自の演算子を追加しています。独自の演算子はECMAScriptの構文を説明した後に説明します。 .SS セキュリティー .sp セキュリティーの観点からユーザーからの入力をそのままGroongaに渡すべきではありません。悪意のあるユーザーがそのユーザーには参照できてはいけないレコードを取得するクエリーを入力するかもしれないからです。 .sp 例えば、以下の状況を考えてみましょう。 .sp あるGroongaアプリケーションがGroongaへのリクエストを次のようなプログラムで構築していたとします。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C filter = "column @ \e"#{user_input}\e"" select_options = { # ... :filter => filter, } groonga_client.select(select_options) .ft P .fi .UNINDENT .UNINDENT .sp \fBuser_input\fP はユーザーからの入力です。入力が \fBquery\fP だった場合は構築された select\-filter 引数は次のようになります。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column @ "query" .ft P .fi .UNINDENT .UNINDENT .sp もし、入力が \fBx" || true || "\fP だった場合は構築された select\-filter 引数は次のようになります。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column @ "x" || true || "" .ft P .fi .UNINDENT .UNINDENT .sp このクエリーはすべてのレコードにマッチします。このユーザーはデータベース中のすべてのレコードを取得するでしょう。このユーザーには悪意があったのかもしれません。 .sp ユーザーからの入力では値だけを受け取るようにする方がよいです。これは、ユーザーからの入力には \fB@\fP や \fB&&\fP のような演算子を受け付けないようにするということです。もし、演算子も受け付けるようにするなら、ユーザーは悪意のあるクエリーを作ることができます。 .sp ユーザーの入力が値だけなら、入力された値をエスケープすることで悪意のあるクエリーを防ぐことができます。以下はユーザーの入力をどのようにエスケープすればよいかのリストです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 真の値: \fBtrue\fP に変換してください。 .IP \(bu 2 負の値: \fBfalse\fP に変換してください。 .IP \(bu 2 数値: \fI\%整数\fP または \fI\%浮動小数点数\fP に変換してください。例えば、 \fB1.2\fP 、 \fB\-10\fP 、 \fB314e\-2\fP といった具合です。 .IP \(bu 2 文字列:文字列中の \fB"\fP を \fB\e"\fP で、 \fB\e\fP を \fB\e\e\fP で置換してください。その後、置換した文字列を \fB"\fP で囲んでください。例えば、 \fBdouble " quote and back \e slash\fP は \fB"double \e" quote and back \e\e slash"\fP に変換します。 .UNINDENT .UNINDENT .UNINDENT .SS サンプルデータ .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entries TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries n_likes COLUMN_SCALAR UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_key_index COLUMN_INDEX|WITH_POSITION Entries _key # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_content_index COLUMN_INDEX|WITH_POSITION Entries content # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Entries [ {"_key": "The first post!", "content": "Welcome! This is my first post!", "n_likes": 5}, {"_key": "Groonga", "content": "I started to use Groonga. It\(aqs very fast!", "n_likes": 10}, {"_key": "Mroonga", "content": "I also started to use Mroonga. It\(aqs also very fast! Really fast!", "n_likes": 15}, {"_key": "Good\-bye Senna", "content": "I migrated all Senna system!", "n_likes": 3}, {"_key": "Good\-bye Tritonn", "content": "I also migrated all Tritonn system!", "n_likes": 3} ] # [[0, 1337566253.89858, 0.000355720520019531], 5] .ft P .fi .UNINDENT .UNINDENT .sp ブログエントリ用の \fBEntries\fP テーブルがあります。各エントリはタイトルと内容と「いいね!」数を持っています。タイトルは \fBEntries\fP のキーとします。内容は \fBEntries.content\fP カラムの値とします。「いいね!」数は \fBEntries.n_likes\fP カラムの値とします。 .sp \fBEntries._key\fP カラムと \fBEntries.content\fP カラムには \fBTokenBigram\fP トークナイザーを使ったインデックスを作成します。そのため、 \fBEntries._key\fP と \fBEntries.content\fP は両方とも全文検索できます。 .sp これで例を示すためのスキーマとデータの準備ができました。 .SS リテラル .SS 整数 .sp 整数リテラルは \fB1234567890\fP のような \fB0\fP から \fB9\fP の並びです。 \fB+29\fP や \fB\-29\fP のように符号として最初に \fB+\fP または \fB\-\fP をつけることができます。整数リテラルは10進数です。8進数や16進数などは使えません。 .sp 整数リテラルの最大値は \fB9223372036854775807\fP ( \fB= 2 ** 63 \- 1\fP )です。最小値は \fB\-9223372036854775808\fP ( \fB= \-(2 ** 63)\fP )です。 .SS 浮動小数点数 .sp 浮動小数点数リテラルは \fB3.14\fP のように、まず \fB0\fP から \fB9\fP 、次に \fB\&.\fP 、最後に \fB0\fP から \fB9\fP という並びです。 \fB+3.14\fP や \fB\-3.14\fP のように符号として最初に \fB+\fP または \fB\-\fP をつけることができます。 \fB${基数}e${指数}\fP や \fB${基数}E${指数}\fP というフォーマットもサポートしています。例えば、 \fB314e\-2\fP は \fB3.14\fP と同じです。 .SS 文字列 .sp 文字列リテラルは \fB"..."\fP です。リテラル中の \fB"\fP は \fB\e"\fP というように \fB\e\fP を前につけてエスケープします。例えば、 \fB"Say \e"Hello!\e"."\fP は \fBSay "Hello!".\fP という文字列のリテラルです。 .sp 文字列エンコーディングはデータベースのエンコーディングと合わせなければいけません。デフォルトのエンコーディングはUTF\-8です。これは configure の \fB\-\-with\-default\-encoding\fP オプションや \fB/reference/executables/groonga\fP の \fB\-\-encodiong\fP などで変更できます。 .SS 真偽値 .sp 真偽値のリテラルは \fBtrue\fP と \fBfalse\fP です。 \fBtrue\fP は真という意味で、 \fBfalse\fP は偽という意味です。 .SS NULL .sp NULLのリテラルは \fBnull\fP です。GroongaはNULL値をサポートしてませんが、NULLリテラルをサポートしています。 .SS 時間 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 これはgroonga独自の記法です。 .UNINDENT .UNINDENT .sp 時間のリテラルはありません。文字列での時間記法、整数での時間記法または浮動小数点数での時間記法を使ってください。 .sp 文字列での時間記法は \fB"YYYY/MM/DD hh:mm:ss.uuuuuu"\fP または \fB"YYYY\-MM\-DD hh:mm:ss.uuuuuu"\fP です。 \fBYYYY\fP は西暦、 \fBMM\fP は月、 \fBDD\fP は日、 \fBhh\fP は時、 \fBmm\fP は分、 \fBss\fP は秒、 \fBuuuuuu\fP はマイクロ秒です。ローカル時間です。例えば、 \fB"2012/07/23 02:41:10.436218"\fP はISO 8601形式では \fB2012\-07\-23T02:41:10.436218\fP になります。 .sp 整数での時間記法はUTC時間で1970年1月1日0時0分0秒からの経過秒数を使います。この時間はPOSIX時間とも呼ばれています。例えば、 \fB1343011270\fP はISO 8601形式では \fB2012\-07\-23T02:41:10Z\fP になります。 .sp 浮動小数点数での時間記法はUTC時間で1970年1月1日0時0分0秒からの経過秒数と経過マイクロ秒数を使います。例えば、 \fB1343011270.436218\fP はISO 8601形式では \fB2012\-07\-23T02:41:10.346218Z\fP になります。 .SS 座標値 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 これはgroonga独自の記法です。 .UNINDENT .UNINDENT .sp 座標値のリテラルはありません。文字列での座標値記法を使ってください。 .sp 文字列での座標値記法には以下のパターンがあります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB"ミリ秒表記の緯度xミリ秒表記の経度"\fP .IP \(bu 2 \fB"ミリ秒表記の緯度,ミリ秒表記の経度"\fP .IP \(bu 2 \fB"度数表記の緯度x度数表記の経度"\fP .IP \(bu 2 \fB"度数表記の緯度,度数表記の経度"\fP .UNINDENT .UNINDENT .UNINDENT .sp \fBx\fP と \fB,\fP のどちらも区切り文字として使えます。緯度と経度はミリ秒または度数で指定します。 .SS 配列 .sp 配列リテラルは \fB[element1, element2, ...]\fP です。 .SS オブジェクトリテラル .sp オブジェクトのリテラルは \fB{name1: value1, name2: value2, ...}\fP です。groongaはまだオブジェクトリテラルをサポートしていません。 .SS 制御構文 .sp スクリプト構文は文をサポートしていません。そのため、 \fBif\fP のような制御文を使うことはできません。制御用の構文は \fBA ? B : C\fP 式だけ使うことができます。 .sp \fBA ? B : C\fP は \fBA\fP が真なら \fBB\fP を返して、そうでなかったら \fBC\fP を返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == (_id == 1 ? 5 : 3)\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3 # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fB_id\fP カラムの値が \fB1\fP で \fBn_likes\fP カラムの値が \fB5\fP または \fB_id\fP カラムの値が \fB1\fP ではなく \fBn_likes\fP カラムの値が \fB3\fP のレコードにマッチします。 .SS グループ化 .sp 構文は \fB(...)\fP です。 \fB\&...\fP はカンマ区切りの式のリストです。 .sp \fB(...)\fP は1つ以上の式をグループ化します。グループ化された式は1つの式として処理されます。 \fBa && b || c\fP は \fBa\fP と \fBb\fP の両方がマッチするか、 \fBc\fP がマッチすれば式全体がマッチする、という意味になります。 \fBa && (b || c)\fP は \fBa\fP がマッチして \fBb\fP と \fBc\fP はどちらか一方がマッチすれば式全体がマッチする、という意味になります。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes < 5 && content @ "senna" || content @ "fast"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] select Entries \-\-filter \(aqn_likes < 5 && (content @ "senna" || content @ "fast")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 最初の式はグループ化していません。この式は \fBn_likes < 5\fP と \fBcontent @ "senna"\fP の両方がマッチするか \fBcontent @ "fast"\fP がマッチするレコードにマッチします。 .sp 2番目の式はグループ化しています。この式は \fBn_likes < 5\fP にマッチして、 \fBcontent @ "senna"\fP と \fBcontent @ "fast"\fP は少なくともどちらか一方にマッチするレコードにマッチします。 .SS 関数呼び出し .sp 構文は \fBname(arugment1, argument2, ...)\fP です。 .sp \fBname(argument1, argument2, ...)\fP は \fBname\fP という関数を引数 \fBargument1\fP, \fBargument2\fP, \fB\&...\fP で呼び出します。 .sp 利用可能な関数の一覧は \fB/reference/function\fP を参照してください。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqedit_distance(_key, "Groonga") <= 1\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fB/reference/functions/edit_distance\fP を使っています。この式は \fB_key\fP カラムの値が \fB"Groonga"\fP に似ているレコードにマッチします。 \fB"Groonga"\fP との類似度は編集距離で計算します。編集距離が1文字以下なら似ているとします。この場合は \fB"Groonga"\fP と \fB"Mroonga"\fP が似ている値です。 .SS 基本的な演算子 .sp groongaはECMAScriptで定義されている演算子をサポートしています。 .SS 算術演算子 .sp 以下は算術演算子の説明です。 .SS 加算演算子 .sp 構文は \fBnumber1 + number2\fP です。 .sp この演算子は \fBnumber1\fP と \fBnumber2\fP を足した結果を返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == 10 + 5\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB15\fP (= \fB10 + 5\fP) のレコードにマッチします。 .SS 減算演算子 .sp 構文は \fBnumber1 \- number2\fP です。 .sp この演算子は \fBnumber2\fP から \fBnumber1\fP を引いた結果を返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == 20 \- 5\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB15\fP (= \fB20 \- 5\fP) のレコードにマッチします。 .SS 乗算演算子 .sp 構文は \fBnumber1 * number2\fP です。 .sp この演算子は \fBnumber1\fP と \fBnumber2\fP を掛けた結果を返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == 3 * 5\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB15\fP (= \fB3 * 5\fP) のレコードにマッチします。 .SS 除算演算子 .sp 構文は \fBnumber1 / number2\fP と \fBnumber1 % number2\fP です。 .sp この演算子は \fBnumber2\fP を \fBnumber1\fP で割ります。 \fB/\fP は商を返します。 \fB%\fP は余りを返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == 26 / 7\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB3\fP (= \fB26 / 7\fP) のレコードにマッチします。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == 26 % 7\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB5\fP (= \fB26 % 7\fP) の値にマッチします。 .SS 論理演算子 .sp 以下は論理演算子の説明です。 .SS 論理否定演算子 .sp 構文は \fB!condition\fP です。 .sp この演算子は \fBcondition\fP の真偽値を反転します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aq!(n_likes == 5)\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 4 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3 # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB5\fP ではない式にマッチします。 .SS 論理積演算子 .sp 構文は \fBcondition1 && condition2\fP です。 .sp この演算子は \fBcondition1\fP と \fBcondition2\fP の両方が真のときに真を返し、そうでなければ偽を返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqcontent @ "fast" && n_likes >= 10\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBcontent\fP カラムの値が \fBfast\fP を含んでいて、 \fBn_likes\fP カラムの値が \fB10\fP 以上のレコードにマッチします。 .SS 論理和演算子 .sp 構文は \fBcondition1 || condition2\fP です。 .sp この演算子は \fBcondition1\fP と \fBcondition2\fP のどちらか一方が真のときに真を返し、そうでなければ偽を返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == 5 || n_likes == 10\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5 # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB5\fP または \fB10\fP のレコードにマッチします。 .SS 論理差演算子 .sp 構文は \fBcondition1 &! condition2\fP です。 .sp この演算子は \fBcondition1\fP が真で \fBcondition2\fP が偽のときに真を返し、そうでなければ偽を返します。差集合を返すということです。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqcontent @ "fast" &! content @ "mroonga"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBcontent\fP カラムの値が \fBfast\fP を含んでいるが \fBmroonga\fP を含んでいないレコードにマッチします。 .SS ビット演算子 .sp 以下はビット演算子の説明です。 .SS ビット否定演算子 .sp 構文は \fB~number\fP です。 .sp この演算子は \fBnumber\fP の各ビットを反転した結果を返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aq~n_likes == \-6\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB5\fP のレコードにマッチします。なぜならば、 \fB5\fP の各ビットを反転すると \fB\-6\fP になるからです。 .SS ビット論理積演算子 .sp 構文は \fBnumber1 & number2\fP です。 .sp この演算子は \fBnumber1\fP と \fBnumber2\fP をビット単位で論理積をした結果を返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aq(n_likes & 1) == 1\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 4 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が偶数のレコードにマッチします。なぜならば、偶数と \fB1\fP のビット単位の論理積は \fB1\fP になり、奇数と \fB1\fP のビット単位の論理積は \fB0\fP になるからです。 .SS ビット論理和演算子 .sp 構文は \fBnumber1 | number2\fP です。 .sp この演算子は \fBnumber1\fP と \fBnumber2\fP をビット単位で論理和した結果を返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == (1 | 4)\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB5\fP (= \fB1 | 4\fP) のレコードにマッチします。 .SS ビット排他的論理和演算子 .sp 構文は \fBnumber1 ^ number2\fP です。 .sp この演算子は \fBnumber1\fP と \fBnumber2\fP をビット単位で排他的論理和した結果を返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == (10 ^ 15)\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB5\fP (= \fB10 ^ 15\fP) の値にマッチします。 .SS シフト演算子 .sp 以下はシフト演算子の説明です。 .SS 左シフト演算子 .sp 構文は \fBnumber1 << number2\fP です。 .sp この演算子は \fBnumber1\fP のビットを左に \fBnumber2\fP ビットシフトする。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == (5 << 1)\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB10\fP (= \fB5 << 1\fP) のレコードにマッチします。 .SS 符号付き右シフト演算子 .sp 構文は \fBnumber1 >> number2\fP です。 .sp この演算子は \fBnumber1\fP のビットを右に \fBnumber2\fP ビットシフトします。結果の符号は \fBnumber1\fP の符号と同じです。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == \-(\-10 >> 1)\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB5\fP (= \fB\-(\-10 >> 1)\fP = \fB\-(\-5)\fP) のレコードにマッチします。 .SS 符号なし右シフト演算子 .sp 構文は \fBnumber1 >>> number2\fP です。 .sp この演算子は \fBnumber1\fP のビットを右に \fBnumber2\fP ビットシフトします。一番左の \fBnumber2\fP ビットには \fB0\fP が入ります。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == (2147483648 \- (\-10 >>> 1))\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB5\fP (= \fB2147483648 \- (\-10 >>> 1)\fP = \fB2147483648 \- 2147483643\fP) のレコードにマッチします。 .SS 比較演算子 .sp 以下は比較演算子の説明です。 .SS 等価演算子 .sp 構文は \fBobject1 == object2\fP です。 .sp この演算子は \fBobject1\fP が \fBobject2\fP と等しいときは真を返し、そうでなければ偽を返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes == 5\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB5\fP の値にマッチします。 .SS 不等価演算子 .sp 構文は \fBobject1 != object2\fP です。 .sp この演算子は \fBobject1\fP が \fBobject2\fP と等しくないときに真を返し、そうでなければ偽を返します。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqn_likes != 5\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 4 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 4, # "Good\-bye Senna", # "I migrated all Senna system!", # 3 # ], # [ # 5, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 3 # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBn_likes\fP カラムの値が \fB5\fP ではない式にマッチします。 .SS 小なり演算子 .sp TODO: ... .SS 以下演算子 .sp TODO: ... .SS 大なり演算子 .sp TODO: ... .SS 以上演算子 .sp TODO: ... .SS 代入演算子 .SS 加算代入演算子 .sp 構文は \fBcolumn += value\fP です。 .sp この演算子は \fBcolumn1\fP に \fBcolumn2\fP を加算代入します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns _key,n_likes,_score \-\-filter true \-\-scorer \(aq_score += n_likes\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Good\-bye Senna", # 3, # 4 # ], # [ # "Good\-bye Tritonn", # 3, # 4 # ], # [ # "Groonga", # 10, # 11 # ], # [ # "Mroonga", # 15, # 16 # ], # [ # "The first post!", # 5, # 6 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-filter\fP による \fB_score\fP の値はこの場合は常に1です。その後、\(aq_score = _score + n_likes\(aq という加算代入演算をそれぞれのレコードへ適用します。 .sp 例えば、 \fB_key\fP として"Good\-bye Senna"を格納しているレコードの \fB_score\fP の値は3です。 .sp そのため、 \fB1 + 3\fP という式が評価されてから \fB_score\fP カラムへと演算結果が保存されます。 .SS 減算代入演算子 .sp 構文は \fBcolumn1 \-= column2\fP です。 .sp この演算子は \fBcolumn1\fP から \fBcolumn2\fP を減算代入します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns _key,n_likes,_score \-\-filter true \-\-scorer \(aq_score \-= n_likes\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Good\-bye Senna", # 3, # \-2 # ], # [ # "Good\-bye Tritonn", # 3, # \-2 # ], # [ # "Groonga", # 10, # \-9 # ], # [ # "Mroonga", # 15, # \-14 # ], # [ # "The first post!", # 5, # \-4 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-filter\fP による \fB_score\fP の値はこの場合は常に1です。その後、\(aq_score = _score \- n_likes\(aq という減算代入演算をそれぞれのレコードへ適用します。 .sp 例えば、 \fB_key\fP として"Good\-bye Senna"を格納しているレコードの \fB_score\fP の値は3です。 .sp そのため、 \fB1 \- 3\fP という式が評価されてから \fB_score\fP カラムへと演算結果が保存されます。 .SS 乗算代入演算子 .sp 構文は \fBcolumn1 *= column2\fP です。 .sp この演算子は \fBcolumn1\fP に \fBcolumn2\fP を乗算演算する。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns _key,n_likes,_score \-\-filter true \-\-scorer \(aq_score *= n_likes\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Good\-bye Senna", # 3, # 3 # ], # [ # "Good\-bye Tritonn", # 3, # 3 # ], # [ # "Groonga", # 10, # 10 # ], # [ # "Mroonga", # 15, # 15 # ], # [ # "The first post!", # 5, # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-filter\fP による \fB_score\fP の値はこの場合は常に1です。その後、\(aq_score = _score * n_likes\(aq という乗算代入演算をそれぞれのレコードへ適用します。 .sp 例えば、 \fB_key\fP として"Good\-bye Senna"を格納しているレコードの \fB_score\fP の値は3です。 .sp そのため、 \fB1 * 3\fP という式が評価されてから \fB_score\fP カラムへと演算結果が保存されます。 .SS 除算代入演算子 .sp 構文は \fBcolumn1 /= column2\fP です。 .sp この演算子は \fBcolumn1\fP に \fBcolumn2\fP を除算代入します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns _key,n_likes,_score \-\-filter true \-\-scorer \(aq_score /= n_likes\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Good\-bye Senna", # 3, # 0 # ], # [ # "Good\-bye Tritonn", # 3, # 0 # ], # [ # "Groonga", # 10, # 0 # ], # [ # "Mroonga", # 15, # 0 # ], # [ # "The first post!", # 5, # 0 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-filter\fP による \fB_score\fP の値はこの場合は常に1です。その後、\(aq_score = _score / n_likes\(aq という除算代入演算をそれぞれのレコードへ適用します。 .sp 例えば、 \fB_key\fP として"Good\-bye Senna"を格納しているレコードの \fB_score\fP の値は3です。 .sp そのため、 \fB1 / 3\fP という式が評価されてから \fB_score\fP カラムへと演算結果が保存されます。 .SS 剰余代入演算子 .sp 構文は \fBcolumn1 %= column2\fP です。 .sp この演算子は \fBcolumn1\fP に \fBcolumn2\fP を剰余代入します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns _key,n_likes,_score \-\-filter true \-\-scorer \(aq_score %= n_likes\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Good\-bye Senna", # 3, # 1 # ], # [ # "Good\-bye Tritonn", # 3, # 1 # ], # [ # "Groonga", # 10, # 1 # ], # [ # "Mroonga", # 15, # 1 # ], # [ # "The first post!", # 5, # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-filter\fP による \fB_score\fP の値はこの場合は常に1です。その後、\(aq_score = _score % n_likes\(aq という除算代入演算をそれぞれのレコードへ適用します。 .sp 例えば、 \fB_key\fP として"Good\-bye Senna"を格納しているレコードの \fB_score\fP の値は3です。 .sp そのため、 \fB1 % 3\fP という式が評価されてから \fB_score\fP カラムへと演算結果が保存されます。 .SS 左シフト代入演算子 .sp 構文は \fBcolumn1 << column2\fP です。 .sp この演算子は \fBcolumn1\fP のビットを左に \fBcolumn2\fP 左ビットシフト代入演算します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns _key,n_likes,_score \-\-filter true \-\-scorer \(aq_score <<= n_likes\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Good\-bye Senna", # 3, # 8 # ], # [ # "Good\-bye Tritonn", # 3, # 8 # ], # [ # "Groonga", # 10, # 1024 # ], # [ # "Mroonga", # 15, # 32768 # ], # [ # "The first post!", # 5, # 32 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-filter\fP による \fB_score\fP の値はこの場合は常に1です。その後、\(aq_score = _score << n_likes\(aq という左ビットシフト代入演算をそれぞれのレコードへ適用します。 .sp 例えば、 \fB_key\fP として"Good\-bye Senna"を格納しているレコードの \fB_score\fP の値は3です。 .sp そのため、 \fB1 << 3\fP という式が評価されてから \fB_score\fP カラムへと演算結果が保存されます。 .SS 符号あり右シフト代入演算子 .sp 構文は \fBcolumn1 >>= column2\fP です。 .sp この演算子は \fBcolumn1\fP のビットを \fBcolumn2\fP 右ビットシフト代入演算します。 .SS 符号なし右シフト代入演算子 .sp 構文は \fBcolumn1 >>>= column2\fP です。 .sp この演算子は \fBcolumn1\fP のビットを \fBcolumn2\fP 符号なし右ビットシフト代入演算します。 .SS ビット論理積代入演算子 .sp 構文は \fBcolumn1 &= column2\fP です。 .sp この演算子は \fBcolumn1\fP に \fBcolumn2\fP をビット論理積代入演算します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns _key,n_likes,_score \-\-filter true \-\-scorer \(aq_score &= n_likes\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Good\-bye Senna", # 3, # 1 # ], # [ # "Good\-bye Tritonn", # 3, # 1 # ], # [ # "Groonga", # 10, # 0 # ], # [ # "Mroonga", # 15, # 1 # ], # [ # "The first post!", # 5, # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-filter\fP による \fB_score\fP の値はこの場合は常に1です。その後、\(aq_score = _score & n_likes\(aq というビット論理積代入演算をそれぞれのレコードへ適用します。 .sp 例えば、 \fB_key\fP として"Groonga"を格納しているレコードの値は10です。 .sp そのため、 \fB1 & 10\fP という式が評価されてから \fB_score\fP カラムへと演算結果が保存されます。 .SS ビット論理和代入演算子 .sp 構文は \fBcolumn1 |= column2\fP です。 .sp この演算子は \fBcolumn1\fP に \fBcolumn2\fP をビット論理和代入演算する。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns _key,n_likes,_score \-\-filter true \-\-scorer \(aq_score |= n_likes\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Good\-bye Senna", # 3, # 3 # ], # [ # "Good\-bye Tritonn", # 3, # 3 # ], # [ # "Groonga", # 10, # 11 # ], # [ # "Mroonga", # 15, # 15 # ], # [ # "The first post!", # 5, # 5 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-filter\fP による \fB_score\fP の値はこの場合は常に1です。その後、\(aq_score = _score | n_likes\(aq というビット論理和代入演算をそれぞれのレコードへ適用します。 .sp 例えば、 \fB_key\fP として"Groonga"を格納しているレコードの値は10です。 .sp そのため、 \fB1 | 10\fP という式が評価されてから \fB_score\fP カラムへと演算結果が保存されます。 .SS ビット排他的論理和代入演算子 .sp 構文は \fBcolumn1 ^= column2\fP です。 .sp この演算子は \fBcolumn1\fP に \fBcolumn2\fP をビット排他的論理和代入演算します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns _key,n_likes,_score \-\-filter true \-\-scorer \(aq_score ^= n_likes\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Good\-bye Senna", # 3, # 2 # ], # [ # "Good\-bye Tritonn", # 3, # 2 # ], # [ # "Groonga", # 10, # 11 # ], # [ # "Mroonga", # 15, # 14 # ], # [ # "The first post!", # 5, # 4 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-filter\fP による \fB_score\fP の値はこの場合は常に1です。その後、\(aq_score = _score ^ n_likes\(aq という減算代入演算をそれぞれのレコードへ適用します。 .sp 例えば、 \fB_key\fP として"Good\-bye Senna"を格納しているレコードの \fB_score\fP の値は3です。 .sp そのため、 \fB1 ^ 3\fP という式が評価されてから \fB_score\fP カラムへと演算結果が保存されます。 .SS 独自の演算子 .sp スクリプト構文はECMAScriptの構文に独自の二項演算子を追加しています。これらは検索に特化した操作をします。演算子の最初の文字は \fB@\fP または \fB*\fP です。 .SS マッチ演算子 .sp 構文は \fBcolumn @ value\fP です。 .sp この演算子は \fBcolumn\fP の転置インデックスを使って \fBvalue\fP を検索します。普通は全文検索をしますが、タグ検索もできます。これは、タグ検索も転置インデックスを使って実現しているからです。 .sp \fBquery_syntax\fP はデフォルトでこの演算子を使っています。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqcontent @ "fast"\(aq \-\-output_columns content # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "content", # "Text" # ] # ], # [ # "I started to use Groonga. It\(aqs very fast!" # ], # [ # "I also started to use Mroonga. It\(aqs also very fast! Really fast!" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBcontent\fP カラムの値に \fBfast\fP という単語を含んでいるレコードにマッチします。 .SS 前方一致検索演算子 .sp 構文は \fBcolumn @^ value\fP です。 .sp この条件式は \fBvalue\fP で前方一致検索します。前方一致検索は \fBvalue\fP で始まる単語を含むレコードを検索します。 .sp カラムの値を高速に前方一致検索できます。ただし、そのカラムにはインデックスを作成し、そのインデックス用のテーブルをパトリシアトライ( \fBTABLE_PAT_KEY\fP )またはダブル配列トライ( \fBTABLE_DAT_KEY\fP )にしなければいけません。あるいは、パトリシアトライテーブルまたはダブル配列テーブルの \fB_key\fP も高速に前方一致検索できます。 \fB_key\fP にインデックスを作成する必要はありません。 .sp 他の種類のテーブルでも前方一致検索を使えますがレコード全件を処理します。レコード数が少ない場合には問題ありませんが、レコード数が多いと時間がかかります。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aq_key @^ "Goo"\(aq \-\-output_columns _key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ] # ], # [ # "Good\-bye Tritonn" # ], # [ # "Good\-bye Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fB_key\fP カラムの値が \fBGoo\fP で始まる単語を含むレコードにマッチします。この式には \fBGood\-bye Senna\fP と \fBGood\-bye Tritonn\fP がマッチします。 .SS 後方一致検索演算子 .sp 構文は \fBcolumn @$ value\fP です。 .sp この演算子は \fBvalue\fP で後方一致検索します。後方一致検索は \fBvalue\fP で終わる単語を含むレコードを検索します。 .sp カラムの値を高速に後方一致検索できます。ただし、そのカラムにはインデックスを作成し、そのインデックス用のテーブルを \fBKEY_WITH_SIS\fP フラグ付きのパトリシアトライテーブル( \fBTABLE_PAT_KEY\fP )にしなければいけません。 \fBKEY_WITH_SIS\fP フラグ付きのパトリシアトライテーブル( \fBTABLE_PAT_KEY\fP )の \fB_key\fP 擬似カラムの値も高速に後方一致検索できます。 \fB_key\fP にはインデックスを作成する必要はありません。 \fB_key\fP ベースの高速な後方一致検索よりもカラムベースの高速な後方一致検索を使うことをおすすめします。 \fB_key\fP ベースの高速な後方一致検索は自動的に登録された部分文字列も返ってきます。(TODO: 後方一致検索に関するドキュメントを書いてここからリンクを張る。) .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 高速な後方一致検索は日本語のひらがななど非ASCII文字にしか使えません。ASCII文字には高速な後方一致検索を使えません。 .UNINDENT .UNINDENT .sp 後方一致検索は他の種類のテーブルもしくはパトリシアトライを \fBKEY_WITH_SIS\fP フラグなしで使用しているテーブルに対しても使えますが、レコード全件を処理します。レコード数が少ない場合には問題ありませんが、レコード数が多いと時間がかかります。 .sp 簡単な例です。ASCII文字ではない文字である日本語のひらがなに対して高速な後方一致検索をしています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Titles TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Titles content COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create SuffixSearchTerms TABLE_PAT_KEY|KEY_WITH_SIS ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create SuffixSearchTerms index COLUMN_INDEX Titles content # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Titles [ {"content": "ぐるんが"}, {"content": "むるんが"}, {"content": "せな"}, {"content": "とりとん"} ] # [[0, 1337566253.89858, 0.000355720520019531], 4] select Titles \-\-query \(aqcontent:$んが\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "content", # "ShortText" # ] # ], # [ # 2, # "むるんが" # ], # [ # 1, # "ぐるんが" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBcontent\fP カラムの値が \fBんが\fP で終わるレコードにマッチします。この場合は \fBぐるんが\fP と \fBむるんが\fP にマッチします。 .SS 近傍検索演算子 .sp 構文は \fBcolumn *N "word1 word2 ..."\fP です。 .sp この演算子は \fBword1 word2 ...\fP という単語で近傍検索します。近傍検索はすべての単語が含まれていてかつそれぞれの単語が近くにあるレコードを検索します。距離が \fB10\fP 以内の近さであれば近くにあると判断します。今のところ、この値は変更できません。距離の単位はN\-gram系のトークナイザーでは文字数で、形態素解析系のトークナイザーでは単語数です。 .sp (TODO: \fBTokenBigram\fP はASCIIだけの単語はトークンに分割しないという説明を追加すること。このため、 \fBTokenBigram\fP はN\-gram系のトークナイザーだけどASCIIだけの単語を扱う時の単位は単語数になる。) .sp \fBcolumn\fP 用の全文検索用インデックスカラムを定義しておく必要があることに注意してください。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqcontent *N "I fast"\(aq \-\-output_columns content # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "content", # "Text" # ] # ], # [ # "I started to use Groonga. It\(aqs very fast!" # ] # ] # ] # ] select Entries \-\-filter \(aqcontent *N "I Really"\(aq \-\-output_columns content # [[0, 1337566253.89858, 0.000355720520019531], [[[0], [["content", "Text"]]]]] select Entries \-\-filter \(aqcontent *N "also Really"\(aq \-\-output_columns content # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "content", # "Text" # ] # ], # [ # "I also started to use Mroonga. It\(aqs also very fast! Really fast!" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 最初の式は \fBI\fP と \fBfast\fP が含まれていて、かつ、これらの単語が10単語以内近くにあるレコードにマッチします。そのため \fBI also started to use mroonga. It\(aqs also very fast! ...\fP にマッチします。 \fBI\fP と \fBfast\fP の間の単語数はちょうど10です。 .sp 二番目の式は \fBI\fP と \fBReally\fP が含まれていて、かつ、これらの単語が10単語以内近くにあるレコードにマッチします。そのため、 \fBI also st arted to use mroonga. It\(aqs also very fast! Really fast!\fP はマッチしません。 \fBI\fP と \fBReally\fP の間の単語数は11です。 .sp 三番目の式は \fBalso\fP と \fBReally\fP が含まれていて、かつ、これらの単語が10単語以内近くにあるレコードにマッチします。そのため、 \fBI also started to use mroonga. It\(aqs also very fast! Really fast!\fP にマッチします。 \fBalso\fP と \fBReally\fP の間の単語数は10です。 .SS 類似文書検索 .sp 構文は \fBcolumn *S "document"\fP です。 .sp この演算子は \fBdocument\fP という文書で類似文書検索します。類似文書検索は \fBdocument\fP と似た内容を持つレコードを検索します。 .sp \fBcolumn\fP 用の全文検索用インデックスカラムを定義しておく必要があることに注意してください。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqcontent *S "I migrated all Solr system!"\(aq \-\-output_columns content # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "content", # "Text" # ] # ], # [ # "I migrated all Senna system!" # ], # [ # "I also migrated all Tritonn system!" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は \fBI migrated all Solr system!\fP と似た内容を持つレコードを検索します。この場合は、 \fBI migrated all XXX system!\fP という内容のレコードがマッチします。 .SS 単語抽出演算子 .sp 構文は \fB_key *T "document"\fP です。 .sp この演算子は \fBdocument\fP から単語を抽出します。単語は \fB_key\fP のテーブルのキーとして登録されていなければいけません。 .sp テーブルはパトリシアトライ( \fBTABLE_PAT_KEY\fP )またはダブル配列トライ( \fBTABLE_DAT_KEY\fP )でなければいけません。ハッシュテーブル( \fBTABLE_HASH_KEY\fP )や配列( \fBTABLE_NO_KEY\fP )は最長共通接頭辞検索(Longest Common Prefix Search)できないため使えません。この演算子は最長共通接頭辞検索を使っています。 .sp 以下は簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Words TABLE_PAT_KEY ShortText \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Words [ {"_key": "groonga"}, {"_key": "mroonga"}, {"_key": "Senna"}, {"_key": "Tritonn"} ] # [[0, 1337566253.89858, 0.000355720520019531], 4] select Words \-\-filter \(aq_key *T "Groonga is the successor project to Senna."\(aq \-\-output_columns _key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ] # ], # [ # "groonga" # ], # [ # "senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この式は文書 \fBGroonga is the successor project to Senna.\fP に含まれている単語を抽出します。今回は \fBWords\fP に \fBNormalizerAuto\fP ノーマライザーが指定されています。そのため、 \fBWords\fP には \fBgroonga\fP とロードしていますが \fBGroonga\fP も抽出できています。また、すべてての抽出された単語も正規化されています。 .SS 正規表現演算子 .sp バージョン 5.0.1 で追加. .sp 構文は \fBcolumn @~ "pattern"\fP です。 .sp この演算子は正規表現 \fBpattern\fP でレコードを検索します。もし、レコードの \fBcolumn\fP の値が \fBpattern\fP にマッチしたら、そのレコードはマッチしたということです。 .sp \fBpattern\fP は正規表現の構文になっていなければいけません。正規表現の構文の詳細は \fB/reference/regular_expression\fP を参照してください。 .sp 以下の例はパターンとして \fB\&.roonga\fP を使っています。このパターンは \fBGroonga\fP 、 \fBMroonga\fP といった文字列にマッチします。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-filter \(aqcontent @~ ".roonga"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 10 # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 15 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 多くの場合、各レコードの対して順に正規表現を評価します。そのため、多くのレコードがある場合は遅くなるかもしれません。 .sp いくつかのケースでは、Groongaはインデックスを使って正規表現を評価します。これはとても高速です。詳細は \fB/reference/regular_expression\fP を参照してください。 .SS 参考 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB/reference/api/grn_expr\fP: grn_expr関連のAPI .UNINDENT .UNINDENT .UNINDENT .SS 正規表現 .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 正規表現は実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.1 で追加. .sp Groongaは正規表現を用いたパターンマッチをサポートしています。正規表現はパターンを表現するために広く使われています。正規表現は複雑なパターンを表現するときに便利です。 .sp 多くの場合は、正規表現検索は逐次検索で実行します。これはたくさんのレコードがあったり、たくさんのテキストがある場合は遅くなります。 .sp いくつかの場合では、正規表現を使ったパターンマッチをインデックスを使って実現します。これは逐次検索よりも非常に高速です。インデックスを使って評価できるパターンについては後述します。 .sp バージョン 5.0.7 で追加: Groongaは正規表現検索にインデックスを使わないときは、 normalizer\-auto ノーマライザーでマッチ対象のテキストを正規化します。これは、 \fBGroonga\fP というような大文字を使った正規表現は必ずマッチに失敗するということです。なぜなら、 normalizer\-auto ノーマライザーはすべてのアルファベットを小文字に正規化するからです。 \fBgroonga\fP は \fBGroonga\fP にも \fBgroonga\fP にも両方にマッチします。 .sp なぜマッチ対象のテキストを正規化するのでしょうか?それは、インデックスを使って検索できるパターンを増やすためです。もし、Groongaがマッチ対象のテキストを正規化しなかった場合、大文字小文字を区別しないマッチをするために、 \fB[Dd][Ii][Ss][Kk]\fP や \fB(?i)disk\fP のような複雑な正規表現を書く必要があります。Groongaは複雑な正規表現に対してインデックスを使うことができません。 .sp もし、大文字小文字を区別しないマッチに \fBdisk\fP という正規表現を使うなら、Groongaはインデックスを使ってこのパターンを検索できます。これは高速です。 .sp この挙動を奇妙に思うかもしれません。しかし、この挙動のおかげで高速に検索できることはきっとあなたの役に立つはずです。 .sp 正規表現の構文はたくさんあります。GroongaはRubyと同じ構文を使います。なぜなら、Groongaが使っている正規表現エンジンはRubyが使っている正規表現エンジンと同じだからです。この正規表現エンジンは \fI\%Onigmo\fP といいます。他の正規表現の構文との特徴的な違いは \fB^\fP と \fB$\fP です。Rubyの正規表現の構文では \fB^\fP は行頭を表し、 \fB$\fP は行末を表します。他の多くの正規表現の構文では、 \fB^\fP はテキストの先頭を表し、 \fB$\fP はテキストの最後を表します。Rubyの正規表現の構文ではテキストの先頭を表す場合は \fB\eA\fP を使い、テキストの最後を表す場合は \fB\ez\fP を使います。 .sp バージョン 5.0.6 で追加: Groongaは5.0.6からマルチラインモードを有効にしています。これは、 \fB\&.\fP が \fB\en\fP にマッチするということです。 .sp しかし、この挙動は意味がありません。なぜなら、 \fB\en\fP は normalizer\-auto ノーマライザーが削除するからです。 .sp \fB/reference/commands/select\fP コマンドの select\-query オプションと select\-filter オプションで正規表現を使えます。 .SS 使い方 .sp 以下は使い方を説明するためのスキーマ定義とサンプルデータです。このスキーマにはテーブルは1つだけです。 \fBLogs\fP というテーブルです。 \fBLogs\fP テーブルは1つだけカラムを持ちます。 \fBmessage\fP というカラムです。ログメッセージは \fBmessage\fP カラムに保存されています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Logs TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs message COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Logs [ {"message": "host1:[error]: No memory"}, {"message": "host1:[warning]: Remained disk space is less than 30%"}, {"message": "host1:[error]: Disk full"}, {"message": "host2:[error]: No memory"}, {"message": "host2:[info]: Shutdown"} ] # [[0, 1337566253.89858, 0.000355720520019531], 5] .ft P .fi .UNINDENT .UNINDENT .sp select\-query で正規表現を使う例です。 \fB${COLUMN}:~${REGULAR_EXPRESSION}\fP という構文を使います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \-\-query \(aqmessage:~"disk (space|full)"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "message", # "Text" # ] # ], # [ # 2, # "host1:[warning]: Remained disk space is less than 30%" # ], # [ # 3, # "host1:[error]: Disk full" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp select\-filter で正規表現を使う例です。 \fB${COLUMN} @~ ${REGULAR_EXPRESSION}\fP という構文を使います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \-\-filter \(aqmessage @~ "disk (space|full)"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "message", # "Text" # ] # ], # [ # 2, # "host1:[warning]: Remained disk space is less than 30%" # ], # [ # 3, # "host1:[error]: Disk full" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS インデックス .sp Groongaは正規表現を使った検索をインデックスを使って実現することができます。これは逐次検索より非常に高速です。 .sp しかし、すべての正規表現には対応していません。以下の正規表現にのみ対応しています。対応している正規表現は今後増えていく予定です。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBdisk\fP のようにリテラルしかないパターン .IP \(bu 2 \fB\eA/disk\fP のようにテキストの最初でのマッチとリテラルのみのケース .IP \(bu 2 \fBdisk\ez\fP のようにテキストの最後でのマッチとリテラルのみのケース .UNINDENT .UNINDENT .UNINDENT .sp 高速に正規表現検索を実現するためにはインデックスを作る必要があります。以下は正規表現用のインデックスが満たさなければいけないことのリストです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 語彙表は table\-pat\-key テーブルであること。 .IP \(bu 2 語彙表は token\-regexp トークナイザーを使っていること。 .IP \(bu 2 インデックスカラムは \fBWITH_POSITION\fP フラグ付きであること。 .UNINDENT .UNINDENT .UNINDENT .sp 語彙表のノーマライザーといった他の設定は用途に応じて適切なものを設定してください。もし、大文字小文字を区別せずに検索したい場合は normalizer\-auto ノーマライザーを使ってください。 .sp 以下はオススメのインデックス定義です。多くの場合はこのインデックス定義が適切です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create RegexpLexicon TABLE_PAT_KEY ShortText \e \-\-default_tokenizer TokenRegexp \e \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create RegexpLexicon logs_message_index \e COLUMN_INDEX|WITH_POSITION Logs message # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp これでインデックスを使って正規表現検索をできるようになりました。以下の正規表現は「テキストの先頭」と「リテラル」しか使っていないのでインデックスを使って検索できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \-\-query message:~\e\e\e\eAhost1 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "message", # "Text" # ] # ], # [ # 1, # "host1:[error]: No memory" # ], # [ # 2, # "host1:[warning]: Remained disk space is less than 30%" # ], # [ # 3, # "host1:[error]: Disk full" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 以下は select\-query の代わりに select\-filter を使った例です。前の例と同じ正規表現を使っています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \-\-filter \(aqmessage @~ "\e\e\e\eAhost1:"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "message", # "Text" # ] # ], # [ # 1, # "host1:[error]: No memory" # ], # [ # 2, # "host1:[warning]: Remained disk space is less than 30%" # ], # [ # 3, # "host1:[error]: Disk full" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\e\fP エスケープは紛らわしいかもしれません。あなたが書いたクエリーをGroongaが実行するまでにエスケープが必要なステップがいくつもあるからです。以下は \fB\e\fP エスケープが必要なステップです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 シェル。ただし、次のようにGroongaのコマンドをコマンドラインで指定した場合のみ: .INDENT 2.0 .INDENT 3.5 .sp .nf .ft C % groonga /tmp/db select Logs \-\-filter \(aq"message @~ \e"\e\e\e\eAhost1:"\e"\(aq .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-filter \(aq"message @~ \e"\e\e\e\eAhost1:\e""\(aq\fP はシェルが評価して次の2つの引数になります。 .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-filter\fP .IP \(bu 2 \fB"message @~ \e"\e\e\e\eAhost1:\e""\fP .UNINDENT .UNINDENT .UNINDENT .IP \(bu 2 Groongaコマンドパーサー。ただし、GroongaのコマンドをHTTPパススタイル ( \fB/d/COMMAND?ARG1_NAME=ARG1_VALUE&ARG2_NAME=ARG3_VALUE\fP ) ではなく、コマンドラインスタイル ( \fBCOMMAND ARG1_VALUE ARG2_VALUE ...\fP )で指定した場合のみ。 .sp \fB"message @~ \e"\e\e\e\eAhost1:\e""\fP はGroongaコマンドパーサーが評価して次の値になります。 .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBmessage @~ "\e\eAhost1:"\fP .UNINDENT .UNINDENT .UNINDENT .IP \(bu 2 \fB/reference/grn_expr\fP パーサー。 \fB/reference/grn_expr/query_syntax\fP でも \fB/reference/grn_expr/script_syntax\fP でも \fB\e\fP エスケープが必要です。 .sp スクリプト構文で \fB"\e\eAhost1:"\fP という文字列リテラルを評価すると次の値になります。 .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\eAhost1\fP .UNINDENT .UNINDENT .UNINDENT .sp この値が正規表現として評価されます。 .UNINDENT .UNINDENT .UNINDENT .SS 構文 .sp このセクションでは広く使われている構文だけ説明します。他の構文と詳細は \fI\%Onigmoの構文ドキュメント\fP を参照してください。 .SS エスケープ .sp 正規表現で特別な文字は次の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\e\fP .IP \(bu 2 \fB|\fP .IP \(bu 2 \fB(\fP .IP \(bu 2 \fB)\fP .IP \(bu 2 \fB[\fP .IP \(bu 2 \fB]\fP .IP \(bu 2 \fB\&.\fP .IP \(bu 2 \fB*\fP .IP \(bu 2 \fB+\fP .IP \(bu 2 \fB?\fP .IP \(bu 2 \fB{\fP .IP \(bu 2 \fB}\fP .IP \(bu 2 \fB^\fP .IP \(bu 2 \fB$\fP .UNINDENT .UNINDENT .UNINDENT .sp これらの特別な文字そのものにマッチするパターンを書きたいときはこれらの文字をエスケープする必要があります。 .sp 特別な文字の前に \fB\e\fP を入れることでエスケープできます。以下は特別な文字そのものにマッチする正規表現です。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\e\e\fP .IP \(bu 2 \fB\e|\fP .IP \(bu 2 \fB\e(\fP .IP \(bu 2 \fB\e)\fP .IP \(bu 2 \fB\e[\fP .IP \(bu 2 \fB\e]\fP .IP \(bu 2 \fB\e.\fP .IP \(bu 2 \fB\e*\fP .IP \(bu 2 \fB\e+\fP .IP \(bu 2 \fB\e?\fP .IP \(bu 2 \fB\e{\fP .IP \(bu 2 \fB\e}\fP .IP \(bu 2 \fB\e^\fP .IP \(bu 2 \fB\e$\fP .UNINDENT .UNINDENT .UNINDENT .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \-\-filter \(aqmessage @~ "warning|info"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "message", # "Text" # ] # ], # [ # 2, # "host1:[warning]: Remained disk space is less than 30%" # ], # [ # 5, # "host2:[info]: Shutdown" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 正規表現が期待した通りに動かないときはエスケープ無しで特別な文字が使われていないか確認してください。 .SS 選択 .sp 選択の構文は \fBA|B\fP です。 \fBA\fP パターンまたは \fBB\fP パターンにマッチするとこの正規表現にマッチしたことになります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \-\-filter \(aqmessage @~ "warning|info"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "message", # "Text" # ] # ], # [ # 2, # "host1:[warning]: Remained disk space is less than 30%" # ], # [ # 5, # "host2:[info]: Shutdown" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBご用心:\fP .INDENT 0.0 .INDENT 3.5 この構文を使った正規表現はインデックスを使って評価できません。 .UNINDENT .UNINDENT .SS グループ .sp グループの構文は \fB(...)\fP です。グループは次の機能を提供します。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 後方参照 .IP \(bu 2 スケープの限定 .UNINDENT .UNINDENT .UNINDENT .sp マッチしたグループを \fB\en\fP ( \fBn\fP はグループの番号とする) という構文で参照できます。例えば、 \fBe(r)\e1o\e1\fP は \fBerror\fP にマッチします。なぜなら、 \fB\e1\fP は1番目ののグループ \fB(r)\fP のマッチ結果( \fBr\fP )に置き換えられるからです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \-\-filter \(aqmessage @~ "e(r)\e\e\e\e1o\e\e\e\e1"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "message", # "Text" # ] # ], # [ # 1, # "host1:[error]: No memory" # ], # [ # 3, # "host1:[error]: Disk full" # ], # [ # 4, # "host2:[error]: No memory" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp より強力な後方参照機能を使うこともできます。詳細は \fI\%Onigmoのドキュメントの「8. 後方参照」セクション\fP を参照してください。 .sp グループ構文はスコープを小さくします。例えば、 \fB\e[(warning|info)\e]\fP は選択構文のスコープを小さくしています。この正規表現は \fB[warning]\fP と \fB[info]\fP にマッチします。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \-\-filter \(aqmessage @~ "\e\e\e\e[(warning|info)\e\e\e\e]"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "message", # "Text" # ] # ], # [ # 2, # "host1:[warning]: Remained disk space is less than 30%" # ], # [ # 5, # "host2:[info]: Shutdown" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp より強力なグループ関連の機能を使うこともできます。詳細は \fI\%Onigmoのドキュメントの「7. 拡張式集合」セクション\fP を参照してください。 .sp \fBご用心:\fP .INDENT 0.0 .INDENT 3.5 この構文を使った正規表現はインデックスを使って評価できません。 .UNINDENT .UNINDENT .SS 文字クラス .sp 文字クラスの構文は \fB[...]\fP です。文字クラスはマッチする文字を複数指定するときに便利です。 .sp たとえば、 \fB[12]\fP は \fB1\fP または \fB2\fP にマッチします。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \-\-filter \(aqmessage @~ "host[12]"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "message", # "Text" # ] # ], # [ # 1, # "host1:[error]: No memory" # ], # [ # 2, # "host1:[warning]: Remained disk space is less than 30%" # ], # [ # 3, # "host1:[error]: Disk full" # ], # [ # 4, # "host2:[error]: No memory" # ], # [ # 5, # "host2:[info]: Shutdown" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 範囲で文字を指定することもできます。たとえば、 \fB[0\-9]\fP は1文字の数字にマッチします。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \-\-filter \(aqmessage @~ "[0\-9][0\-9]%"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "message", # "Text" # ] # ], # [ # 2, # "host1:[warning]: Remained disk space is less than 30%" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp より強力な文字クラス関連の機能も使うことができます。詳細は \fI\%Onigmoのドキュメントの「6. 文字集合」セクション\fP を参照してください。 .sp \fBご用心:\fP .INDENT 0.0 .INDENT 3.5 この構文を使った正規表現はインデックスを使って評価できません。 .UNINDENT .UNINDENT .SS アンカー .sp 以下はよく使われるアンカーの構文です。いくつかのアンカーはインデックスを使って評価できます。 .TS center; |l|l|l|. _ T{ アンカー T} T{ 説明 T} T{ インデックスを使えるか T} _ T{ \fB^\fP T} T{ 行頭 T} T{ o T} _ T{ \fB$\fP T} T{ 行末 T} T{ x T} _ T{ \fB\eA\fP T} T{ テキストの先頭 T} T{ o T} _ T{ \fB\ez\fP T} T{ テキストの末尾 T} T{ x T} _ .TE .sp 以下は \fB\ez\fP を使った例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \-\-filter \(aqmessage @~ "%\e\e\e\ez"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "message", # "Text" # ] # ], # [ # 2, # "host1:[warning]: Remained disk space is less than 30%" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 他にも使えるアンカーがあります。詳細は \fI\%Onigmoのドキュメントの「5. 錨」セクション\fP を参照してください。 .sp \fBご用心:\fP .INDENT 0.0 .INDENT 3.5 \fB\eA\fP と \fB\ez\fP 以外のアンカーを使った正規表現はインデックスを使って評価できません。 .UNINDENT .UNINDENT .SS 量指定子 .sp 以下はよく使われる量指定子の構文です。 .TS center; |l|l|. _ T{ 量指定子 T} T{ 説明 T} _ T{ \fB?\fP T} T{ 0回か1回 T} _ T{ \fB*\fP T} T{ 0回以上 T} _ T{ \fB+\fP T} T{ 1回以上 T} _ .TE .sp 例えば、 \fBer+or\fP は \fBerror\fP 、 \fBerrror\fP などにマッチします。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Logs \-\-filter \(aqmessage @~ "er+or"\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "message", # "Text" # ] # ], # [ # 1, # "host1:[error]: No memory" # ], # [ # 3, # "host1:[error]: Disk full" # ], # [ # 4, # "host2:[error]: No memory" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 他の量指定子を使うこともできます。詳細は \fI\%Onigmoのドキュメントの「4. 量指定子」セクション\fP を参照してください。 .sp \fBご用心:\fP .INDENT 0.0 .INDENT 3.5 この構文を使った正規表現はインデックスを使って評価できません。 .UNINDENT .UNINDENT .SS その他 .sp 他にも構文があります。それらに興味がある場合は \fI\%Onigmoのドキュメント\fP を参照してください。「文字種」や「文字」の構文に興味があるかもしれません。 .SS 関数 .sp 関数はいくつかのコマンドの中で使えます。 \fBcommands/select\fP コマンドの \fB\-\-filter\fP 、 \fB\-\-scorer\fP 、 \fBoutput_columns\fP オプションで使えます。 .sp このセクションでは関数についての説明と組み込みの関数について説明します。 .sp TODO: Add documentations about function. .SS between .SS 概要 .sp \fBbetween\fP は、指定された値が指定された範囲にあるかをチェックするために使われます。これは \fB/reference/commands/select\fP の select\-filter オプションと組み合わせてよく使われます。 .SS 構文 .sp \fBbetween\fP には引数が5つあります。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C between(column_or_value, min, min_border, max, max_border) .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Users TABLE_HASH_KEY ShortText column_create Users age COLUMN_SCALAR Int32 table_create Ages TABLE_HASH_KEY Int32 column_create Ages user_age COLUMN_INDEX Users age load \-\-table Users [ {"_key": "Alice", "age": 12}, {"_key": "Bob", "age": 13}, {"_key": "Calros", "age": 15}, {"_key": "Dave", "age": 16}, {"_key": "Eric", "age": 20} {"_key": "Frank", "age": 21} ] .ft P .fi .UNINDENT .UNINDENT .sp これはPG\-13 (MPAA)のレーティングに該当する人を示すクエリです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Users \-\-filter \(aqbetween(age, 13, "include", 16, "include")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "age", # "Int32" # ] # ], # [ # 2, # "Bob", # 13 # ], # [ # 3, # "Calros", # 15 # ], # [ # 4, # "Dave", # 16 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 13から16歳までのユーザーを返します。 .sp \fBbetween\fP 関数はテーブルのカラムだけでなく、値も受け付けます。 .sp 最初の引数に値を指定した場合、その値が含まれているか否かをチェックします。もし、指定した範囲にマッチしたら、( \fBbetween\fP 関数がtrueを返すので)すべてのレコードを返します。 .sp もし、指定した範囲にマッチしなかった場合、( \fBbetween\fP 関数がfalseを返すので)1件もレコードを返しません。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Users \-\-filter \(aqbetween(14, 13, "include", 16, "include")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 6 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "age", # "Int32" # ] # ], # [ # 1, # "Alice", # 12 # ], # [ # 2, # "Bob", # 13 # ], # [ # 3, # "Calros", # 15 # ], # [ # 4, # "Dave", # 16 # ], # [ # 5, # "Eric", # 20 # ], # [ # 6, # "Frank", # 21 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 上記の例では、すべてのレコードを返します。これは、14は指定した範囲である13から16の間にあるからです。この振舞いは指定した値がテーブルに存在するかどうかの確認に使えます。 .SS 引数 .sp 引数は5つあります。 \fBcolumn_or_value\fP と \fBmin\fP と \fBmin_border\fP と \fBmax\fP と \fBmax_border\fP です。 .SS \fBcolumn_or_value\fP .sp テーブルのカラムもしくは値を指定します。 .SS \fBmin\fP .sp 範囲のうち最小値を指定します。値 \fBmin\fP が含まれるかどうかは \fBmin_border\fP 引数で制御することができます。 .SS \fBmin_border\fP .sp \fBmin\fP の値を含めた範囲となるかどうかを指定します。 \fBmin_border\fP に指定できるのは "include" または "exclude" のどちらかです。 "include" を指定すれば、\fBmin\fP が含まれます。 "exclude" を指定すれば \fBmin\fP は含まれません。 .SS \fBmax\fP .sp 範囲のうち最大値を指定します。値 \fBmax\fP が含まれるかどうかは \fBmax_border\fP 引数で制御することができます。 .SS \fBmax_border\fP .sp \fBman\fP の値を含めた範囲となるかどうかを指定します。 \fBmax_border\fP に指定できるのは "include" または "exclude" のどちらかです。 "include" を指定すれば、\fBmax\fP が含まれます。 "exclude" を指定すれば \fBmax\fP は含まれません。 .SS 戻り値 .sp \fBbetween\fP は指定した範囲にカラムの値が含まれるかを返します。もし該当するレコードがあれば、 \fBtrue\fP を返します。そうでなければ \fBfalse\fP を返します。 .SS edit_distance .SS 名前 .sp edit_distance \- 指定した2つの文字列の編集距離を計算する .SS 書式 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C edit_distance(string1, string2) .ft P .fi .UNINDENT .UNINDENT .SS 説明 .sp Groonga組込関数の一つであるedit_distanceについて説明します。組込関数は、script形式のgrn_expr中で呼び出すことができます。 .sp edit_distance() 関数は、string1に指定した文字列とstring2に指定した文字列の間の編集距離を求めます。 .SS 引数 .sp \fBstring1\fP .INDENT 0.0 .INDENT 3.5 文字列を指定します .UNINDENT .UNINDENT .sp \fBstring2\fP .INDENT 0.0 .INDENT 3.5 もうひとつの文字列を指定します .UNINDENT .UNINDENT .SS 返値 .sp 指定した2つ文字列の編集距離をUint32型の値として返します。 .SS 例 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C edit_distance(title, "hoge") 1 .ft P .fi .UNINDENT .UNINDENT .SS geo_distance .SS 概要 .sp \fBgeo_distance\fP は二点間の距離を計算します。 .SS 構文 .sp \fBgeo_distance\fP は二つの点を指定します。引数 \fBapproximate_type\fP は省略可能です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C geo_distance(point1, point2) geo_distance(point1, point2, approximate_type) .ft P .fi .UNINDENT .UNINDENT .sp \fBapproximate_type\fP のデフォルト値は \fB"rectangle"\fP です。 \fBapproximate_type\fP を省略した場合、 \fBgeo_distance\fP は二点間の距離を \fB"rectangle"\fP が指定されたものとして計算します。 .SS 使い方 .sp \fBgeo_distance\fP はGroongaの組み込み関数の一つです。 .sp 組み込み関数を \fB/reference/grn_expr\fP にて使うことができます。 .sp \fBgeo_distance\fP 関数は \fBpoint1\fP と \fBpoint2\fP の座標値から二点間の距離(近似値)を計算します。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 Groongaは三つの組み込み関数を距離の計算のために提供しています。 \fBgeo_distance()\fP 、 \fBgeo_distance2()\fP 、 \fBgeo_distance3()\fP です。これらの違いは距離の計算アルゴリズムにあります。 \fBgeo_distance2()\fP と \fBgeo_distance3()\fP はバージョン1.2.9より非推奨となりました。 \fBgeo_distance2(point1, point2)\fP の代りに \fBgeo_distance(point1, point2, "sphere")\fP を使用してください。 \fBgeo_distance3(point1, point2)\fP の代りに \fBgeo_distance(point1, point2, "ellipsoid")\fP を使用してください。 .UNINDENT .UNINDENT .sp 例とともに \fBgeo_distance\fP について学びましょう。このセクションでは簡単な例を示します。 .sp 使い方による違いがわかるようにスキーマ定義とサンプルデータを用意しました。これらのサンプルはニューヨークとロンドンを例に距離の計算方法を示します。 .INDENT 0.0 .IP 1. 3 距離の計算にlocationカラムの値を使う ( \fBCities\fP テーブル) .IP 2. 3 距離の計算に明示的に指定した座標値を使う ( \fBGeo\fP テーブル) .UNINDENT .SS locationカラムの値を使う .sp 使用例を示すための \fBCities\fP テーブルのスキーマ定義とサンプルデータは以下の通りです。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Cities TABLE_HASH_KEY ShortText column_create Cities location COLUMN_SCALAR WGS84GeoPoint load \-\-table Cities [ { "_key", "location" }, { "New York City", "146566000x\-266422000", }, ] .ft P .fi .UNINDENT .UNINDENT .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Cities TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Cities location COLUMN_SCALAR WGS84GeoPoint # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Cities [ { "_key", "location" }, { "New York City", "146566000x\-266422000", }, ] # [[0, 1337566253.89858, 0.000355720520019531], 1] .ft P .fi .UNINDENT .UNINDENT .sp この実行例では \fBlocation\fP というカラムを持つ \fBCities\fP テーブルを作成します。 \fBlocation\fP カラムには座標値を保存します。東京の座標値がサンプルデータとして保存されています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Cities \-\-output_columns _score \-\-filter 1 \-\-scorer \(aq_score = geo_distance(location, "185428000x\-461000", "rectangle")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_score", # "Int32" # ] # ], # [ # 5715104 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このサンプルは \fBgeo_distance\fP が \fBlocation\fP カラムと座標値から距離を計算していることを示します。 .sp \fBgeo_distance\fP の第二引数として渡された値 ("185428000x\-461000")はロンドンの座標値です。 .SS 明示的に指定した位置を使う .sp 使用例を示すための \fBGeo\fP テーブルのスキーマ定義とサンプルデータは以下の通りです。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Geo TABLE_HASH_KEY ShortText column_create Geo distance COLUMN_SCALAR Int32 load \-\-table Geo [ { "_key": "the record for geo_distance() result" } ] .ft P .fi .UNINDENT .UNINDENT .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Geo TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Geo distance COLUMN_SCALAR Int32 # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Geo [ { "_key": "the record for geo_distance() result" } ] # [[0, 1337566253.89858, 0.000355720520019531], 1] .ft P .fi .UNINDENT .UNINDENT .sp この実行例では \fBdistance\fP カラムを持つ \fBGeo\fP テーブルを作成します。 \fBdistance\fP カラムには距離を保存します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Geo \-\-output_columns distance \-\-scorer \(aqdistance = geo_distance("146566000x\-266422000", "185428000x\-461000", "rectangle")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "distance", # "Int32" # ] # ], # [ # 5807750 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このサンプルは \fBgeo_distance\fP がロンドンの座標とニューヨークの座標から距離を計算していることを示します。 .SS 引数 .SS 必須引数 .sp 必須引数は二つあります。 \fBpoint1\fP と \fBpoint2\fP です。 .SS \fBpoint1\fP .sp 計算しようとしている二点間の開始地点を指定します。 .sp GeoPoint型の値を指定することができます。 [1] .sp GeoPointについては \fB/reference/types\fP を参照してください。 .SS \fBpoint2\fP .sp 計算しようとしている二点間の終了地点を指定します。 .sp GeoPoint型の値か座標を表す文字列を指定することができます。 .sp GeoPointと座標については \fB/reference/types\fP を参照してください。 .SS 省略可能引数 .sp 省略可能な引数として \fBapproximate_type\fP があります。 .SS \fBapproximate_type\fP .sp 距離を計算するときに地形をどのように近似するかを指定します。 .sp \fBapproximate_type\fP の値は以下を指定することができます。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBrectangle\fP .IP \(bu 2 \fBsphere\fP .IP \(bu 2 \fBellipsoid\fP .UNINDENT .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \fBgeo_distance\fP には制限があります。 \fBsphere\fP や \fBellipsoid\fP を近似方法として選択した場合、子午線や日付変更線、赤道といった境界をまたぐ距離の計算を行うことができません。この制限は \fBrectangle\fP を近似方法として選択した場合にはありません。これはGroongaの実装上の一時的な制限ですが、将来的には修正される予定です。 .UNINDENT .UNINDENT .SS \fBrectangle\fP .sp この引数を指定すると地形を方形近似して距離を計算します。 .sp 簡易な式で距離の計算を行うので、高速に距離を求めることができますが、極付近では誤差が増大します。 .sp \fBrect\fP を省略表記として指定することができます。 .sp カラムの値で距離を計算するサンプルは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Cities \-\-output_columns _score \-\-filter 1 \-\-scorer \(aq_score = geo_distance(location, "185428000x\-461000", "rectangle")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_score", # "Int32" # ] # ], # [ # 5715104 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 明示的に位置を指定して距離を計算するサンプルは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Geo \-\-output_columns distance \-\-scorer \(aqdistance = geo_distance("146566000x\-266422000", "185428000x\-461000", "rectangle")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "distance", # "Int32" # ] # ], # [ # 5807750 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 明示的に子午線や赤道、日付変更線をまたぐような位置を指定して距離を計算するサンプルは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Geo \-\-output_columns distance \-\-scorer \(aqdistance = geo_distance("175904000x8464000", "145508000x\-13291000", "rectangle")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "distance", # "Int32" # ] # ], # [ # 1051293 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このサンプルは子午線をまたいだ場合の距離を示します。 \fBgeo_distance("175904000x8464000", "145508000x\-13291000", "rectangle")\fP はパリ(フランス)からマドリード(スペイン)間の距離を返します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Geo \-\-output_columns distance \-\-scorer \(aqdistance = geo_distance("146566000x\-266422000", "\-56880000x\-172310000", "rectangle")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "distance", # "Int32" # ] # ], # [ # 6880439 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このサンプルは赤道をまたいだ場合の距離を示します。 \fBgeo_distance("146566000x\-266422000", "\-56880000x\-172310000", "rectangle")\fP はニューヨーク(アメリカ)からブラジリア(ブラジル)間の距離を返します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Geo \-\-output_columns distance \-\-scorer \(aqdistance = geo_distance("143660000x419009000", "135960000x\-440760000", "rectangle")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "distance", # "Int32" # ] # ], # [ # 10475205 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このサンプルは日付変更線をまたいだ場合の距離を示します。 \fBgeo_distance("143660000x419009000", "135960000x\-440760000", "rectangle")\fP は北京(中国)からサンフランシスコ(アメリカ)間の距離を返します。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \fBgeo_distance\fP は方形近似をデフォルトとして使用します。 \fBapproximate_type\fP を省略すると \fBgeo_distance\fP は \fBrectangle\fP が指定されたものとして振舞います。 .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \fBgeo_distance\fP は \fBapproximate_type\fP の値が \fB"rectangle"\fP であるときに \fBpoint1\fP の値として座標を表す文字列を受けつけます。もし \fBsphere\fP や \fBellipsoid\fP と一緒に座標を表す文字列を \fBpoint1\fP へ指定した場合、 \fBgeo_distance\fP は距離の値として0を返します。 .UNINDENT .UNINDENT .SS \fBsphere\fP .sp この引数を指定すると球面近似で地形を近似して距離を計算します。 .sp 球面近似は \fBrectangle\fP よりも遅いです。しかし \fBrectangle\fP よりも誤差は小さくなります。 .sp \fBsphr\fP を省略表記として指定することができます。 .sp カラムの値で距離を計算するサンプルは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Cities \-\-output_columns _score \-\-filter 1 \-\-scorer \(aq_score = geo_distance(location, "185428000x\-461000", "sphere")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_score", # "Int32" # ] # ], # [ # 5715102 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBellipsoid\fP .sp この引数を指定すると楕円近似で地形を近似して距離を計算します。 .sp ヒュベニの距離計算式により距離を計算します。 \fBsphere\fP よりも遅いですが、 \fBsphere\fP より誤差は小さくなります。 .sp \fBellip\fP を省略表記として指定することができます。 .sp カラムの値で距離を計算するサンプルは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Cities \-\-output_columns _score \-\-filter 1 \-\-scorer \(aq_score = geo_distance(location, "185428000x\-461000", "ellipsoid")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_score", # "Int32" # ] # ], # [ # 5706263 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 戻り値 .sp \fBgeo_distance\fP はFloat型の値を距離として返します。単位はメートルです。 脚注 .IP [1] 5 日本測地系座標か世界測地系座標のいずれかを指定することができます。 .SS geo_in_circle .SS 名前 .sp geo_in_circle \- 座標が円の範囲内に存在するかどうかを調べます。 .SS 書式 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C geo_in_circle(point, center, radious_or_point[, approximate_type]) .ft P .fi .UNINDENT .UNINDENT .SS 説明 .sp Groonga組込関数の一つであるgeo_in_circleについて説明します。組込関数は、script形式のgrn_expr中で呼び出すことができます。 .sp geo_in_circle() 関数は、pointに指定した座標が、centerに指定した座標を中心とする円の範囲内にあるかどうかを調べます。 .SS 引数 .sp \fBpoint\fP .INDENT 0.0 .INDENT 3.5 円の範囲内に存在するかどうかを調べる座標を指定します。Point型の値を指定できます。 [1] .UNINDENT .UNINDENT .sp \fBcenter\fP .INDENT 0.0 .INDENT 3.5 円の中心となる座標を指定します。Point型の値、あるいは座標を示す文字列を指定できます。 .UNINDENT .UNINDENT .sp \fBradious_or_point\fP .INDENT 0.0 .INDENT 3.5 円の半径を指定します。数値を指定した場合には、半径(単位:メートル)が指定されたものとみなします。 Point型の値、あるいは座標を示す文字列を指定した場合は、円周上の点の一つの座標が指定されたものとみなします。 .UNINDENT .UNINDENT .sp \fBapproximate_type\fP .INDENT 0.0 .INDENT 3.5 半径からの距離を求めるために地形をどのように近似するかを指定します。指定できる値は以下の通りです。 .sp \fB"rectangle"\fP .INDENT 0.0 .INDENT 3.5 方形近似で近似します。単純な計算式で距離を求めることができるため高速ですが、極付近では誤差が大きくなります。 .sp \fB"rect"\fP と省略して指定することもできます。 .sp この近似方法がデフォルト値です。 \fBapproximate_type\fP を省略した場合は方形近似になります。 .UNINDENT .UNINDENT .sp \fB"sphere"\fP .INDENT 0.0 .INDENT 3.5 球面近似で近似します。 \fB"rectangle"\fP よりも遅くなりますが、誤差は小さいです。 .sp \fB"sphr"\fP と省略して指定することもできます。 .UNINDENT .UNINDENT .sp \fB"ellipsoid"\fP .INDENT 0.0 .INDENT 3.5 楕円体近似で近似します。距離の計算にはヒュベニの距離計算式を用います。 \fB"sphere"\fP よりも遅くなりますが、誤差は小さくなります。 .sp \fB"ellip"\fP と省略して指定することもできます。 .UNINDENT .UNINDENT .UNINDENT .UNINDENT .SS 返値 .sp pointに指定した座標が円の範囲内にあるかどうかをBool型の値で返します。 .SS 例 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C geo_in_circle(pos, "100x100", 100) true .ft P .fi .UNINDENT .UNINDENT 脚注 .IP [1] 5 TokyoGeoPoint(日本測地系座標)かWGS84GeoPoint(世界測地系座標)のいずれかを指定できます。 .SS geo_in_rectangle .SS 名前 .sp geo_in_rectangle \- 座標が矩形の範囲内に存在するかどうかを調べます。 .SS 書式 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C geo_in_rectangle(point, top_left, bottom_right) .ft P .fi .UNINDENT .UNINDENT .SS 説明 .sp Groonga組込関数の一つであるgeo_in_rectangleについて説明します。組込関数は、script形式のgrn_expr中で呼び出すことができます。 .sp geo_in_rectangle() 関数は、pointに指定した座標が、top_leftとbottom_rightがなす矩形の範囲内にあるかどうかを調べます。 .SS 引数 .sp \fBpoint\fP .INDENT 0.0 .INDENT 3.5 矩形の範囲内に存在するかどうかを調べる座標を指定します。Point型の値を指定できます。 [1] .UNINDENT .UNINDENT .sp \fBtop_left\fP .INDENT 0.0 .INDENT 3.5 矩形の左上隅となる座標を指定します。Point型の値、あるいは座標を示す文字列を指定できます。 .UNINDENT .UNINDENT .sp \fBbottom_right\fP .INDENT 0.0 .INDENT 3.5 矩形の右下隅となる座標を指定します。Point型の値、あるいは座標を示す文字列を指定できます。 .UNINDENT .UNINDENT .SS 返値 .sp pointに指定した座標が矩形の範囲内にあるかどうかをBool型の値で返します。 .SS 例 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C geo_in_rectangle(pos, "150x100", "100x150") true .ft P .fi .UNINDENT .UNINDENT 脚注 .IP [1] 5 TokyoGeoPoint(日本測地系座標)かWGS84GeoPoint(世界測地系座標)のいずれかを指定できます。 .SS highlight_full .sp \fBご用心:\fP .INDENT 0.0 .INDENT 3.5 この機能は実験的です。APIが変わる可能性があります。 .UNINDENT .UNINDENT .SS 概要 .sp \fBhighlight_full\fP は対象テキストをタグ付けします。検索文字列をハイライトさせるために利用することができます。HTMLエスケープの有無、ノーマライザー名を指定することができ、キーワードごとにタグを変更することができます。 .SS 構文 .sp \fBhighlight_full\fP には必須引数と省略可能引数とがあります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C highlight_full(column, normalizer_name, use_html_escape, keyword1, open_tag1, close_tag1, ... [keywordN, open_tagN, close_tagN]) .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entries TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries body COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms document_index COLUMN_INDEX|WITH_POSITION Entries body # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Entries [ {"body": "Mroonga is a MySQL storage engine based on Groonga. Rroonga is a Ruby binding of Groonga."} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] .ft P .fi .UNINDENT .UNINDENT .sp \fBhighlight_full\fP は \fB/reference/commands/select\fP コマンドの \fB\-\-output_columns\fP 内でのみ指定できます。 .sp \fBhighlight_full\fP を使うにはGroonga 4.0.5以降が必要です。 .sp \fBhighlight_full\fP を使うには \fB/reference/command/command_version\fP 2以降を使う必要があります。 .sp 以下の例はHTMLエスケープを使用し、ノーマライザーに \fBNormalizerAuto\fP を指定しています。この例では キーワード \fBgroonga\fP に \fB\fP と \fB\fP のタグを指定し、キーワード \fBmysql\fP に \fB\fP と \fB\fP のタグを指定しています。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns \(aqhighlight_full(body, "NormalizerAuto", true, "Groonga", "", "", "mysql", "", "")\(aq \-\-command_version 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "highlight_full", # "null" # ] # ], # [ # "Mroonga is a MySQL storage engine based on Groonga. <b>Rroonga</b> is a Ruby binding of Groonga." # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp キーワードとテキストは \fBNormalizerAuto\fP ノーマライザーで正規化されてタグ付けのためにスキャンされます。 .sp \fB\-\-query "groonga mysql"\fP は最初のレコードにマッチします。 \fBhighlight_full\fP は、テキスト中に含まれるキーワード \fBgroonga\fP を \fB\fP と \fB\fP で囲み、 キーワード \fBmysql\fP を \fB\fP と \fB\fP で囲みます。 .sp \fB<\fP や \fB>\fP などの特殊文字は < や > にエスケープされています。 .sp カラムの代わりに文字列リテラルを指定することもできます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns \(aqhighlight_full("Groonga is very fast fulltext search engine.", "NormalizerAuto", true, "Groonga", "", "", "mysql", "", "")\(aq \-\-command_version 2 \-\-match_columns body \-\-query "groonga" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "highlight_full", # "null" # ] # ], # [ # "Groonga is very fast fulltext search engine." # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp 必須引数は3つあります。 \fBcolumn\fP と \fBnormalizer_name\fP と \fBuse_html_escape\fP です。省略可能引数は3つ以上あります。 \fBkeywordN\fP と \fBopen_tagN\fP と \fBend_tagN\fP です。 .SS \fBcolumn\fP .sp テーブルのカラムを指定します。 .SS \fBnormalizer_name\fP .sp ノーマライザー名を指定します。 .SS \fBuse_html_escape\fP .sp HTMLエスケープの有無を指定します。 \fBtrue\fP を指定すればHTMLエスケープされます。 \fBfalse\fP を指定すればHTMLエスケープされません。 .SS \fBkeywordN\fP .sp タグ付けするキーワードを指定します。3つの引数ごとに複数のキーワードを指定することができます。 .SS \fBopen_tagN\fP .sp 開始タグを指定します。3つの引数ごとに複数の開始タグを指定することができます。 .SS \fBclose_tagN\fP .sp 終了タグを指定します。3つの引数ごとに複数の終了タグを指定することができます。 .SS 戻り値 .sp \fBhighlight_full\fP はタグ付の文字列もしくは null を返します。\fBhighlight_full\fP は該当するキーワードがない場合に null を返します。 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/commands/select\fP .IP \(bu 2 \fB/reference/functions/highlight_html\fP .UNINDENT .SS highlight_html .sp \fBご用心:\fP .INDENT 0.0 .INDENT 3.5 この機能は実験的です。APIが変わる可能性があります。 .UNINDENT .UNINDENT .sp バージョン 4.0.5 で追加. .SS 概要 .sp \fBhighlight_html\fP は対象テキストをタグ付けします。検索文字列をハイライトさせるために利用することができます。タグ付けされたテキストはHTML中に埋め込みやすいように処理されています。\fB<\fP や \fB>\fP などの特殊文字は < や > にエスケープされています。キーワードは \fB\fP と \fB\fP で囲まれています。たとえば、 \fBI am a groonga user. <3\fP という対象テキストのキーワード \fBgroonga\fP でタグ付けされたテキストは \fBI am a groonga user. <3\fP となります。 .SS 構文 .sp この関数の引数は1つです。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C highlight_html(text) .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entries TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries body COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms document_index COLUMN_INDEX|WITH_POSITION Entries body # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Entries [ {"body": "Mroonga is a MySQL storage engine based on Groonga. Rroonga is a Ruby binding of Groonga."} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] .ft P .fi .UNINDENT .UNINDENT .sp \fBhighlight_html\fP は \fB/reference/commands/select\fP コマンドの \fB\-\-output_columns\fP 内でのみ指定できます。 .sp \fBhighlight_html\fP を使うには \fB/reference/command/command_version\fP 2以降を使う必要があります。 .sp また、 \fB\-\-query\fP と \fB\-\-filter\fP オプションも指定する必要があります。(どちらか一方でも構いません。)これは、 \fB\-\-query\fP と \fB\-\-filter\fP オプションからキーワードを抽出しているためです。 .sp 以下の例は \fB\-\-query "groonga mysql"\fP を使っています。この場合は、キーワードとして \fBgroonga\fP と \fBmysql\fP を使います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns \-\-match_columns body \-\-query \(aqgroonga mysql\(aq \-\-output_columns \(aqhighlight_html(body)\(aq \-\-command_version 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "highlight_html", # "null" # ] # ], # [ # "Mroonga is a MySQL storage engine based on Groonga. <b>Rroonga</b> is a Ruby binding of Groonga." # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp キーワードとテキストは \fBNormalizerAuto\fP ノーマライザーで正規化されてタグ付けのためにスキャンされます。 .sp \fB\-\-query "groonga mysql"\fP は最初のレコードにマッチします。\fBhighlight_html(body)\fP は、テキスト中に含まれるキーワード \fBgroonga\fP と \fBmysql\fP を \fB\fP と \fB\fP で囲みます。 .sp カラムの代わりに文字列リテラルを指定することもできます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Entries \-\-output_columns \(aqhighlight_html("Groonga is very fast fulltext search engine.")\(aq \-\-command_version 2 \-\-match_columns body \-\-query "groonga" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "highlight_html", # "null" # ] # ], # [ # "Groonga is very fast fulltext search engine." # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションではすべての引数について説明します。 .SS 必須引数 .sp 1つだけ必須の引数があります。 .SS \fBtext\fP .sp HTMLでハイライトする対象のテキストです。 .SS 省略可能引数 .sp 省略可能な引数はありません。 .SS 戻り値 .sp \fBhighlight_html\fP はタグ付の文字列もしくは null を返します。\fBhighlight_html\fP は該当するキーワードがない場合に null を返します。 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/commands/select\fP .IP \(bu 2 \fB/reference/functions/highlight_full\fP .UNINDENT .SS html_untag .SS 概要 .sp \fBhtml_untag\fP はHTMLタグをHTMLから除去したテキストを出力します。 .sp \fBhtml_untag\fP は select\-output\-columns で説明している \fB\-\-output_columns\fP で使います。 .SS 構文 .sp \fBhtml_untag\fP は引数を一つだけとります。 それは \fBhtml\fP です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C html_untag(html) .ft P .fi .UNINDENT .UNINDENT .SS 必要条件 .sp \fBhtml_untag\fP を使うにはGroonga 3.0.5以降が必要です。 .sp \fBhtml_untag\fP を使うには \fB/reference/command/command_version\fP 2以降を使う必要があります。 .SS 使い方 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp サンプルスキーマ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create WebClips TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create WebClips content COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp サンプルデータ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table WebClips [ {"_key": "http://groonga.org", "content": "groonga is fast"}, {"_key": "http://mroonga.org", "content": "mroonga is fast"}, ] # [[0, 1337566253.89858, 0.000355720520019531], 2] .ft P .fi .UNINDENT .UNINDENT .sp カラムの本文からHTMLタグを除去する \fBhtml_untag\fP 関数の簡単な例はこちらです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select WebClips \-\-output_columns "html_untag(content)" \-\-command_version 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "html_untag", # "null" # ] # ], # [ # "groonga is fast" # ], # [ # "mroonga is fast" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 上記クエリを実行すると、"class" 属性つきの "span" タグが除去されているのがわかります。\fBhtml_untag\fP 関数を使うのには \fB\-\-command_vesion 2\fP を指定しなければならないことに注意してください。 .SS 引数 .sp 必須引数が一つあり、それは \fBhtml\fP です。 .SS \fBhtml\fP .sp タグを取り除きたいHTMLを指定します。 .SS 戻り値 .sp \fBhtml_untag\fP はHTMLテキストからHTMLタグを除去したタグなしのテキストを返します。 .SS in_values .SS 概要 .sp バージョン 4.0.7 で追加. .sp \fBin_values\fP は 複数の \fBOR\fP や \fB==\fP を使っているクエリを簡略化できます。複数の \fBOR\fP や \fB==\fP を使うよりは \fBin_values\fP を使うのがパフォーマンスの観点からおすすめです。 .SS 構文 .sp \fBquery\fP は2以上の引数 \- \fBtarget_value\fP と 複数の \fBvalue\fP が必要です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C in_values(target_value, value1, ..., valueN) .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp サンプルスキーマ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Tags TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Memos TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Memos tag COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Tags memos_tag COLUMN_INDEX Memos tag # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp サンプルデータ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Memos [ {"_key": "Groonga is fast", "tag": "groonga"}, {"_key": "Mroonga is fast", "tag": "mroonga"}, {"_key": "Rroonga is fast", "tag": "rroonga"}, {"_key": "Droonga is fast", "tag": "droonga"}, {"_key": "Groonga is a HTTP server", "tag": "groonga"} ] # [[0, 1337566253.89858, 0.000355720520019531], 5] .ft P .fi .UNINDENT .UNINDENT .sp \fBin_values\fP 関数を使って \fBtag\fP カラムの値が "groonga" 、 "mroonga" あるいは "droonga" であるものを選択する例を示します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Memos \-\-output_columns _key,tag \-\-filter \(aqin_values(tag, "groonga", "mroonga", "droonga")\(aq \-\-sortby _id # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 4 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "tag", # "ShortText" # ] # ], # [ # "Groonga is fast", # "groonga" # ], # [ # "Mroonga is fast", # "mroonga" # ], # [ # "Droonga is fast", # "droonga" # ], # [ # "Groonga is a HTTP server", # "groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp クエリを実行すると、"rroonga"を除いた結果を得られます。"rroonga"は \fBin_values\fP には指定していないからです。 .SS 引数 .sp 二つ以上の引数が必須です。 \fBtarget_valule\fP と 1つ以上の \fBvalue\fP です。 .SS \fBtarget_value\fP .sp \fBselect\fP 対象の \fBtable\fP に指定されたテーブルのカラムを指定します。 .SS \fBvalue\fP .sp 選択したいカラムの値を指定します。 .SS 戻り値 .sp \fBin_values\fP は対象となるカラムに指定した値が含まれるかを返します。 .sp もし該当するレコードがあれば、 \fBtrue\fP を返します。そうでなければ \fBfalse\fP を返します。 .SS now .SS 名前 .sp now \- 現在時刻を返す .SS 書式 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C now() .ft P .fi .UNINDENT .UNINDENT .SS 説明 .sp Groonga組込関数の一つであるnowについて説明します。組込関数は、script形式のgrn_expr中で呼び出すことができます。 .sp now() 関数は現在時刻に対応するTime型の値を返します。 .SS 返値 .sp 現在時刻に対応するTime型のオブジェクトを返します。 .SS 例 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C now() 1256791194.55541 .ft P .fi .UNINDENT .UNINDENT .SS query .SS 概要 .sp \fBquery\fP は、\fB/reference/commands/select\fP の \fB\-\-match_columns\fP と \fB\-\-query\fP 引数の機能を関数として提供します。\fB/reference/commands/select\fP の \fB\-\-filter\fP 引数で複数の \fBquery\fP 関数を指定することができます。 .sp そのような柔軟性があるので、 複数の \fBquery\fP 関数を組合せることで全文検索の振舞いを制御することができます。 .sp \fBquery\fP は \fB/reference/commands/select\fP コマンドの \fB\-\-filter\fP 内でのみ指定できます。 .SS 構文 .sp \fBquery\fP は2つの引数が必要です。 \fBmatch_columns\fP と \fBquery_string\fP です。 .sp 引数の \fBquery_expander\fP や \fBsubstitution_table\fP は省略可能です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C query(match_columns, query_string) query(match_columns, query_string, query_expander) query(match_columns, query_string, substitution_table) .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp サンプルスキーマ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Documents TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Documents content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms documents_content_index COLUMN_INDEX|WITH_POSITION Documents content # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Users TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Users name COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Users memo COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Lexicon TABLE_HASH_KEY ShortText \e \-\-default_tokenizer TokenBigramSplitSymbolAlphaDigit \e \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Lexicon users_name COLUMN_INDEX|WITH_POSITION Users name # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Lexicon users_memo COLUMN_INDEX|WITH_POSITION Users memo # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp サンプルデータ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Users [ {"name": "Alice", "memo": "groonga user"}, {"name": "Alisa", "memo": "mroonga user"}, {"name": "Bob", "memo": "rroonga user"}, {"name": "Tom", "memo": "nroonga user"}, {"name": "Tobby", "memo": "groonga and mroonga user. mroonga is ..."}, ] # [[0, 1337566253.89858, 0.000355720520019531], 5] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-match_columns\fP と \fB\-\-query\fP 引数を使わずにキーワード\(aqalice\(aqを \fBquery\fP 関数を使って検索する簡単な使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Users \-\-output_columns name,_score \-\-filter \(aqquery("name * 10", "alice")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "name", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Alice", # 10 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 上記のクエリを実行する際、\(aqalice\(aqというキーワードには重みづけとして値10を設定します。 .sp \fBquery\fP あり/なしで対照的な例がこちらです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Users \-\-output_columns name,memo,_score \-\-match_columns "memo * 10" \-\-query "memo:@groonga OR memo:@mroonga OR memo:@user" \-\-sortby \-_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "name", # "ShortText" # ], # [ # "memo", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Tobby", # "groonga and mroonga user. mroonga is ...", # 4 # ], # [ # "Alice", # "groonga user", # 2 # ], # [ # "Alisa", # "mroonga user", # 2 # ], # [ # "Bob", # "rroonga user", # 1 # ], # [ # "Tom", # "nroonga user", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp この場合、\(aqgroonga\(aqと\(aqmroonga\(aqと\(aquser\(aqというキーワードは同じ重みづけがされています。この方法ではキーワードごとに異なる重みづけを行うことはできません。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Users \-\-output_columns name,memo,_score \-\-filter \(aqquery("memo * 10", "groonga") || query("memo * 20", "mroonga") || query("memo * 1", "user")\(aq \-\-sortby \-_score # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "name", # "ShortText" # ], # [ # "memo", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "Tobby", # "groonga and mroonga user. mroonga is ...", # 51 # ], # [ # "Alisa", # "mroonga user", # 21 # ], # [ # "Alice", # "groonga user", # 11 # ], # [ # "Tom", # "nroonga user", # 1 # ], # [ # "Bob", # "rroonga user", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 一方、複数の \fBquery\fP を指定することで、\(aqgroonga\(aqと\(aqmroonga\(aqと\(aquser\(aqそれぞれのキーワードに対し異なる重みづけを行えます。 .sp 結果として、意図した様に異なる重みづけを行いつつ全文検索の振舞いを制御することができます。 .SS 引数 .SS 必須引数 .sp 必須引数は二つあります。 \fBmatch_columns\fP と \fBquery_string\fP です。 .SS \fBmatch_columns\fP .sp \fBquery_string\fP パラメーターの値で全文検索するときのデフォルトの検索対象カラムを指定します。このパラメーターは \fBselect\fP の select\-match\-columns パラメーターと同じ役割です。 .SS \fBquery_string\fP .sp \fB/reference/grn_expr/query_syntax\fP で検索条件を指定します。このパラメーターは \fBselect\fP コマンドの \fBquery\fP パラメーターと同じ役割です。 .sp \fBselect\fP コマンドの \fBquery\fP については select\-match\-columns を参照してください。 .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBquery_expander\fP .sp クエリ展開に使うプラグイン名を指定します。 .sp \fB/reference/query_expanders/tsv\fP は公式リリースに含まれているプラグインの1つです。 .sp 詳細については \fB/reference/query_expanders/tsv\fP を参照してください。 .SS \fB置換テーブル\fP .sp 置換テーブルとカラム名を \fB${TABLE}.${COLUMN}\fP という書式でクエリ展開のために指定します。 .sp 詳細については select\-query\-expander を参照してください。 .SS 戻り値 .sp \fBquery\fP は1つでもレコードがマッチしたかどうかを返します。もし、1つ以上のレコードがマッチしたら \fBtrue\fP を返します。1つもマッチしなかったら \fBfalse\fP を返します。 .SS TODO .INDENT 0.0 .IP \(bu 2 query_flagsのサポート .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/commands/select\fP .UNINDENT .SS rand .SS 名前 .sp rand \- 乱数を生成する .SS 書式 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C rand([max]) .ft P .fi .UNINDENT .UNINDENT .SS 説明 .sp Groonga組込関数の一つであるrandについて説明します。組込関数は、script形式のgrn_expr中で呼び出すことができます。 .sp rand() 関数は 0 から max の間の疑似乱数整数を返します。 .SS 引数 .sp \fBmax\fP .INDENT 0.0 .INDENT 3.5 返値の最大値を指定します。省略した場合は RAND_MAX が指定されたものとみなされます。 .UNINDENT .UNINDENT .SS 返値 .sp 0 と max の間の数を表すInt32型の値を返します。 .SS 例 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C rand(10) 3 .ft P .fi .UNINDENT .UNINDENT .SS snippet_html .sp \fBご用心:\fP .INDENT 0.0 .INDENT 3.5 この機能は実験的です。APIが変わる可能性があります。 .UNINDENT .UNINDENT .SS 概要 .sp \fBsnippet_html\fP は対象テキスト中から検索キーワード周辺のテキスト( \fBKWIC\fP 。 \fBKeyWord In Context\fP )を抽出します。抽出されたテキストのことをスニペットと呼びます。スニペットはHTML中に埋め込みやすいように処理されています。 \fB<\fP や \fB>\fP などの特殊文字は \fB<\fP や \fB>\fP にエスケープされています。キーワードは \fB\fP と \fB\fP で囲まれています。たとえば、 \fBI am a groonga user. <3\fP という対象テキストのキーワード \fBgroonga\fP でのスニペットは \fBI am a groonga user. <3\fP となります。 .SS 構文 .sp \fBsnippet_html\fP の引数は1つだけです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C snippet_html(column) .ft P .fi .UNINDENT .UNINDENT .sp \fBsnippet_html\fP は内部にはたくさんのオプションがありますが、今はまだ指定できません。じきに指定できるようになる予定です。 .SS 使い方 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Documents TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Documents content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms documents_content_index COLUMN_INDEX|WITH_POSITION Documents content # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Documents [ ["content"], ["Groonga is a fast and accurate full text search engine based on inverted index. One of the characteristics of groonga is that a newly registered document instantly appears in search results. Also, groonga allows updates without read locks. These characteristics result in superior performance on real\-time applications."], ["Groonga is also a column\-oriented database management system (DBMS). Compared with well\-known row\-oriented systems, such as MySQL and PostgreSQL, column\-oriented systems are more suited for aggregate queries. Due to this advantage, groonga can cover weakness of row\-oriented systems."] ] # [[0, 1337566253.89858, 0.000355720520019531], 2] .ft P .fi .UNINDENT .UNINDENT .sp \fBsnippet_html\fP は \fB/reference/commands/select\fP コマンドの \fB\-\-output_columns\fP 内でのみ指定できます。 .sp Groonga 2.0.9では \fBoutput_columns\fP 内での関数呼び出しはまだ実験的な機能なので、明示的に \fB\-\-command_version 2\fP オプションを指定する必要があります。この機能はじきに有効になる予定です。 .sp また、 \fB\-\-query\fP と \fB\-\-filter\fP オプションも指定する必要があります。(どちらか一方でも構いません。)これは、 \fB\-\-query\fP と \fB\-\-filter\fP オプションからキーワードを抽出しているためです。 .sp 以下の例は \fB\-\-query "fast performance"\fP を使っています。この場合は、キーワードとして \fBfast\fP と \fBperformance\fP を使います。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Documents \-\-output_columns "snippet_html(content)" \-\-command_version 2 \-\-match_columns content \-\-query "fast performance" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "snippet_html", # "null" # ] # ], # [ # [ # "Groonga is a fast and accurate full text search engine based on inverted index. One of the characteristics of groonga is that a newly registered document instantly appears in search results. Also, gro", # "onga allows updates without read locks. These characteristics result in superior performance on real\-time applications." # ] # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-query "fast performance"\fP は最初のレコードの内容にだけマッチします。 \fBsnippet_html(content)\fP は、テキスト中からキーワード \fBfast\fP と \fBperformance\fP の少なくともどちらか一方を含んでいるテキストの断片を抽出します。今回は2箇所抽出しています。そして、抽出したテキストの断片内にあるキーワードを \fB\fP と \fB\fP で囲みます。 .sp テキストの断片数は多くても3です。4つ以上のテキストの断片が抽出できるときは、最初の3つだけを使います。 .sp テキストの断片の最大サイズは200バイトです。単位は文字数ではなくバイトです。挿入される \fB\fP と \fB\fP のバイト数はこのサイズの中には含まれません。 .sp テキストの断片の最大数とテキストの断片の最大サイズはカスタマイズできません。 .sp カラムの代わりに文字列リテラルを指定することもできます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Documents \-\-output_columns \(aqsnippet_html("Groonga is very fast fulltext search engine.")\(aq \-\-command_version 2 \-\-match_columns content \-\-query "fast performance" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "snippet_html", # "null" # ] # ], # [ # [ # "Groonga is very fast fulltext search engine." # ] # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 戻り値 .sp \fBsnippet_html\fP は文字列の配列もしくは \fBnull\fP を返します。 \fBsnippet_html\fP は該当するスニペットがない場合に \fBnull\fP を返します。 .sp 配列の要素がスニペットになります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [SNIPPET1, SNIPPET2, SNIPPET3] .ft P .fi .UNINDENT .UNINDENT .sp スニペットには1つ以上のキーワードが含まれています。 \fB\fP と \fB\fP を除いたスニペットの最大サイズは200byteです。単位は文字数ではなくてバイトです。 .sp 配列のサイズは0以上3以下です。最大サイズの3は、じきにカスタマイズできるようになる予定です。 .SS TODO .INDENT 0.0 .IP \(bu 2 テキストの断片の最大数をカスタマイズできるようにする。 .IP \(bu 2 テキストの断片最大サイズをカスタマイズできるようにする。 .IP \(bu 2 キーワードをカスタマイズできるようにする。 .IP \(bu 2 キーワードを囲むタグをカスタマイズできるようにする。 .IP \(bu 2 正規化の方法をカスタマイズできるようにする。 .IP \(bu 2 オブジェクトリテラル形式でのオプション指定をサポートする。 .UNINDENT .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/commands/select\fP .UNINDENT .SS sub_filter .SS 概要 .sp \fBsub_filter\fP は \fBfilter_string\fP を \fBscope\fP のコンテキストで評価します。 .sp \fBsub_filter\fP は \fB/reference/commands/select\fP コマンドの \fB\-\-filter\fP 内でのみ指定できます。 .SS 構文 .sp \fBsub_filter\fP は2つの引数が必要です。 \fBscope\fP と \fBfilter_string\fP です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C sub_filter(scope, filter_string) .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp サンプルスキーマ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Comment TABLE_PAT_KEY UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Comment name COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Comment content COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Blog TABLE_PAT_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Blog title COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Blog content COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Blog comments COLUMN_VECTOR Comment # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Comment blog_comment_index COLUMN_INDEX Blog comments # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Lexicon TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Lexicon comment_content COLUMN_INDEX|WITH_POSITION Comment content # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Lexicon comment_name COLUMN_INDEX|WITH_POSITION Comment name # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Lexicon blog_content COLUMN_INDEX|WITH_POSITION Blog content # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp サンプルデータ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Comment [ {"_key": 1, "name": "A", "content": "groonga"}, {"_key": 2, "name": "B", "content": "groonga"}, {"_key": 3, "name": "C", "content": "rroonga"}, {"_key": 4, "name": "A", "content": "mroonga"}, ] # [[0, 1337566253.89858, 0.000355720520019531], 4] load \-\-table Blog [ {"_key": "groonga\(aqs blog", "content": "content of groonga\(aqs blog", comments: [1, 2, 3]}, {"_key": "mroonga\(aqs blog", "content": "content of mroonga\(aqs blog", comments: [2, 3, 4]}, {"_key": "rroonga\(aqs blog", "content": "content of rroonga\(aqs blog", comments: [3]}, ] # [[0, 1337566253.89858, 0.000355720520019531], 3] .ft P .fi .UNINDENT .UNINDENT .sp ブログのエントリを抽出する \fBsub_filter\fP 関数の使用例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Blog \-\-output_columns _key \-\-filter "comments.name @ \e"A\e" && comments.content @ \e"groonga\e"" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ] # ], # [ # "groonga\(aqs blog" # ], # [ # "mroonga\(aqs blog" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 上記のクエリを実行すると、"groonga\(aqs blog"だけでなく、"mroonga\(aqs blog"もマッチします。ユーザー"A"は"mroonga\(aqs blog"に対しては"groonga"に言及していないので、これは意図していない結果です。 .sp sub_filterなしでは、以下の条件が満たされます。 .INDENT 0.0 .IP \(bu 2 すくなくとも一つはユーザー"A"がコメントしたレコードがある。 .IP \(bu 2 すくなくとも一つは"groonga"について言及したレコードがある。 .UNINDENT .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Blog \-\-output_columns _key \-\-filter \(aqsub_filter(comments, "name @ \e\e"A\e\e" && content @ \e\e"groonga\e\e"")\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ] # ], # [ # "groonga\(aqs blog" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 一方、上記のクエリは意図した結果を返します。これは、sub_filterの引数がcommentsカラムのコンテキストで評価されるからです。 .sp sub_filterは以下の条件が満たされていることを要求します。 .INDENT 0.0 .IP \(bu 2 ユーザー"A"が"groonga"について言及しているレコードがある。 .UNINDENT .SS 引数 .sp 必須引数は二つあります。 \fBscope\fP と \fBfilter_string\fP です。 .SS \fBscope\fP .sp \fBselect\fP コマンドの \fBtable\fP パラメーターで指定したテーブルが持つカラムを指定します。このカラムには制限があります。制限については後述します。 \fBfilter_string\fP はこのカラムの文脈で評価されます。これは、 \fBfilter_string\fP は \fBselect \-\-table カラムの型 \-\-filter フィルター文字列\fP というように評価されるということです。 .sp 指定したカラムの型はテーブルでなければいけません。言いかえると、カラムの型は参照型でなければいけないということです。 .sp \fBカラム1.カラム2.カラム3...カラムN\fP という構文でカラムを数珠つなぎにできます。例えば、 \fBuser.group.name\fP とできます。 .sp \fBselect\fP コマンドの \fBtable\fP 引数については select\-table を参照してください。 .SS \fBfilter_string\fP .sp \fB/reference/grn_expr/script_syntax\fP の検索条件を指定します。これは \fBscope\fP のコンテキストで評価されます。 .SS 戻り値 .sp \fBsub_filter\fP は1つでもレコードがマッチしたかどうかを返します。もし、1つ以上のレコードがマッチしたら \fBtrue\fP を返します。1つもマッチしなかったら \fBfalse\fP を返します。 .SS 参考 .INDENT 0.0 .IP \(bu 2 \fB/reference/commands/select\fP .IP \(bu 2 \fB/reference/grn_expr/script_syntax\fP .UNINDENT .SS vector_size .SS 概要 .sp バージョン 5.0.3 で追加. .sp \fBvector_size\fP はベクターカラムのサイズを返します。 .sp この関数を有効にするには、以下のコマンドで \fBfunctions/vector\fP プラグインを登録します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_register functions/vector .ft P .fi .UNINDENT .UNINDENT .sp その後、 \fB\-\-command_version 2\fP オプションと一緒に \fBvector_size\fP 関数を使ってください。\fBvector_size\fP を使うには \fB\-\-command_vesion 2\fP を指定しなければならないことに注意してください。 .SS 構文 .sp \fBvector_size\fP は引数を一つだけとります。 それは \fBtarget\fP です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C vector_size(target) .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp サンプルスキーマ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Memos TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Memos tags COLUMN_VECTOR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp サンプルデータ: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Memos [ {"_key": "Groonga", "tags": ["Groonga"]}, {"_key": "Rroonga", "tags": ["Groonga", "Ruby"]}, {"_key": "Nothing"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] .ft P .fi .UNINDENT .UNINDENT .sp \fBvector_size\fP 関数が \fBtag\fP カラムの値とそのサイズを返す例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Memos \-\-output_columns \(aqtags, vector_size(tags)\(aq \-\-command_version 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "tags", # "ShortText" # ], # [ # "vector_size", # "Object" # ] # ], # [ # [ # "Groonga" # ], # 1 # ], # [ # [ # "Groonga", # "Ruby" # ], # 2 # ], # [ # [], # 0 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp 必須引数が一つあり、それは \fBtarget\fP です。 .SS \fBtarget\fP .sp \fBselect\fP 対象の \fBtable\fP に指定されたテーブルのベクターカラムを指定します。 .SS 戻り値 .sp \fBvector_size\fP は対象のベクターカラムのサイズを返します。 .SS 操作方法 .sp Groongaには複数の検索機能があります。このセクションではこの検索の操作方法を説明します。 .SS 位置情報検索 .sp Groongaは位置情報検索をサポートしています。検索にはインデックスを使うので全文検索と同様に位置情報も高速に検索できます。 .SS 対応している機能 .sp Groongaは位置情報データのうち座標データのみサポートしています。線や面などはサポートしています。よってGroongaができることは以下の通りです。 .INDENT 0.0 .IP 1. 3 カラムに座標データを保存できる。 .IP 2. 3 指定した四角形の中にある座標を持つレコードを検索できる。 .IP 3. 3 指定した円の中にある座標を持つレコードを検索できる。 .IP 4. 3 2点間の距離を計算できる。 .IP 5. 3 指定した座標からの距離が近い順にレコードをソートできる。 .UNINDENT .sp 以下はGroongaの位置情報検索の利用例です。 .INDENT 0.0 .IP \(bu 2 駅の近くにあるマクドナルドをリストする。 .IP \(bu 2 現在地から近い順にケンタッキーをソートし、現在地からの距離付きでリストする。 .UNINDENT .sp 以下はGroongaではできないことです。 .INDENT 0.0 .IP \(bu 2 市内にあるマクドナルドを検索する。(Groongaは四角形と円以外の形状の位置情報検索をサポートしていません。) .IP \(bu 2 湖を表すレコードに位置情報として座標ではなく範囲を格納する。(カラムには座標データ以外を格納できません。) .UNINDENT .sp 以下の図はGroongaの位置情報検索機能を示しています。 .sp 以下の図はレコードのみがある図です。黒い点がレコードを表しています。以降の図ではレコードがどのように扱われるかを示します。 [画像: only records] [画像] .sp 執筆中。。。 ( \fI\%下書き\fP ) .SS サジェスト .sp Groongaにはサジェスト機能があります。このセクションではこの機能の使い方とどのように動作しているかを説明します。 .SS はじめに .sp Groongaのサジェスト機能は以下の機能を提供します。: .INDENT 0.0 .IP \(bu 2 補完 .IP \(bu 2 補正 .IP \(bu 2 提案 .UNINDENT .SS 補完 .sp 補完はユーザの入力を支援します。ユーザが単語の一部分のみしか入力していないときに、登録済みの語の中から補完候補の語を返します。 .sp 例えば、以下が登録済みの語とします。: .INDENT 0.0 .IP \(bu 2 "groonga" .IP \(bu 2 "complete" .IP \(bu 2 "correction" .IP \(bu 2 "suggest" .UNINDENT .sp ユーザが"co"と入力したとき、"complete"と"correction"を補完候補として返します。これはどちらも"co"で始まっているからです。 .sp ユーザが"sug"と入力したとき、"suggest"を返します。これは"suggest"が"sug"から始まっているからです。 .sp ユーザが"ab"と入力したときは何も返しません。これは"ab"から始まる語が1つも登録されていないからです。 .SS 補正 .sp 補正もユーザの入力を支援します。ユーザが間違った語を入力したときに登録済みの補正ペアの中から補正された語を返します。 .sp 例えば、以下のような補正ペアが登録されていたとします。 .TS center; |l|l|. _ T{ 間違った語 T} T{ 正しい語 T} _ T{ grroonga T} T{ groonga T} _ T{ gronga T} T{ groonga T} _ T{ gronnga T} T{ groonga T} _ .TE .sp ユーザが"gronga"と入力したとき、"groonga"を返します。これは、"gronga"が「間違った語」にあり、対応する「正しい語」カラムの値が"groonga"だからです。 .sp ユーザが"roonga"と入力したときは何も返しません。これは"roonga"が「間違った語」カラムにないからです。 .SS 提案 .sp 提案は、たくさんの文書が見つかったときに、ユーザがさらに絞り込むことを支援します。ユーザがクエリを入力したとき、登録済みの関連クエリペアから追加のキーワードを選び、追加のキーワードを含んだ新しいクエリを返します。 .sp 例えば、以下の関連クエリペアが登録されているとします。: .TS center; |l|l|. _ T{ キーワード T} T{ 関連クエリ T} _ T{ groonga T} T{ groonga search engine T} _ T{ search T} T{ Google search T} _ T{ speed T} T{ groonga speed T} _ .TE .sp ユーザが"groonga"と入力したとき、"groonga search engine"を返します。これは、"groonga"が「キーワード」カラムの値にあり、対応する「関連クエリ」カラムの値が"groonga search engine"だからです。 .sp ユーザが"MySQL"と入力したときは何も返しません。これは"MySQL"が「キーワード」カラムにないからです。 .SS 学習 .sp サジェスト機能を使う場合は、事前に登録済みのデータを用意する必要があります。これらのデータはユーザの入力を使って登録できます。これ用にgroonga\-suggest\-httpdコマンドとgroonga\-suggest\-learnerコマンドがあります。 .SS 補完 .sp このセクションでは以下の補完機能について説明します。: .INDENT 0.0 .IP \(bu 2 どのように動作するか .IP \(bu 2 使い方 .IP \(bu 2 学習方法 .UNINDENT .SS どのように動作するか .sp 補完機能は補完される語を計算するために3種類の検索を使います。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 1. 3 登録されている語を前方一致RK検索。 .IP 2. 3 学習したデータを共起検索。 .IP 3. 3 登録されている語を前方一致検索。(実行しないこともある) .UNINDENT .UNINDENT .UNINDENT .SS 前方一致RK検索 .sp RKはローマ字(Romaji)とカタカナ(Katakana)を意味しています。前方一致RK検索は登録されている語をユーザの入力から前方一致検索します。このとき、ユーザの入力はローマ字でもカタカナでもひらがなでも構いません。この機能は日本語を検索するときに便利です。 .sp 例えば、"日本"という語が登録されているとします。そして、その読みとして"ニホン"(カタカナにしないといけません)が登録されているとします。このとき、ユーザの入力が"ni"でも"二"でも"に"でも"日本"を見つけることができます。 .sp \fB/reference/executables/groonga\-suggest\-create\-dataset\fP 実行ファイルで \fBexample\fP という名前のデータセットを作ったとします。前方一致RK検索で使うために \fBitem_example\fP テーブルの \fB_key\fP と \fBkana\fP カラムに登録済みの単語と読みのペアを指定することで更新できます。 .SS 共起検索 .sp 共起検索は入力途中のユーザのクエリから登録されている語を見つけます。共起検索では検索データベースとしてユーザの入力シーケンスを使います。これはクエリログやアクセスログなどから学習します。 .sp 例えば、以下のようなユーザの入力シーケンスがあるとします。 .TS center; |l|l|. _ T{ 入力 T} T{ 検索実行 T} _ T{ s T} T{ していない T} _ T{ se T} T{ していない T} _ T{ sea T} T{ していない T} _ T{ sear T} T{ していない T} _ T{ searc T} T{ していない T} _ T{ search T} T{ した T} _ T{ e T} T{ していない T} _ T{ en T} T{ していない T} _ T{ eng T} T{ していない T} _ T{ engi T} T{ していない T} _ T{ engin T} T{ していない T} _ T{ engine T} T{ していない T} _ T{ enginen T} T{ していない(入力ミス!) T} _ T{ engine T} T{ した T} _ .TE .sp Groongaは以下のような補完ペアを作ります。: .TS center; |l|l|. _ T{ 入力 T} T{ 補完語 T} _ T{ s T} T{ search T} _ T{ se T} T{ search T} _ T{ sea T} T{ search T} _ T{ sear T} T{ search T} _ T{ searc T} T{ search T} _ T{ e T} T{ engine T} _ T{ en T} T{ engine T} _ T{ eng T} T{ engine T} _ T{ engi T} T{ engine T} _ T{ engin T} T{ engine T} _ T{ engine T} T{ engine T} _ T{ enginen T} T{ engine T} _ .TE .sp ユーザが検索を実行する前のすべての入力(例では"s"、"se"など)を検索を実行した語(例では"search")に対応付けます。 .sp 厳密に言うとこの説明は正しくありません。なぜならタイムスタンプに関することを省略しているからです。groongaは本当は「ユーザが検索を実行する前のすべての入力を」使いません。厳密には「ユーザが検索を実行する前の1分以内の入力のみ」を使います。検索実行時から1分より前の入力は使われません。 .sp ユーザが"sea"と入力したら、共起検索は"search"を返します。なぜなら、「入力」カラムには"sea"という値があり、対応する「補完語」カラムには"search"という値が入っているからです。 .SS 前方一致検索 .sp 前方一致検索はユーザが入力した文字列から始まる登録済みの語を検索します。この検索は前方一致RK検索とは違ってローマ字、カタカナ、ひらがなを特別扱いしません。 .sp この検索はいつも実行されるわけではありません。この検索は明示的に実行するように指示するか、前方一致RK検索と共起検索の両方がなにもヒットしないときのみ実行されます。 .sp 例えば、"search"が登録されているとします。ユーザは"s"、"se"、"sea"、"sear"、"searc"、"search"のどれでも"search"を補完候補として利用できます。 .SS 使い方 .sp Groongaは補完機能を使うために \fB/reference/commands/suggest\fP コマンドを用意しています。 \fB\-\-type complete\fP オプションを使うと補完機能を利用できます。 .sp 例えば、"en"と入力したときの補完結果を取得するコマンドは以下のようになります。: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C suggest \-\-table item_query \-\-column kana \-\-types complete \-\-frequency_threshold 1 \-\-query en # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "complete": [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "engine", # 1 # ] # ] # } # ] .ft P .fi .UNINDENT .UNINDENT .SS 学習方法 .sp 共起検索は学習データを使います。学習データはクエリログやアクセスログなどを元に作成します。学習データを作成するには、タイムスタンプ付きの入力シーケンスと、タイムスタンプ付きの検索実行時の入力内容が必要です。 .sp 例えば、ユーザが"engine"で検索したいとします。ユーザが以下のようなシーケンスで検索クエリを入力したとします。: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 1. 3 2011\-08\-10T13:33:23+09:00: e .IP 2. 3 2011\-08\-10T13:33:23+09:00: en .IP 3. 3 2011\-08\-10T13:33:24+09:00: eng .IP 4. 3 2011\-08\-10T13:33:24+09:00: engi .IP 5. 3 2011\-08\-10T13:33:24+09:00: engin .IP 6. 3 2011\-08\-10T13:33:25+09:00: engine (検索実行!) .UNINDENT .UNINDENT .UNINDENT .sp 以下のコマンドでこの入力シーケンスから学習できます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table event_query \-\-each \(aqsuggest_preparer(_id, type, item, sequence, time, pair_query)\(aq [ {"sequence": "1", "time": 1312950803.86057, "item": "e"}, {"sequence": "1", "time": 1312950803.96857, "item": "en"}, {"sequence": "1", "time": 1312950804.26057, "item": "eng"}, {"sequence": "1", "time": 1312950804.56057, "item": "engi"}, {"sequence": "1", "time": 1312950804.76057, "item": "engin"}, {"sequence": "1", "time": 1312950805.86057, "item": "engine", "type": "submit"} ] .ft P .fi .UNINDENT .UNINDENT .SS 読みデータの更新方法 .sp 前方一致RK検索をするために単語とその読みが必要になります。このセクションではどのように単語と読みを登録するかを説明します。 .sp 以下は「日本」を登録する例です: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table event_query \-\-each \(aqsuggest_preparer(_id, type, item, sequence, time, pair_query)\(aq [ {"sequence": "1", "time": 1312950805.86058, "item": "日本", "type": "submit"} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] .ft P .fi .UNINDENT .UNINDENT .sp 以下は「日本」を補完するために読みデータを登録する例です: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table item_query [ {"_key":"日本", "kana":["ニホン", "ニッポン"]} ] # [[0, 1337566253.89858, 0.000355720520019531], 1] .ft P .fi .UNINDENT .UNINDENT .sp これで「nihon」というローマ字で登録済みの「日本」という単語を補完できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C suggest \-\-table item_query \-\-column kana \-\-types complete \-\-frequency_threshold 1 \-\-query nihon # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "complete": [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "日本", # 2 # ] # ] # } # ] .ft P .fi .UNINDENT .UNINDENT .sp この読みデータがないと登録済みの「日本」という単語を「nihon」というクエリーで補完できません。 .sp \fBitem_query\fP テーブルの \fBkana\fP カラムは \fB/reference/columns/vector\fP なので、複数の読みを登録できます。 .sp これが「nippon」でも「日本」を補完できる理由です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C suggest \-\-table item_query \-\-column kana \-\-types complete \-\-frequency_threshold 1 \-\-query nippon # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "complete": [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "日本", # 2 # ] # ] # } # ] .ft P .fi .UNINDENT .UNINDENT .sp 日本語入力システムが無効になっている状態でも登録済みの単語を検索できるのでこの機能はとても便利です。 .sp 補完候補が複数ある場合、 \fBitem_query\fP テーブルの \fBboost\fP カラムに値を設定することで優先度をカスタマイズすることができます。 .sp 以下は前方一致RK検索での優先度をカスタマイズする例です: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table event_query \-\-each \(aqsuggest_preparer(_id, type, item, sequence, time, pair_query)\(aq [ {"sequence": "1", "time": 1312950805.86059, "item": "日本語", "type": "submit"} {"sequence": "1", "time": 1312950805.86060, "item": "日本人", "type": "submit"} ] # [[0, 1337566253.89858, 0.000355720520019531], 2] load \-\-table item_query [ {"_key":"日本語", "kana":"ニホンゴ"} {"_key":"日本人", "kana":"ニホンジン"} ] # [[0, 1337566253.89858, 0.000355720520019531], 2] suggest \-\-table item_query \-\-column kana \-\-types complete \-\-frequency_threshold 1 \-\-query nihon # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "complete": [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "日本", # 2 # ], # [ # "日本人", # 2 # ], # [ # "日本語", # 2 # ] # ] # } # ] load \-\-table item_query [ {"_key":"日本人", "boost": 100}, ] # [[0, 1337566253.89858, 0.000355720520019531], 1] suggest \-\-table item_query \-\-column kana \-\-types complete \-\-frequency_threshold 1 \-\-query nihon # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "complete": [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "日本人", # 102 # ], # [ # "日本", # 2 # ], # [ # "日本語", # 2 # ] # ] # } # ] .ft P .fi .UNINDENT .UNINDENT .SS 補正 .sp このセクションでは以下の補正機能について説明します。: .INDENT 0.0 .IP \(bu 2 どのように動作するか .IP \(bu 2 使い方 .IP \(bu 2 学習方法 .UNINDENT .SS どのように動作するか .sp 補正機能は補正した語を計算するために3種類の検索を使います。: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 1. 3 学習したデータを共起検索。 .IP 2. 3 登録されている語を類似検索。(実行しないこともある) .UNINDENT .UNINDENT .UNINDENT .SS 共起検索 .sp 共起検索はユーザの間違って入力した文字列から登録済みの語を検索します。共起検索ではユーザがどのように検索を実行したかを使います。ユーザがどのように検索したかはクエリログやアクセスログから学習します。 .sp 例えば、ユーザが以下のように検索を実行したとします。: .TS center; |l|l|. _ T{ query T} T{ 時刻 T} _ T{ serach (入力ミス!) T} T{ 2011\-08\-10T22:20:50+09:00 T} _ T{ search (修正!) T} T{ 2011\-08\-10T22:20:52+09:00 T} _ .TE .sp 上記の検索実行ログから以下のような補正ペアを作ります。 .TS center; |l|l|. _ T{ 入力 T} T{ 補正された語 T} _ T{ serach T} T{ search T} _ .TE .sp 1分以内の連続して実行された検索をユーザが入力を補正したものとみなします。検索を実行した間の入力途中の入力シーケンスは、補正用の学習データとしては利用しません。 .sp ユーザが"serach"と入力した場合、共起検索は"saerch"を返します。なぜなら、"serach"が「入力」カラムにあり、対応する「補正される語」カラムの値が"search"だからです。 .SS 類似文書検索 .sp 類似検索はユーザの入力をトークナイズし、同じトークンを含んだ登録済みの語を検索します。トークナイズにはTokenBigramトークナイザーを使います。これは \fB/reference/executables/groonga\-suggest\-create\-dataset\fP が作るサジェストデータセットスキーマではデフォルトトークナイザーとしてTokenBigramトークナイザーを使っているからです。 .sp 例えば、"search engine"という語が登録されているとします。ユーザが"web search service"や"sound engine"などで検索すると"search engine"が補正候補になります。なぜなら、"search engine"と"web search engine"は"search"という同じトークンを持つからです。また、"search engine"と"sound engine"は"engine"という同じトークンを持っています。 .sp "search engine"は"search"トークンと"engine"トークンにトークナイズされます。(GroongaのTokenBigramトークナイザーは連続するアルファベットと数字を2文字にトークナイズしません。これは検索ノイズを減らす為です。確実に2文字でトークナイズするためにはTokenBigramSplitSymbolAlphaDigitを使います。)"web search service"は"web"トークンと"search"トークンと"service"トークンにトークナイズされます。"sound engine"は"sound"トークンと"engine"トークンにトークナイズされます。 .SS 使い方 .sp Groongaは補正機能を使うために \fB/reference/commands/suggest\fP コマンドを用意しています。 \fI\-\-type correct\fP オプションを使うと補正機能を利用できます。 .sp 例えば、"saerch"と入力した時の補正結果取得するコマンドは以下のようになります。: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C suggest \-\-table item_query \-\-column kana \-\-types correction \-\-frequency_threshold 1 \-\-query saerch # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "correct": [ # [ # 1 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "search", # 1 # ] # ] # } # ] .ft P .fi .UNINDENT .UNINDENT .SS 学習方法 .sp 共起検索は学習データを使います。学習データはクエリログやアクセスログから作ります。学習データを作るためにはユーザが検索を実行したときの検索クエリとタイムスタンプが必要です。 .sp 例えば、ユーザが"search"で検索したかったとします。しかし、ユーザは正しい"search"というクエリで検索を実行する前に間違って"saerch"で検索してしまいました。このユーザの入力シーケンスは以下のようになります。: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 1. 3 2011\-08\-10T13:33:23+09:00: s .IP 2. 3 2011\-08\-10T13:33:23+09:00: sa .IP 3. 3 2011\-08\-10T13:33:24+09:00: sae .IP 4. 3 2011\-08\-10T13:33:24+09:00: saer .IP 5. 3 2011\-08\-10T13:33:24+09:00: saerc .IP 6. 3 2011\-08\-10T13:33:25+09:00: saerch (検索実行!) .IP 7. 3 2011\-08\-10T13:33:29+09:00: serch (修正中…) .IP 8. 3 2011\-08\-10T13:33:30+09:00: search (検索実行!) .UNINDENT .UNINDENT .UNINDENT .sp 以下のコマンドでこの入力シーケンスから学習できます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table event_query \-\-each \(aqsuggest_preparer(_id, type, item, sequence, time, pair_query)\(aq [ {"sequence": "1", "time": 1312950803.86057, "item": "s"}, {"sequence": "1", "time": 1312950803.96857, "item": "sa"}, {"sequence": "1", "time": 1312950804.26057, "item": "sae"}, {"sequence": "1", "time": 1312950804.56057, "item": "saer"}, {"sequence": "1", "time": 1312950804.76057, "item": "saerc"}, {"sequence": "1", "time": 1312950805.76057, "item": "saerch", "type": "submit"}, {"sequence": "1", "time": 1312950809.76057, "item": "serch"}, {"sequence": "1", "time": 1312950810.86057, "item": "search", "type": "submit"} ] .ft P .fi .UNINDENT .UNINDENT .SS 提案 .sp このセクションでは以下の補完機能について説明します。: .INDENT 0.0 .IP \(bu 2 どのように動作するか .IP \(bu 2 使い方 .IP \(bu 2 学習方法 .UNINDENT .SS どのように動作するか .sp 提案機能は提案する語を計算するために1種類の検索を使います。: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 1. 3 学習したデータを共起検索。 .UNINDENT .UNINDENT .UNINDENT .SS 共起検索 .sp 共起検索はユーザの入力と関連する語を検索します。共起検索ではユーザの実行したときの検索クエリを使います。このデータはクエリログやアクセスログなどから学習します。 .sp 例えば、ユーザが以下のように検索を実行したとします。: .TS center; |l|. _ T{ query T} _ T{ search engine T} _ T{ web search realtime T} _ .TE .sp Groongaは以下のような提案ペアを作成します。 .TS center; |l|l|. _ T{ 入力 T} T{ 提案される語 T} _ T{ search T} T{ search engine T} _ T{ engine T} T{ search engine T} _ T{ web T} T{ web search realtime T} _ T{ search T} T{ web search realtime T} _ T{ realtime T} T{ web search realtime T} _ .TE .sp これらのペアは以下の手順で作成します。: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 1. 3 ユーザの入力をTokenDelimitトークナイザーでトークナイズします。TokenDelimitは空白をトークンの区切りに使います。(例えば、"search engine"は"search"トークンと"engine"トークンの2つのトークンにトークナイズされます。) .IP 2. 3 各トークンについて、トークンと元のクエリからなるペアを作成する。 .UNINDENT .UNINDENT .UNINDENT .sp ユーザが"search"と入力したとき、共起検索は"search engine"と"web search raltime"を返します。これは、"search"が2つの「入力」カラムに含まれていて、対応するそれぞれの「提案される語」カラムの値が"search engine"と"web search realtime"だからです。 .SS 使い方 .sp Groongaは提案機能を使うために \fB/reference/commands/suggest\fP コマンドを用意しています。 \fI\-\-type suggest\fP オプションを使うと提案機能を利用できます。 .sp 例えば、"search"と入力した時の提案結果を取得するコマンドは以下の通りです。: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C suggest \-\-table item_query \-\-column kana \-\-types suggest \-\-frequency_threshold 1 \-\-query search # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "suggest": [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_score", # "Int32" # ] # ], # [ # "search engine", # 1 # ], # [ # "web search realtime", # 1 # ] # ] # } # ] .ft P .fi .UNINDENT .UNINDENT .SS 学習方法 .sp 共起検索は学習データを使います。学習データはクエリログやアクセスログなどを元に作成します。学習データを作成するには、タイムスタンプ付きの入力シーケンスと、タイムスタンプ付きの検索実行時の入力内容が必要です。 .sp 例えば、ユーザが"engine"で検索したいとします。ユーザが以下のようなシーケンスで検索クエリを入力したとします。: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 1. 3 2011\-08\-10T13:33:25+09:00: search engine (検索実行) .IP 2. 3 2011\-08\-10T13:33:28+09:00: web search realtime (検索実行) .UNINDENT .UNINDENT .UNINDENT .sp 以下のコマンドで上記の検索実行結果から学習します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table event_query \-\-each \(aqsuggest_preparer(_id, type, item, sequence, time, pair_query)\(aq [ {"sequence": "1", "time": 1312950803.86057, "item": "search engine", "type": "submit"}, {"sequence": "1", "time": 1312950808.86057, "item": "web search realtime", "type": "submit"} ] .ft P .fi .UNINDENT .UNINDENT .SS 学習データを抽出する方法 .sp The learning data is stored into item_DATASET and pair_DATASET tables. By using select command for such tables, you can all extract learing data. .sp Here is the query to extract all learning data: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select item_DATASET \-\-limit \-1 select pair_DATASET \-\-filter \(aqfreq0 > 0 || freq1 > 0 || freq2 > 0\(aq \-\-limit \-1 .ft P .fi .UNINDENT .UNINDENT .sp Without \(aq\-\-limit \-1\(aq, you can\(aqt get all data. In pair table, the valid value of freq0, freq1 and freq2 column must be larger than 0. .sp Don\(aqt execute above query via HTTP request because enourmous number of records are fetched. .SS インデックス構築 .sp Groongaは2.0.0から動的なインデックス構築方法と静的なインデックス構築方法を両方サポートしています。 .SS 動的なインデックス構築方法 .sp 動的なインデックス構築方法では、登録された文書はインデックス構築中にすぐに検索できるようになります。しかし、静的なインデックス構築方法に比べてコストがかかります。 .sp 動的なインデックス構築方法は鮮度が重要な検索システムに適しています。例えば、つぶやきやニュースやブログ記事などを検索するシステムは鮮度が重要になるでしょう。動的なインデックス構築方法はできたばかりの文書を検索できるようにし、インデックス構築中も検索できます。 .SS 静的なインデックス構築方法 .sp 静的なインデックス構築方法では、動的なインデックス構築方法よりもインデックス構築にかかるコストが小さくなります。インデックス構築時間は短くなるでしょう。インデックスは小さくなるでしょう。インデックス構築に必要なリソースは少なくなるでしょう。しかし、登録中の文書は登録しようとしている全ての文書のインデックス構築が終わるまで検索できません。 .sp 静的なインデックス構築方法は消費リソースが少ないことが重要な検索システムに適しています。鮮度が重要でないシステムであれば静的なインデックス構築方法が適しているでしょう。例えば、リファレンスマニュアルを検索するシステムは鮮度を重視しません。これは、リファレンスマニュアルはリリース時にだけ更新されるだけだからです。 .SS 使い方 .sp Groongaはデフォルトで動的なインデックス構築方法を使います。文書を登録するとすぐに検索できるようになります。 .sp すでにデータが格納されているカラムにインデックスを追加した場合は静的なインデックス構築方法を使います。 .sp スキーマを定義します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Tweets TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Tweets content COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Lexicon TABLE_HASH_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp データを登録します: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Tweets [ {"content":"Hello!"}, {"content":"I just start it!"}, {"content":"I\(aqm sleepy... Have a nice day... Good night..."} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] .ft P .fi .UNINDENT .UNINDENT .sp インデックスがないときはシーケンシャルサーチで検索できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Tweets \-\-match_columns content \-\-query \(aqgood nice\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "content", # "ShortText" # ] # ], # [ # 3, # "I\(aqm sleepy... Have a nice day... Good night..." # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp \fBTweets.content\fP 用のインデックスを作成します。すでに \fBTweets.content\fP に登録されているデータは静的なインデックス構築方法でインデックスを構築します: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C column_create Lexicon tweet COLUMN_INDEX|WITH_POSITION Tweets content # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp インデックスありで検索します。1件ヒットします: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Tweets \-\-match_columns content \-\-query \(aqgood nice\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "content", # "ShortText" # ] # ], # [ # 3, # "I\(aqm sleepy... Have a nice day... Good night..." # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp もう一度データを登録します。このデータ用のインデックスは動的なインデックス構築方法で構築します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Tweets [ {"content":"Good morning! Nice day."}, {"content":"Let\(aqs go shopping."} ] # [[0, 1337566253.89858, 0.000355720520019531], 2] .ft P .fi .UNINDENT .UNINDENT .sp 検索すると新しく登録されたレコードもヒットします: .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Tweets \-\-match_columns content \-\-query \(aqgood nice\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "content", # "ShortText" # ] # ], # [ # 3, # "I\(aqm sleepy... Have a nice day... Good night..." # ], # [ # 4, # "Good morning! Nice day." # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS シャーディング .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.0 で追加. .sp Groongaにはテーブルに格納できるレコード数に \fB/limitations\fP があります。1つのテーブルに268,435,455以上のレコードを追加できません。 .sp この制限を解決するために、Groongaは時間ベースのシャーディング機能をサポートしています。 .sp この機能は同一データベース内で動きます。複数のデータベースをまたいでは動きません。これは、このシャーディング機能はデータを複数のマシンに分散する用途では使えないということです。 .sp もし、分散対応のシャーディング機能が欲しい場合は、 \fI\%Mroonga\fP または \fI\%PGroonga\fP を使ってください。MySQLまたはPostgreSQLが提供しているシャーディング機能を使うことができます。近い将来、 \fI\%Droonga\fP でも分散対応のシャーディング機能を使えるようになる予定です。 .SS 概要 .sp シャーディングは \fBsharding\fP プラグインとして実装されています。このプラグインはmrubyで書かれています。そのため、Groongaをビルドするときにmrubyを有効にする必要があります。 .sp Groongaがmrubyをサポートしているかは \fB/reference/executables/groonga\fP の \fB\-\-version\fP 引数を使うとわかります: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-\-version groonga 5.0.5 [...,mruby,...] configure options: <...> .ft P .fi .UNINDENT .UNINDENT .sp \fBmruby\fP があればあなたのGroongaはmrubyをサポートしています。 .sp \fBsharding\fP プラグインは検索系のコマンドだけを提供しています。これらのコマンドは \fB/reference/commands/logical_select\fP や \fB/reference/commands/logical_range_filter\fP というように、コマンド名に \fBlogical_\fP プレフィックスがついています。 .sp \fBsharding\fP プラグインはスキーマ定義コマンドとデータロードコマンドをまだ提供していません。そのため、既存の \fB/reference/commands/table_create\fP 、 \fB/reference/commands/column_create\fP 、 \fB/reference/commands/load\fP コマンドを使う必要があります。 .sp \fBsharding\fP プラグインを使うにはいくつかのルールに則ってテーブルとカラムを作る必要があります。これについては後述します。 .SS 用語集 .TS center; |l|l|. _ T{ 名前 T} T{ 説明 T} _ T{ 論理テーブル T} T{ 複数のシャードをあわせて1つに見せているテーブルです。Groongaのデータベースの中には存在しません。私たちの頭の中にだけあります。 T} _ T{ 論理テーブル名 T} T{ 論理テーブルの名前です。これはシャード名のプレフィックスです。例えば、 \fBLogs\fP が論理テーブル名で、 \fBLogs_20150814\fP と \fBLogs_20150815\fP がシャード名です。 T} _ T{ シャード T} T{ 1日分または1ヶ月分のレコードを格納しているテーブルです。1つのシャードには一部のレコードのみがあります。 .sp シャード名(=テーブル名)は \fB${LOGICAL_TABLE_NAME}_${YYYYMMDD}\fP というフォーマットか \fB${LOGICAL_TABLE_NAME}_${YYYYMM}\fP というフォーマットになっています。 \fB${LOGICAL_TABLE_NAME}\fP は論理テーブル名に置き換えてください。 \fB${YYYYMMDD}\fP は日に置き換えてください。 \fB${YYYYMM}\fP は月に置き換えてください。 .sp 例えば、 \fBLogs_20150814\fP を分解すると \fBLogs\fP という論理テーブル名と \fB20150814\fP という日になります。 T} _ .TE .SS ルール .sp TODO .SS コマンド一覧 .SS \fBlogical_count\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.0 で追加. .sp \fBlogical_count\fP は別のテーブルに保存されているレコードであっても、マッチするレコードをカウントするためのコマンドです。テーブルの最大レコード数の \fB/limitations\fP を気にしなくてすむようになります。 .sp この機能はまだこなれていないので、いくつか制限があります。 .INDENT 0.0 .IP \(bu 2 名前の末尾は "_YYYYMMDD" をつけてテーブルを作成します。これは決め打ちになっていて、日ごとにテーブルを作成しないといけない .IP \(bu 2 自分で個々のテーブルへ適切なデータをロードしないといけない .UNINDENT .SS 構文 .sp このコマンドにはたくさんの引数があります。 .sp 必須引数は2つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_count logical_table shard_key [min] [min_border] [max] [max_border] [filter] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp \fBlogical_count\fP コマンドを使うには事前に \fBsharding\fP プラグインを登録します。 .sp \fBlogical_count\fP コマンドは実験的なプラグインです。このコマンドは将来的に変更されるかもしれません。 .sp この機能を使う簡単な例を示します。複数のテーブルに保存されている特定のログをカウントしてみましょう。 .sp スキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Logs_20150203 TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150203 timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150203 message COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Logs_20150204 TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150204 timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150204 message COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Logs_20150205 TABLE_NO_KEY # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150205 timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150205 message COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Logs_20150203 [ {"timestamp": "2015\-02\-03 23:59:58", "message": "Start"}, {"timestamp": "2015\-02\-03 23:59:58", "message": "Shutdown"}, {"timestamp": "2015\-02\-03 23:59:59", "message": "Start"}, {"timestamp": "2015\-02\-03 23:59:59", "message": "Shutdown"} ] # [[0, 1337566253.89858, 0.000355720520019531], 4] load \-\-table Logs_20150204 [ {"timestamp": "2015\-02\-04 00:00:00", "message": "Start"}, {"timestamp": "2015\-02\-04 00:00:00", "message": "Shutdown"}, {"timestamp": "2015\-02\-04 00:00:01", "message": "Start"}, {"timestamp": "2015\-02\-04 00:00:01", "message": "Shutdown"}, {"timestamp": "2015\-02\-04 23:59:59", "message": "Start"}, {"timestamp": "2015\-02\-04 23:59:59", "message": "Shutdown"} ] # [[0, 1337566253.89858, 0.000355720520019531], 6] load \-\-table Logs_20150205 [ {"timestamp": "2015\-02\-05 00:00:00", "message": "Start"}, {"timestamp": "2015\-02\-05 00:00:00", "message": "Shutdown"}, {"timestamp": "2015\-02\-05 00:00:01", "message": "Start"}, {"timestamp": "2015\-02\-05 00:00:01", "message": "Shutdown"} ] # [[0, 1337566253.89858, 0.000355720520019531], 4] .ft P .fi .UNINDENT .UNINDENT .sp 2015年の2月3日から5日までに対応したテーブルが3つあります。 .INDENT 0.0 .IP \(bu 2 Logs_20150203 .IP \(bu 2 Logs_20150204 .IP \(bu 2 Logs_20150205 .UNINDENT .sp 対応するテーブルへとデータを投入します。 .sp \fBmessage\fP カラムに "Shutdown" が含まれていて、 \fBtimestamp\fP カラムの値が "2015\-02\-04 00:00:00" 以降であるログをカウントしましょう。 .sp 上記目的を達成するためのクエリがこちらです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_count Logs timestamp \-\-filter \(aqmessage == "Shutdown"\(aq \-\-min "2015\-02\-04 00:00:00" \-\-min_border "include" # [[0, 1337566253.89858, 0.000355720520019531], 5] .ft P .fi .UNINDENT .UNINDENT .sp レコード数には既知の制限があります。制限はテーブルごとなので、シャーディング機能によってその制限を乗り越えることができます。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 SQLの \fBPARTITIONING BY\fP のような便利なクエリはありません。つまり、 \fBtable_create\fP で "_YYYYMMDD" を名前の末尾に含むテーブルをそれぞれの作らなければなりません。 .UNINDENT .UNINDENT .SS 引数 .sp このセクションでは \fBlogical_count\fP の引数について説明します。 .SS 必須引数 .sp 必須引数は二つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .SS \fBlogical_table\fP .sp 論理テーブル名を指定します。これは "_YYYYMMDD" をテーブル名から除いたものです。実際のテーブルが "Logs_20150203" や "Logs_20150203" といったものなら、論理テーブル名は "Logs" です。 .SS \fBshard_key\fP .sp 個々のテーブルで共通のキーとして扱うカラム名を指定します。 .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBmin\fP .sp \fBshard_key\fP の最小値を指定します。 .SS \fBmin_border\fP .sp 最小値を境界値として含めるのか否かを指定します。 \fBinclude\fP もしくは \fBexclude\fP を指定します。 .SS \fBmax\fP .sp \fBshard_key\fP の最大値を指定します。 .SS \fBmax_border\fP .sp 最大値を境界値として含めるのか否かを指定します。 \fBinclude\fP もしくは \fBexclude\fP を指定します。 .SS \fBfilter\fP .SS 戻り値 .sp TODO .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, LOGICAL_COUNT] .ft P .fi .UNINDENT .UNINDENT .SS \fBlogical_parameters\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.6 で追加. .sp \fBlogical_parameters\fP はテスト用のコマンドです。通常はこのコマンドを使う必要はありません。 .sp \fBlogical_parameters\fP は次の2つの機能を提供します。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBlogical_*\fP コマンドが使うパラメーターの現在値を返します。 .IP \(bu 2 \fBlogical_*\fP コマンドが使うパラメーターを新しく設定します。 .UNINDENT .UNINDENT .UNINDENT .sp 以下はパラメーターのリストです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%range_index\fP .UNINDENT .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 これらのパラメーターの値は各スレッドごとで独立しています。(正確に言うと、 \fBgrn_ctx\fP 毎に独立しています。)これらのパラメーターを完全に制御したい場合は、これらのパラメーターを使っている間は \fB/reference/commands/thread_limit\fP を使って最大スレッド数を \fB1\fP にしてください。 .UNINDENT .UNINDENT .SS 構文 .sp このコマンドの引数は1つで省略できます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_parameters [range_index=null] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp このコマンドを使うには事前に \fBsharding\fP プラグインを登録します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_register sharding # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 引数無しで呼び出すとすべてのパラメーターの現在の値を返します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_parameters # [[0, 1337566253.89858, 0.000355720520019531], {"range_index": "auto"}] .ft P .fi .UNINDENT .UNINDENT .sp 引数を指定して呼び出すと新しい値を設定できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_parameters \-\-range_index never # [[0, 1337566253.89858, 0.000355720520019531], {"range_index": "auto"}] .ft P .fi .UNINDENT .UNINDENT .sp \fBlogical_parameters\fP は、新しい値を設定するときは、新しい値を設定する前の値を返します。 .SS 引数 .sp このセクションでは引数について説明します。 .SS 必須引数 .sp 必須の引数はありません。 .SS 省略可能引数 .sp 省略可能な引数が1つあります。 .SS \fBrange_index\fP .sp \fBlogical_range_filter\fP でどのように範囲インデックスを使うかをキーワードで指定します。 .sp 指定できるキーワードは以下の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBauto\fP (デフォルト) .IP \(bu 2 \fBalways\fP .IP \(bu 2 \fBnever\fP .UNINDENT .UNINDENT .UNINDENT .sp \fBauto\fP を指定すると、効果がでそうなときだけ範囲インデックスを使います。これがデフォルトの値です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_parameters \-\-range_index auto # [[0, 1337566253.89858, 0.000355720520019531], {"range_index": "never"}] .ft P .fi .UNINDENT .UNINDENT .sp \fBalways\fP を指定すると、常に範囲インデックスを使います。範囲インデックスが使われるケースをテストするときに便利です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_parameters \-\-range_index always # [[0, 1337566253.89858, 0.000355720520019531], {"range_index": "auto"}] .ft P .fi .UNINDENT .UNINDENT .sp \fBnever\fP を指定すると、範囲インデックスは使いません。範囲インデックスが使われないケースをテストするときに便利です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_parameters \-\-range_index never # [[0, 1337566253.89858, 0.000355720520019531], {"range_index": "always"}] .ft P .fi .UNINDENT .UNINDENT .SS 戻り値 .sp このコマンドは \fBlogical_*\fP コマンドが使うパラメーターの現在地を返します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, {"range_index": HOW_TO_USE_RANGE_INDEX} ] .ft P .fi .UNINDENT .UNINDENT .sp \fBHOW_TO_USE_RANGE_INDEX\fP の値は次のどれかです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB"auto"\fP .IP \(bu 2 \fB"always"\fP .IP \(bu 2 \fB"never"\fP .UNINDENT .UNINDENT .UNINDENT .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS \fBlogical_range_filter\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.0 で追加. .sp TODO: Write summary .SS 構文 .sp このコマンドにはたくさんの引数があります。 .sp 必須引数は2つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_range_filter logical_table shard_key [min=null] [min_border=null] [max=null] [max_border=null] [order=ascending] [filter=null] [offset=0] [limit=10] [output_columns=_key,*] [use_range_index=null] .ft P .fi .UNINDENT .UNINDENT .sp いくつか名前付き引数としてしか使えない引数があります。これらの引数を「○番目の引数」として使うことはできません。必ず名前を指定する必要があります。 .sp 名前付き引数としてしか使えない引数は次の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBcache=no\fP .UNINDENT .UNINDENT .UNINDENT .SS 使い方 .sp \fBlogical_range_filter\fP コマンドを使うには事前に \fBsharding\fP プラグインを登録します。 .sp TODO: Add examples .SS 引数 .sp このセクションでは \fBlogical_range_filter\fP の引数について説明します。 .SS 必須引数 .sp 必須引数は二つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .SS \fBlogical_table\fP .sp 論理テーブル名を指定します。これは "_YYYYMMDD" をテーブル名から除いたものです。実際のテーブルが "Logs_20150203" や "Logs_20150203" といったものなら、論理テーブル名は "Logs" です。 .sp TODO: Add examples .SS \fBshard_key\fP .sp 個々のテーブルで共通のキーとして扱うカラム名を指定します。 .sp TODO: Add examples .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBmin\fP .sp \fBshard_key\fP の最小値を指定します。 .sp TODO: Add examples .SS \fBmin_border\fP .sp 最小値を境界値として含めるのか否かを指定します。 \fBinclude\fP もしくは \fBexclude\fP を指定します。 .sp TODO: Add examples .SS \fBmax\fP .sp \fBshard_key\fP の最大値を指定します。 .sp TODO: Add examples .SS \fBmax_border\fP .sp 最大値を境界値として含めるのか否かを指定します。 \fBinclude\fP もしくは \fBexclude\fP を指定します。 .sp TODO: Add examples .SS \fBorder\fP .sp TODO .SS \fBfilter\fP .sp TODO .SS \fBoffset\fP .sp TODO .SS \fBlimit\fP .sp TODO .SS \fBoutput_columns\fP .sp TODO .SS \fBuse_range_index\fP .sp range_indexを使うかどうかを指定します。ただし、この引数はテスト用なので、本番で使うべきではありません。 .sp TODO: Add examples .SS キャッシュ関連の引数 .SS \fBcache\fP .sp このクエリーの結果をキャッシュするかどうかを指定します。 .sp このクエリーの結果がキャッシュしてあると、次に同じクエリーを実行するときはキャッシュを使って高速にレスポンスを返すことができます。 .sp これは既存のキャッシュされた結果を使うかどうかを指定するものではありません。 .sp 指定可能な値は以下の通りです。 .TS center; |l|l|. _ T{ Value T} T{ 説明 T} _ T{ \fBno\fP T} T{ このクエリーの出力をキャッシュしない。 T} _ T{ \fByes\fP T} T{ このクエリーの出力をキャッシュする。デフォルト値。 T} _ .TE .sp TODO: Add examples .sp デフォルト値は \fByes\fP です。 .SS 戻り値 .sp TODO .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, LOGICAL_FILTERED] .ft P .fi .UNINDENT .UNINDENT .SS \fBlogical_select\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.5 で追加. .sp \fBlogical_select\fP は \fBselect\fP のシャーディングバージョンです。 \fBlogical_select\fP は複数のテーブルからレコードを検索し、マッチしたレコードを出力します。 .sp \fBlogical_select\fP は \fBsharding\fP プラグインに含まれているので、 \fBsharding\fP プラグインを \fBplugin_register\fP する必要があります。 .SS 構文 .sp このコマンドにはたくさんの引数があります。 .sp 必須の引数は \fBlogical_table\fP と \fBshard_key\fP です。それ以外の引数は省略可能です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select logical_table shard_key [min=null] [min_border="include"] [max=null] [max_border="include"] [filter=null] [sortby=null] [output_columns="_id, _key, *"] [offset=0] [limit=10] [drilldown=null] [drilldown_sortby=null] [drilldown_output_columns="_key, _nsubrecs"] [drilldown_offset=0] [drilldown_limit=10] [drilldown_calc_types=NONE] [drilldown_calc_target=null] .ft P .fi .UNINDENT .UNINDENT .sp \fBlogical_select\fP には高度なドリルダウン機能のために以下の名前付き引数があります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBdrilldown[${LABEL}].keys=null\fP .IP \(bu 2 \fBdrilldown[${LABEL}].sortby=null\fP .IP \(bu 2 \fBdrilldown[${LABEL}].output_columns="_key, _nsubrecs"\fP .IP \(bu 2 \fBdrilldown[${LABEL}].offset=0\fP .IP \(bu 2 \fBdrilldown[${LABEL}].limit=10\fP .IP \(bu 2 \fBdrilldown[${LABEL}].calc_types=NONE\fP .IP \(bu 2 \fBdrilldown[${LABEL}].calc_target=null\fP .UNINDENT .UNINDENT .UNINDENT .sp \fB${LABEL}\fP には1つ以上のアルファベット、数字、 \fB_\fP 、 \fB\&.\fP を使うことができます。たとえば、 \fBparent.sub1\fP は有効な \fB${LABEL}\fP です。 .sp 同じ \fB${LABEL}\fP も持つ引数は同じグループになります。 .sp たとえば、以下の引数は1つのドリルダウンを指定しています。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-drilldown[label].keys column\fP .IP \(bu 2 \fB\-\-drilldown[label].sortby \-_nsubrecs\fP .UNINDENT .UNINDENT .UNINDENT .sp 以下の引数は2つのドリルダウンを指定しています。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-drilldown[label1].keys column1\fP .IP \(bu 2 \fB\-\-drilldown[label1].sortby \-_nsubrecs\fP .IP \(bu 2 \fB\-\-drilldown[label2].keys column2\fP .IP \(bu 2 \fB\-\-drilldown[label2].sortby _key\fP .UNINDENT .UNINDENT .UNINDENT .SS \fBselect\fP との違い .sp \fBlogical_select\fP の多くの機能は \fBselect\fP の機能と対応しています。たとえば、引数名は同じですし、出力フォーマットも同じです。 .sp しかし、いくつか \fBselect\fP と違うところもあります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBtable\fP 引数ではなく、 \fBlogical_table\fP と \fBshard_key\fP 引数が必須です。 .IP \(bu 2 複数のシャードを使った場合の \fBsortby\fP はサポートしていません。(1つのシャードのみを使った場合はサポートしています。) .IP \(bu 2 複数のシャードを使った場合、 \fBdrilldown[${LABEL}].sortby\fP の中で \fB_value.${KEY_NAME}\fP を使えません。1つのシャードのみを使った場合は使えます。 .IP \(bu 2 \fBmatch_columns\fP と \fBquery\fP はまだサポートしていません。 .IP \(bu 2 \fBcache\fP はまだサポートしていません。 .IP \(bu 2 \fBmatch_escalation_threshold\fP はまだサポートしていません。 .IP \(bu 2 \fBquery_flags\fP はまだサポートしていません。 .IP \(bu 2 \fBquery_expander\fP はまだサポートしていません。 .IP \(bu 2 \fBadjuster\fP はまだサポートしていません。 .UNINDENT .UNINDENT .UNINDENT .SS 使い方 .sp 例を使いながら \fBlogical_select\fP の使い方を学びましょう。このセクションではよく使われる使い方を紹介します。 .sp \fBlogical_select\fP は \fBsharding\fP プラグインに含まれているので \fBsharding\fP プラグインを登録する必要があります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_register sharding # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entries_20150708 TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150708 created_at COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150708 content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150708 n_likes COLUMN_SCALAR UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150708 tag COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Entries_20150709 TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150709 created_at COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150709 content COLUMN_SCALAR Text # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150709 n_likes COLUMN_SCALAR UInt32 # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Entries_20150709 tag COLUMN_SCALAR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Terms TABLE_PAT_KEY ShortText \e \-\-default_tokenizer TokenBigram \e \-\-normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_key_index_20150708 \e COLUMN_INDEX|WITH_POSITION Entries_20150708 _key # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_content_index_20150708 \e COLUMN_INDEX|WITH_POSITION Entries_20150708 content # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_key_index_20150709 \e COLUMN_INDEX|WITH_POSITION Entries_20150709 _key # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Terms entries_content_index_20150709 \e COLUMN_INDEX|WITH_POSITION Entries_20150709 content # [[0, 1337566253.89858, 0.000355720520019531], true] load \-\-table Entries_20150708 [ {"_key": "The first post!", "created_at": "2015/07/08 00:00:00", "content": "Welcome! This is my first post!", "n_likes": 5, "tag": "Hello"}, {"_key": "Groonga", "created_at": "2015/07/08 01:00:00", "content": "I started to use Groonga. It\(aqs very fast!", "n_likes": 10, "tag": "Groonga"}, {"_key": "Mroonga", "created_at": "2015/07/08 02:00:00", "content": "I also started to use Mroonga. It\(aqs also very fast! Really fast!", "n_likes": 15, "tag": "Groonga"} ] # [[0, 1337566253.89858, 0.000355720520019531], 3] load \-\-table Entries_20150709 [ {"_key": "Good\-bye Senna", "created_at": "2015/07/09 00:00:00", "content": "I migrated all Senna system!", "n_likes": 3, "tag": "Senna"}, {"_key": "Good\-bye Tritonn", "created_at": "2015/07/09 01:00:00", "content": "I also migrated all Tritonn system!", "n_likes": 3, "tag": "Senna"} ] # [[0, 1337566253.89858, 0.000355720520019531], 2] .ft P .fi .UNINDENT .UNINDENT .sp ブログエントリー用に \fBEntries_20150708\fP と \fBEntries_20150709\fP の2つのテーブルがあります。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 テーブル名には \fB${論理テーブル名}_${YYYYMMDD}\fP という命名規則を使う必要があります。この例では、 \fB論理テーブル名\fP は \fBEntries\fP で \fBYYYYMMDD\fP は \fB20150708\fP または \fB20150709\fP です。 .UNINDENT .UNINDENT .sp 各エントリはタイトルと作成日時と内容と「いいね!」数、タグを持っています。タイトルは \fBEntries_YYYYMMDD\fP のキーとします。作成日時は \fBEntries_YYYYMMDD.created_at\fP カラムの値とします。内容は \fBEntries_YYYYMMDD.content\fP カラムの値とします。「いいね!」数は \fBEntries_YYYYMMDD.n_likes\fP カラムの値とします。タグは \fBEntries_YYYYMMDD.tag\fP カラムの値とします。 .sp \fBEntries_YYYYMMDD._key\fP カラムと \fBEntries_YYYYMMDD.content\fP カラムには \fBTokenBigram\fP トークナイザーを使ったインデックスを作成します。そのため、 \fBEntries_YYYYMMDD._key\fP と \fBEntries_YYYYMMDD.content\fP は両方とも全文検索できます。 .sp これで例を示すためのスキーマとデータの準備ができました。 .SS 簡単な使い方 .sp TODO .SS 引数 .sp このセクションでは \fBlogical_select\fP の引数について説明します。 .SS 必須引数 .sp 必須引数は二つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .SS \fBlogical_table\fP .sp 論理テーブル名を指定します。これは \fB_YYYYMMDD\fP をテーブル名からのぞいたものです。実際のテーブルが \fBEntries_20150708\fP や \fBEntries_20150709\fP といったものなら、論理テーブル名は \fBEntries\fP です。 .sp \fBlogical_table\fP と \fBshard_key\fP 引数を指定すると10レコード表示できます。これらの引数は必須の引数です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \-\-logical_table Entries \-\-shard_key created_at # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 1436284800.0, # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1436288400.0, # 15, # "Groonga" # ], # [ # 1, # "Good\-bye Senna", # "I migrated all Senna system!", # 1436367600.0, # 3, # "Senna" # ], # [ # 2, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1436371200.0, # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp 存在しないテーブルを指定するとエラーが返ります。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \-\-logical_table Nonexistent \-\-shard_key created_at # [ # [ # \-22, # 1337566253.89858, # 0.000355720520019531, # "[logical_select] no shard exists: logical_table: : shard_key: ", # [ # [ # "Groonga::Context.set_groonga_error", # "lib/mrb/scripts/context.rb", # 27 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBshard_key\fP .sp シャードキーとして使うカラム名を指定します。シャードキーは適切なシャードへレコードを分配するために使う値を保存しているカラムです。 .sp 今のところ、シャードキーは \fBTime\fP 型でなければいけません。 .sp \fBshard_key\fP の指定方法は \fI\%logical_table\fP を見てください。 .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBmin\fP .sp \fBshard_key\fP カラムの最小値を指定します。シャードにマッチするレコードがない場合は、そのシャードは検索対象外になります。 .sp たとえば、 \fBmin\fP が \fB"2015/07/09 00:00:00"\fP なら、 \fBEntry_20150708\fP は検索対象外です。なぜなら、 \fBEntry_20150708\fP は \fB"2015/07/08"\fP のレコードしかないからです。 .sp 以下の例は \fBEntry_20150709\fP テーブルだけを使う例です。 \fBEntry_20150708\fP は使われません。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-min "2015/07/09 00:00:00" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "Good\-bye Senna", # "I migrated all Senna system!", # 1436367600.0, # 3, # "Senna" # ], # [ # 2, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1436371200.0, # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBmin_border\fP .sp 最小値を含めるかどうかを指定します。指定可能な値は次の通りです。 .TS center; |l|l|. _ T{ Value T} T{ 説明 T} _ T{ \fBinclude\fP T} T{ \fBmin\fP の値を含みます。これがデフォルト値です。 T} _ T{ \fBexclude\fP T} T{ \fBmin\fP の値を含みません。 T} _ .TE .sp 次の例は \fBexclude\fP の使用例です。結果には \fB"Good\-bye Senna"\fP レコードは含まれません。このレコードの \fBcreated_at\fP の値が \fB"2015/07/09 00:00:00"\fP だからです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-min "2015/07/09 00:00:00" \e \-\-min_border "exclude" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 2, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1436371200.0, # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBmax\fP .sp \fBshard_key\fP カラムの最大値を指定します。シャードにマッチするレコードがない場合、そのシャードは検索対象外になります。 .sp たとえば、 \fBmax\fP が \fB"2015/07/08 23:59:59"\fP なら \fBEntry_20150709\fP は検索対象外です。なぜなら \fBEntry_20150709\fP には \fB""2015/07/09"\fP のレコードしかないからです。 .sp 以下の例は \fBEntry_20150708\fP テーブルだけを使います。 \fBEntry_20150709\fP は使いません。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-max "2015/07/08 23:59:59" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 1436284800.0, # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1436288400.0, # 15, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBmax_border\fP .sp 最大値を含めるかどうかを指定します。指定可能な値は次の通りです。 .TS center; |l|l|. _ T{ Value T} T{ 説明 T} _ T{ \fBinclude\fP T} T{ \fBmax\fP の値を含みます。これがデフォルト値です。 T} _ T{ \fBexclude\fP T} T{ \fBmax\fP の値を含みません。 T} _ .TE .sp 次の例は \fBexclude\fP の使用例です。結果には \fB"Good\-bye Senna"\fP レコードは含まれません。このレコードの \fBcreated_at\fP の値が \fB"2015/07/09 00:00:00"\fP だからです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-max "2015/07/09 00:00:00" \e \-\-max_border "exclude" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 1436284800.0, # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1436288400.0, # 15, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 検索関係の引数 .sp \fBlogical_select\fP は \fBselect\fP 互換の検索関連パラメーターをサポートしています。 .sp \fBmatch_columns\fP と \fBquery\fP はまだサポートしていません。今のところ、 \fBfilter\fP だけサポートしています。 .SS \fBmatch_columns\fP .sp 未実装です。 .SS \fBquery\fP .sp 未実装です。 .SS \fBfilter\fP .sp \fBselect\fP の select\-filter に対応しています。詳細は select\-filter を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-filter "n_likes <= 5" # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ], # [ # 1, # "Good\-bye Senna", # "I migrated all Senna system!", # 1436367600.0, # 3, # "Senna" # ], # [ # 2, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1436371200.0, # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 高度な検索のための引数 .sp \fBlogical_select\fP は高度な検索パラメーターをまだ実装していません。 .SS \fBmatch_escalation_threshold\fP .sp 未実装です。 .SS \fBquery_flags\fP .sp 未実装です。 .SS \fBquery_expander\fP .sp 未実装です。 .SS 出力関連の引数 .SS \fBoutput_columns\fP .sp \fBselect\fP の select\-output\-columns に対応しています。詳細は select\-output\-columns を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-output_columns \(aq_key, *\(aq # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ], # [ # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 1436284800.0, # 10, # "Groonga" # ], # [ # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1436288400.0, # 15, # "Groonga" # ], # [ # "Good\-bye Senna", # "I migrated all Senna system!", # 1436367600.0, # 3, # "Senna" # ], # [ # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1436371200.0, # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBsortby\fP .sp \fBselect\fP の select\-sortby に対応しています。詳細は select\-sortby を見てください。 .sp \fBsortby\fP には制限があります。検索対象のシャードが1つの場合のみ動作します。もし、検索対象のシャードが複数ある場合、 \fBsortby\fP は正常な動作をしません。 .sp 以下は1つのシャードのみを使っている例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-min "2015/07/08 00:00:00" \e \-\-min_border "include" \e \-\-max "2015/07/09 00:00:00" \e \-\-max_border "exclude" \e \-\-sortby _key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 1436284800.0, # 10, # "Groonga" # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1436288400.0, # 15, # "Groonga" # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBoffset\fP .sp \fBselect\fP の select\-offset に対応しています。詳細は select\-offset を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-offset 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 3, # "Mroonga", # "I also started to use Mroonga. It\(aqs also very fast! Really fast!", # 1436288400.0, # 15, # "Groonga" # ], # [ # 1, # "Good\-bye Senna", # "I migrated all Senna system!", # 1436367600.0, # 3, # "Senna" # ], # [ # 2, # "Good\-bye Tritonn", # "I also migrated all Tritonn system!", # 1436371200.0, # 3, # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBlimit\fP .sp \fBselect\fP の select\-limit に対応しています。詳細は select\-limit を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "content", # "Text" # ], # [ # "created_at", # "Time" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "The first post!", # "Welcome! This is my first post!", # 1436281200.0, # 5, # "Hello" # ], # [ # 2, # "Groonga", # "I started to use Groonga. It\(aqs very fast!", # 1436284800.0, # 10, # "Groonga" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBscorer\fP .sp 未実装です。 .SS ドリルダウン関連の引数 .sp \fBselect\fP のすべてのドリルダウン関連パラメーターをサポートしています。詳細は select\-drilldown\-related\-parameters を見てください。 .SS \fBdrilldown\fP .sp \fBselect\fP の select\-drilldown に対応しています。詳細は select\-drilldown を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-output_columns _key,tag \e \-\-drilldown tag # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "tag", # "ShortText" # ] # ], # [ # "The first post!", # "Hello" # ], # [ # "Groonga", # "Groonga" # ], # [ # "Mroonga", # "Groonga" # ], # [ # "Good\-bye Senna", # "Senna" # ], # [ # "Good\-bye Tritonn", # "Senna" # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown_sortby\fP .sp \fBselect\fP の select\-drilldown\-sortby に対応しています。詳細は select\-drilldown\-sortby を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown tag \e \-\-drilldown_sortby \-_nsubrecs,_key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ], # [ # "Hello", # 1 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown_output_columns\fP .sp \fBselect\fP の select\-drilldown\-output\-columns に対応しています。詳細は select\-drilldown\-output\-columns を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown tag \e \-\-drilldown_output_columns _key # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ] # ], # [ # "Hello" # ], # [ # "Groonga" # ], # [ # "Senna" # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown_offset\fP .sp \fBselect\fP の select\-drilldown\-offset に対応しています。詳細は select\-drilldown\-offset を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown tag \e \-\-drilldown_offset 1 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown_limit\fP .sp \fBselect\fP の select\-drilldown\-limit に対応しています。詳細は select\-drilldown\-limit を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown tag \e \-\-drilldown_limit 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Groonga", # 2 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown_calc_types\fP .sp \fBselect\fP の select\-drilldown\-calc\-types に対応しています。詳細は select\-drilldown\-calc\-types を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit \-1 \e \-\-output_columns tag,n_likes \e \-\-drilldown tag \e \-\-drilldown_calc_types MAX,MIN,SUM,AVG \e \-\-drilldown_calc_target n_likes \e \-\-drilldown_output_columns _key,_nsubrecs,_max,_min,_sum,_avg # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "tag", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ] # ], # [ # "Hello", # 5 # ], # [ # "Groonga", # 10 # ], # [ # "Groonga", # 15 # ], # [ # "Senna", # 3 # ], # [ # "Senna", # 3 # ] # ], # [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ], # [ # "_max", # "Int64" # ], # [ # "_min", # "Int64" # ], # [ # "_sum", # "Int64" # ], # [ # "_avg", # "Float" # ] # ], # [ # "Hello", # 1, # 5, # 5, # 5, # 5.0 # ], # [ # "Groonga", # 2, # 15, # 10, # 25, # 12.5 # ], # [ # "Senna", # 2, # 3, # 3, # 6, # 3.0 # ] # ] # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown_calc_target\fP .sp \fBselect\fP の select\-drilldown\-calc\-target に対応しています。詳細は select\-drilldown\-calc\-target を見てください。 .sp 具体例は select\-drilldown\-calc\-types を見てください。 .SS 高度なドリルダウン関連のパラメーター .sp \fBselect\fP のすべての高度なドリルダウン関連のパラメーターをサポートしています。詳細は select\-advanced\-drilldown\-related\-parameters を見てください。 .sp いくつか制限があります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 複数のシャードを使った場合、 \fBdrilldown[${LABEL}].sortby\fP の中で \fB_value.${KEY_NAME}\fP を使えません。1つのシャードのみを使った場合は使えます。 .UNINDENT .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].keys\fP .sp \fBselect\fP の select\-drilldown\-label\-keys に対応しています。詳細は select\-drilldown\-label\-keys を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown[tag.n_likes].keys tag,n_likes \e \-\-drilldown[tag.n_likes].output_columns _value.tag,_value.n_likes,_nsubrecs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # { # "tag.n_likes": [ # [ # 4 # ], # [ # [ # "tag", # "ShortText" # ], # [ # "n_likes", # "UInt32" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 5, # 1 # ], # [ # "Groonga", # 10, # 1 # ], # [ # "Groonga", # 15, # 1 # ], # [ # "Senna", # 3, # 2 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].output_columns\fP .sp \fBselect\fP の select\-drilldown\-label\-output\-columns に対応しています。詳細は select\-drilldown\-label\-output\-columns を見てください。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown[tag].keys tag \e \-\-drilldown[tag].output_columns _key,_nsubrecs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # { # "tag": [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].sortby\fP .sp ラベルなしドリルダウンの \fI\%drilldown_sortby\fP に対応しています。 .sp \fBdrilldown[${LABEL}].sortby\fP には制限があります。 .sp 複数のシャードを使った場合、 \fBdrilldown[${LABEL}].sortby\fP の中で \fB_value.${KEY_NAME}\fP を使えません。1つのシャードのみを使った場合は使えます。 .sp 以下は1つのシャードに対して \fB_value.${KEY_NAME}\fP を使う例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-min "2015/07/08 00:00:00" \e \-\-min_border "include" \e \-\-max "2015/07/09 00:00:00" \e \-\-max_border "exclude" \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown[tag.n_likes].keys tag,n_likes \e \-\-drilldown[tag.n_likes].output_columns _nsubrecs,_value.n_likes,_value.tag \e \-\-drilldown[tag.n_likes].sortby \-_nsubrecs,_value.n_likes,_value.tag # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 3 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # { # "tag.n_likes": [ # [ # 3 # ], # [ # [ # "_nsubrecs", # "Int32" # ], # [ # "n_likes", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # 5, # "Hello" # ], # [ # 1, # 10, # "Groonga" # ], # [ # 1, # 15, # "Groonga" # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].offset\fP .sp ラベルなしドリルダウンの \fI\%drilldown_offset\fP に対応しています。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown[tag.n_likes].keys tag \e \-\-drilldown[tag.n_likes].offset 1 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # { # "tag.n_likes": [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Groonga", # 2 # ], # [ # "Senna", # 2 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].limit\fP .sp ラベルなしドリルダウンの \fI\%drilldown_limit\fP に対応しています。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown[tag.n_likes].keys tag \e \-\-drilldown[tag.n_likes].limit 2 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # { # "tag.n_likes": [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Groonga", # 2 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].calc_types\fP .sp ラベルなしドリルダウンの \fI\%drilldown_calc_types\fP に対応しています。 .sp 以下は例です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_select \e \-\-logical_table Entries \e \-\-shard_key created_at \e \-\-limit 0 \e \-\-output_columns _id \e \-\-drilldown[tag].keys tag \e \-\-drilldown[tag].calc_types MAX,MIN,SUM,AVG \e \-\-drilldown[tag].calc_target n_likes \e \-\-drilldown[tag].output_columns _key,_nsubrecs,_max,_min,_sum,_avg # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ] # ] # ], # { # "tag": [ # [ # 3 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ], # [ # "_max", # "Int64" # ], # [ # "_min", # "Int64" # ], # [ # "_sum", # "Int64" # ], # [ # "_avg", # "Float" # ] # ], # [ # "Hello", # 1, # 5, # 5, # 5, # 5.0 # ], # [ # "Groonga", # 2, # 15, # 10, # 25, # 12.5 # ], # [ # "Senna", # 2, # 3, # 3, # 6, # 3.0 # ] # ] # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS \fBdrilldown[${LABEL}].calc_target\fP .sp ラベルなしドリルダウンの \fI\%drilldown_calc_target\fP に対応しています。 .sp 例は \fI\%drilldown[${LABEL}].calc_types\fP を参照してください。 .SS 戻り値 .sp \fBlogical_select\fP の戻り値のフォーマットは \fBselect\fP と同じです。詳細は select\-return\-value を見てください。 .SS \fBlogical_shard_list\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.7 で追加. .sp \fBlogical_shard_list\fP は指定した論理テーブル名に対するすべてのシャード名を返します。 .SS 構文 .sp このコマンドの引数は1つで必須です: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_shard_list logical_table .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp このコマンドを使うには事前に \fBsharding\fP プラグインを登録します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C plugin_register sharding # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp サンプルシャードは次の通りです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Logs_20150801 TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150801 timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Logs_20150802 TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150802 timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] table_create Logs_20150930 TABLE_HASH_KEY ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Logs_20150930 timestamp COLUMN_SCALAR Time # [[0, 1337566253.89858, 0.000355720520019531], true] .ft P .fi .UNINDENT .UNINDENT .sp 論理テーブル名として \fBLogs\fP を指定すると昇順ですべてのシャード名を取得できます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_shard_list \-\-logical_table Logs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "name": "Logs_20150801" # }, # { # "name": "Logs_20150802" # }, # { # "name": "Logs_20150930" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .SS 引数 .sp このセクションでは引数について説明します。 .SS 必須引数 .sp 必須の引数が1つあります。 .SS \fBlogical_table\fP .sp 論理テーブル名を指定します。 \fBlogical_shard_list\fP は指定した論理テーブルのシャード名のリストを返します。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_shard_list \-\-logical_table Logs # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # { # "name": "Logs_20150801" # }, # { # "name": "Logs_20150802" # }, # { # "name": "Logs_20150930" # } # ] # ] .ft P .fi .UNINDENT .UNINDENT .sp このリストは昇順でソート済みです。 .SS 省略可能引数 .sp 省略可能な引数はありません。 .SS 戻り値 .sp このコマンドは昇順でソートしたシャード名のリストを返します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [ HEADER, [ {"name": "SHARD_NAME_1"}, {"name": "SHARD_NAME_2"}, ... {"name": "SHARD_NAME_N"} ] ] .ft P .fi .UNINDENT .UNINDENT .sp \fBHEADER\fP については \fB/reference/command/output_format\fP を参照してください。 .SS 参考 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB/reference/sharding\fP .UNINDENT .UNINDENT .UNINDENT .SS \fBlogical_table_remove\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このコマンドは実験的な機能です。 .UNINDENT .UNINDENT .sp バージョン 5.0.5 で追加. .sp TODO .SS 構文 .sp このコマンドにはたくさんの引数があります。 .sp 必須引数は2つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C logical_table_remove logical_table shard_key [min] [min_border] [max] [max_border] .ft P .fi .UNINDENT .UNINDENT .SS 使い方 .sp TODO .SS 引数 .sp このセクションでは \fBlogical_table_remove\fP の引数について説明します。 .SS 必須引数 .sp 必須引数は二つあります。 \fBlogical_table\fP と \fBshard_key\fP です。 .SS \fBlogical_table\fP .sp 論理テーブル名を指定します。これは "_YYYYMMDD" をテーブル名から除いたものです。実際のテーブルが "Logs_20150203" や "Logs_20150203" といったものなら、論理テーブル名は "Logs" です。 .SS \fBshard_key\fP .sp 個々のテーブルで共通のキーとして扱うカラム名を指定します。 .SS 省略可能引数 .sp いくつか省略可能な引数があります。 .SS \fBmin\fP .sp \fBshard_key\fP の最小値を指定します。 .SS \fBmin_border\fP .sp 最小値を境界値として含めるのか否かを指定します。 \fBinclude\fP もしくは \fBexclude\fP を指定します。 .SS \fBmax\fP .sp \fBshard_key\fP の最大値を指定します。 .SS \fBmax_border\fP .sp 最大値を境界値として含めるのか否かを指定します。 \fBinclude\fP もしくは \fBexclude\fP を指定します。 .SS 戻り値 .sp TODO .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [HEADER, true] .ft P .fi .UNINDENT .UNINDENT .SS Log .sp Groonga has two log files. They are process log and query log. Process log is for all of \fBexecutables/groonga\fP works. Query log is just for query processing. .SS Process log .sp Process log is enabled by default. Log path can be customized by \fB\-\-log\-path\fP option. Each log has its log level. If a log is smaller than groonga process\(aq log level, it\(aqs not logged. Log level can be customized by \fB\-l\fP or \fBcommands/log_level\fP\&. .SS フォーマット .sp Process log uses the following format: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C #{TIME_STAMP}|#{L}| #{MESSAGE} .ft P .fi .UNINDENT .UNINDENT .INDENT 0.0 .TP .B TIME_STAMP It\(aqs time stamp uses the following format: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C YYYY\-MM\-DD hh:mm:ss.SSSSSS .ft P .fi .UNINDENT .UNINDENT .INDENT 7.0 .TP .B YYYY Year with four digits. .TP .B MM Month with two digits. .TP .B DD Day with two digits. .TP .B hh Hour with two digits. .TP .B mm Minute with two digits. .TP .B ss Second with two digits. .TP .B SSSSSS Microsecond with six digits. .UNINDENT .sp 実行例: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C 2011\-07\-05 06:25:18.345734 .ft P .fi .UNINDENT .UNINDENT .TP .B L Log level with a character. Here is a character and log level map. .INDENT 7.0 .TP .B E Emergency .TP .B A Alert .TP .B C Critical .TP .B e Error .TP .B w Warning .TP .B n Notification .TP .B i Information .TP .B d Debug .TP .B \- Dump .UNINDENT .sp 実行例: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C E .ft P .fi .UNINDENT .UNINDENT .TP .B MESSAGE Details about the log with free format. .sp 実行例: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C log opened. .ft P .fi .UNINDENT .UNINDENT .UNINDENT .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C 2011\-07\-05 08:35:09.276421|n| grn_init 2011\-07\-05 08:35:09.276553|n| RLIMIT_NOFILE(4096,4096) .ft P .fi .UNINDENT .UNINDENT .SS Query log .sp Query log is disabled by default. It can be enabled by \fB\-\-query\-log\-path\fP option. .SS フォーマット .sp Query log uses the following formats: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C #{TIME_STAMP}|#{MESSAGE} #{TIME_STAMP}|#{ID}|>#{QUERY} #{TIME_STAMP}|#{ID}|:#{ELAPSED_TIME} #{PROGRESS} #{TIME_STAMP}|#{ID}|<#{ELAPSED_TIME} #{RETURN_CODE} .ft P .fi .UNINDENT .UNINDENT .INDENT 0.0 .TP .B TIME_STAMP It\(aqs time stamp uses the following format: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C YYYY\-MM\-DD hh:mm:ss.SSSSSS .ft P .fi .UNINDENT .UNINDENT .INDENT 7.0 .TP .B YYYY Year with four digits. .TP .B MM Month with two digits. .TP .B DD Day with two digits. .TP .B hh Hour with two digits. .TP .B mm Minute with two digits. .TP .B ss Second with two digits. .TP .B SSSSSS Microsecond with six digits. .UNINDENT .sp 実行例: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C 2011\-07\-05 06:25:18.345734 .ft P .fi .UNINDENT .UNINDENT .TP .B ID ID of a thread. Groonga process creates threads to process requests concurrently. Each thread outputs some logs for a request. This ID can be used to extract a log sequence by a thread. .sp 実行例: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C 45ea3034 .ft P .fi .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B > A character that indicates query is started. .UNINDENT .INDENT 0.0 .TP .B : A character that indicates query is processing. .UNINDENT .INDENT 0.0 .TP .B < A character that indicates query is finished. .TP .B MESSAGE Details about the log with free format. .sp 実行例: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C query log opened. .ft P .fi .UNINDENT .UNINDENT .TP .B QUERY A query to be processed. .sp 実行例: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C select users \-\-match_columns hobby \-\-query music .ft P .fi .UNINDENT .UNINDENT .TP .B ELAPSED_TIME Elapsed time in nanoseconds since query is started. .sp 実行例: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C 000000000075770 (It means 75,770 nanoseconds.) .ft P .fi .UNINDENT .UNINDENT .TP .B PROGRESS A processed work at the time. .sp 実行例: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C select(313401) (It means that \(aqselect\(aq is processed and 313,401 records are remained.) .ft P .fi .UNINDENT .UNINDENT .TP .B RETURN_CODE A return code for the query. .sp 実行例: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C rc=0 (It means return code is 0. 0 means GRN_SUCCESS.) .ft P .fi .UNINDENT .UNINDENT .UNINDENT .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C 2011\-07\-05 06:25:19.458756|45ea3034|>select Properties \-\-limit 0 2011\-07\-05 06:25:19.458829|45ea3034|:000000000072779 select(19) 2011\-07\-05 06:25:19.458856|45ea3034|:000000000099998 output(0) 2011\-07\-05 06:25:19.458875|45ea3034|<000000000119062 rc=0 2011\-07\-05 06:25:19.458986|45ea3034|>quit .ft P .fi .UNINDENT .UNINDENT .SS チューニング .SS 概要 .sp 大きなデータベースを扱うためのチューニングパラメーターがいくつかあります。 .SS 引数 .sp このセクションではチューニングパラメーターについて説明します。 .SS 1プロセスで開ける最大ファイル数 .sp このパラメーターは大きなデータベースを扱うためのパラメーターです。 .sp Groongaは1つのテーブル・カラムごとに1つ以上のファイルを作ります。もし、データベース内にたくさんのテーブル・カラムがある場合は、Groongaプロセスはたくさんのファイルを開く必要があります。 .sp システムでは1プロセスごとに開ける最大ファイル数を制限しています。そのため、この制限を緩和する必要があります。 .sp Groongaがどのくらいファイルを開くのかを計算する式は次の通りです。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C 3 (for DB) + N tables + N columns (except index clumns) + (N index columns * 2) + X (the number of plugins etc.) .ft P .fi .UNINDENT .UNINDENT .sp 次のスキーマを例として考えます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Entries TABLE_HASH_KEY ShortText column_create Entries content COLUMN_SCALAR Text column_create Entries n_likes COLUMN_SCALAR UInt32 table_create Terms TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto column_create Terms entries_key_index COLUMN_INDEX|WITH_POSITION Entries _key column_create Terms entries_content_index COLUMN_INDEX|WITH_POSITION Entries content .ft P .fi .UNINDENT .UNINDENT .sp この例では少なくとも11ファイル開きます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C 3 + 2 (Entries and Terms) + 2 (Entries.content and Entries.n_likes) + 4 (Terms.entries_key_index and Terms.entries_content_index) + X = 11 + X .ft P .fi .UNINDENT .UNINDENT .SS メモリ使用量 .sp このパラメーターは大きなデータベースを扱うためのパラメーターです。 .sp Groongaはデータベースファイルをメモリー上にマップしてデータベース内のデータにアクセスします。Groongaはすべてのファイルをマップするわけではなく、そのファイルの内容が必要になった段階でマップします。 .sp データベース内のすべてのデータにアクセスすると、データベースのすべてのファイルをメモリー上にマップします。もし、データベースファイルの総サイズが6GiBなら、Groongaプロセスも6GiBのメモリーを使います。 .sp 通常、データベースのすべてのファイルをメモリー上にマップすることはありません。しかし、マップすることもあります。たとえば、データベースの内容をダンプするときです。 .sp 通常、メモリーとスワップをあわせてデータベースのサイズより大きな量を用意する必要があります。Linuxにはメモリーとスワップの総量がデータベースサイズよりも小さくても動くようにできるチューニングパラメーターがあります。 .SS Linux .sp このセクションではLinux上でパラメーターをカスタマイズする方法について説明します。 .SS \fBnofile\fP .sp 次の内容の \fB/etc/security/limits.d/groonga.conf\fP 設定ファイルを作ることで \fI\%1プロセスで開ける最大ファイル数\fP パラメーターの制限を緩和することができます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C ${USER} soft nofile ${MAX_VALUE} ${USER} hard nofile ${MAX_VALUE} .ft P .fi .UNINDENT .UNINDENT .sp Groongaプロセスを \fBgroonga\fP ユーザーで動かし、Groongaプロセスが10000以下のファイルを開くなら、次の設定を使います。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga soft nofile 10000 groonga hard nofile 10000 .ft P .fi .UNINDENT .UNINDENT .sp この設定はGroongaサービスが再起動したあと、あるいは、 \fBgroonga\fP ユーザーがログインし直したときに反映されます。 .SS \fBvm.overcommit_memory\fP .sp これは \fI\%メモリ使用量\fP 関連のパラメーターです。 \fBvm.overcommit_memory\fP カーネルパラメーターを \fB1\fP に設定することで、メモリーとスワップの総量以上のサイズのデータベースを扱うことができます。 \fB1\fP は「Groongaは常にデータベースファイルをメモリー上にマップできる」という意味です。Groongaはこの設定を推奨しています。 .sp \fBvm.overcommit_memory\fP パラメーターの詳細は \fI\%overcommitに関するLinuxカーネルのドキュメント\fP を参照してください。 .sp 次の内容の \fB/etc/sysctl.d/groonga.conf\fP 設定ファイルを作成することでこの設定をすることができます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C vm.overcommit_memory = 1 .ft P .fi .UNINDENT .UNINDENT .sp 設定した内容はシステムを再起動するか、次のコマンドを実行することで反映されます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo sysctl \-p .ft P .fi .UNINDENT .UNINDENT .SS \fBvm.max_map_count\fP .sp これは \fI\%メモリ使用量\fP 関連のパラメーターです。 \fBvm.max_map_count\fP カーネルパラメーターの値を増やすことで16GiB以上のサイズのデータベースを扱うことができます。このパラメーターはメモリーマップの回数を制限します。 .sp このカーネルパラメーターのデフォルト値は \fB65530\fP か \fB65536\fP です。Groongaは一度に256KiBずつメモリー上にマップします。データベースが16GiBよりも大きい場合、Groongaはこの制限に達します。( \fB256KiB * 65536 = 16GiB\fP ) .sp 16GiB以上のサイズのデータベースを扱う場合はこのカーネルパラメーターの値を増やす必要があります。たとえば、 \fB65536 * 2 = 131072\fP まで増やすと32GiBくらいのデータベースを扱うことができます。次の内容の設定ファイルを \fB/etc/sysctl.d/groonga.conf\fP に置くとこの設定適用できます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C vm.max_map_count = 131072 .ft P .fi .UNINDENT .UNINDENT .sp すでに \fBvm.overcommit_memory\fP の設定があるはずなので、実際の設定ファイルの内容は次のようになることに注意してください。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C vm.overcommit_memory = 1 vm.max_map_count = 131072 .ft P .fi .UNINDENT .UNINDENT .sp 設定した内容はシステムを再起動するか、次のコマンドを実行することで反映されます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo sysctl \-p .ft P .fi .UNINDENT .UNINDENT .SS FreeBSD .sp このセクションではFreeBSD上で引数をカスタマイズする方法を説明します。 .SS \fBkern.maxfileperproc\fP .sp TODO .SS API .sp Groongaを全文検索ライブラリとして使うことができます。この節ではGroongaが提供しているAPIを示します。 .SS 概要 .SS 概要 .sp Groongaをライブラリーとして使うことができます。Groongaを初期化・終了するために次のAPIを使う必要があります。 .sp \fI\%grn_init()\fP はGroongaを初期化します。一方、 \fI\%grn_fin()\fP はGroongaを終了します。 .sp Groongaが提供するAPIを使う前に \fI\%grn_init()\fP を1度だけ呼ぶ必要があります。Groongaが提供するAPIを呼び終わったら、 \fI\%grn_fin()\fP を1度だけ呼ぶ必要があります。 .SS 例 .sp 以下はGroongaを全文検索ライブラリーとして使う例です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C grn_rc rc; /* It initializes resources used by Groonga. */ rc = grn_init(); if (rc != GRN_SUCCESS) { return EXIT_FAILURE; } /* Some Groonga API calling codes... */ /* It releases resources used by Groonga. */ grn_fin(); return EXIT_SUCCESS; .ft P .fi .UNINDENT .UNINDENT .SS リファレンス .INDENT 0.0 .TP .B grn_rc grn_init(void) \fBgrn_init()\fP はGroongaが使うリソースを初期化します。他のGroongaのAPIを呼ぶ前に1度だけこれを呼ぶ必要があります。 .INDENT 7.0 .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_fin(void) \fBgrn_fin()\fP はGroongaが使ったリソースを解放します。 \fBgrn_fin()\fP を呼んだ後はGroongaのAPIを呼ぶことはできません。 .INDENT 7.0 .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .SS 全体設定 .SS 概要 .sp Groongaにはグローバルな設定があります。それらにアクセスするにはAPIを使います。 .SS リファレンス .INDENT 0.0 .TP .B int grn_get_lock_timeout(void) ロックタイムアウトを返します。 .sp \fBgrn_ctx\fP acquires a lock for updating a shared value. If other \fBgrn_ctx\fP is already updating the same value, \fBgrn_ctx\fP that try to acquire a lock can\(aqt acquires a lock. The \fBgrn_ctx\fP that can\(aqt acquires a lock waits 1 millisecond and try to acquire a lock again. The try is done \fBtimeout\fP times. If the \fBgrn_ctx\fP that can\(aqt acquires a lock until \fBtimeout\fP times, the tries are failed. .sp デフォルトのロックタイムアウトは \fB10000000\fP です。つまりGroongaはロックの失敗をおよそ3時間経過するまで報告しません。(1 * 10000000 [msec] = 10000 [sec] = 166.666... [min] = 2.777... [hour]) .INDENT 7.0 .TP .B 戻り値 ロックタイムアウト。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_set_lock_timeout(int\fI\ timeout\fP) ロックタイムアウトを設定します。 .sp ロックタイムアウトについては、 \fI\%grn_get_lock_timeout()\fP を参照してください。 .sp \fBtimeout\fP にはいくつか特別な値があります。 .INDENT 7.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB0\fP: Groongaがロックを再度取得しようとしません。一度ロックの取得に失敗した時点でGroongaはその失敗を報告します。 .IP \(bu 2 負数: Groongaはロックを取得できるまでリトライします。 .UNINDENT .UNINDENT .UNINDENT .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtimeuot\fP \-\- 新しいロックのタイムアウト。 .UNINDENT .TP .B 戻り値 \fBGRN_SUCCESS\fP 。この関数は失敗しません。 .UNINDENT .UNINDENT .SS Plugin .SS 概要 .sp Groonga supports plugin. You can create a new plugin with the following API. .sp TOOD: Describe about how to create the minimum plugin here or create a tutorial about it. .SS リファレンス .INDENT 0.0 .TP .B grn_rc GRN_PLUGIN_INIT(grn_ctx\fI\ *ctx\fP) .UNINDENT .INDENT 0.0 .TP .B grn_rc GRN_PLUGIN_REGISTER(grn_ctx\fI\ *ctx\fP) .UNINDENT .INDENT 0.0 .TP .B grn_rc GRN_PLUGIN_FIN(grn_ctx\fI\ *ctx\fP) .UNINDENT .INDENT 0.0 .TP .B GRN_PLUGIN_MALLOC(ctx, size) GRN_PLUGIN_MALLOC() allocates \fIsize\fP bytes and returns a pointer to the allocated memory space. Note that the memory space is associated with \fIctx\fP\&. .UNINDENT .INDENT 0.0 .TP .B GRN_PLUGIN_REALLOC(ctx, ptr, size) GRN_PLUGIN_REALLOC() resizes the memory space pointed to by \fIptr\fP or allocates a new memory space of \fIsize\fP bytes. GRN_PLUGIN_REALLOC() returns a pointer to the memory space. The contents is unchanged or copied from the old memory space to the new memory space. .UNINDENT .INDENT 0.0 .TP .B GRN_PLUGIN_FREE(ctx, ptr) GRN_PLUGIN_FREE() frees a memory space allocated by GRN_PLUGIN_MALLOC() or GRN_PLUGIN_REALLOC(). This means that \fIptr\fP must be a pointer returned by GRN_PLUGIN_MALLOC() or GRN_PLUGIN_REALLOC(). .UNINDENT .INDENT 0.0 .TP .B GRN_PLUGIN_LOG(ctx, level, \&...) GRN_PLUGIN_LOG() reports a log of \fIlevel\fP\&. Its error message is generated from the varying number of arguments, in which the first one is the format string and the rest are its arguments. See grn_log_level in "groonga.h" for more details of \fIlevel\fP\&. .UNINDENT .INDENT 0.0 .TP .B GRN_PLUGIN_ERROR(ctx, error_code, \&...) GRN_PLUGIN_ERROR() reports an error of \fIerror_code\fP\&. Its error message is generated from the varying number of arguments, in which the first one is the format string and the rest are its arguments. See grn_rc in "groonga.h" for more details of \fIerror_code\fP\&. .UNINDENT .INDENT 0.0 .TP .B grn_plugin_mutex grn_plugin_mutex is available to make a critical section. See the following functions. .UNINDENT .INDENT 0.0 .TP .B grn_plugin_mutex *grn_plugin_mutex_open(grn_ctx\fI\ *ctx\fP) grn_plugin_mutex_open() returns a pointer to a new object of grn_plugin_mutex. Memory for the new object is obtained with GRN_PLUGIN_MALLOC(). grn_plugin_mutex_open() returns NULL if sufficient memory is not available. .UNINDENT .INDENT 0.0 .TP .B void grn_plugin_mutex_close(grn_ctx\fI\ *ctx\fP, grn_plugin_mutex\fI\ *mutex\fP) grn_plugin_mutex_close() finalizes an object of grn_plugin_mutex and then frees memory allocated for that object. .UNINDENT .INDENT 0.0 .TP .B void grn_plugin_mutex_lock(grn_ctx\fI\ *ctx\fP, grn_plugin_mutex\fI\ *mutex\fP) grn_plugin_mutex_lock() locks a mutex object. If the object is already locked, the calling thread waits until the object will be unlocked. .UNINDENT .INDENT 0.0 .TP .B void grn_plugin_mutex_unlock(grn_ctx\fI\ *ctx\fP, grn_plugin_mutex\fI\ *mutex\fP) grn_plugin_mutex_unlock() unlocks a mutex object. grn_plugin_mutex_unlock() should not be called for an unlocked object. .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_plugin_proc_alloc(grn_ctx\fI\ *ctx\fP, grn_user_data\fI\ *user_data\fP, grn_id\fI\ domain\fP, grn_obj_flags\fI\ flags\fP) grn_plugin_proc_alloc() allocates a \fIgrn_obj\fP object. You can use it in function that is registered as GRN_PROC_FUNCTION. .UNINDENT .INDENT 0.0 .TP .B grn_obj grn_plugin_proc_get_var(grn_ctx\fI\ *ctx\fP, grn_user_data\fI\ *user_data\fP, const char\fI\ *name\fP, int\fI\ name_size\fP) It gets a variable value from \fIgrn_user_data\fP by specifying the variable name. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBname\fP \-\- 変数名。 .IP \(bu 2 \fBname_size\fP \-\- The number of bytes of name. If \fIname_size\fP is negative, \fIname\fP must be NUL\-terminated. \fIname_size\fP is computed by \fIstrlen(name)\fP for the case. .UNINDENT .TP .B 戻り値 成功すると変数の値を返します。失敗するとNULLを返します。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_plugin_proc_get_var_by_offset(grn_ctx\fI\ *ctx\fP, grn_user_data\fI\ *user_data\fP, unsigned int\fI\ offset\fP) It gets a variable value from \fIgrn_user_data\fP by specifying the offset position of the variable. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBoffset\fP \-\- The offset position of the variable. .UNINDENT .TP .B 戻り値 成功すると変数の値を返します。失敗するとNULLを返します。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B const char *grn_plugin_win32_base_dir(void) バージョン 5.0.9. で撤廃: Use \fI\%grn_plugin_windows_base_dir()\fP instead. .sp It returns the Groonga install directory. The install directory is computed from the directory that has \fBgroonga.dll\fP\&. You can use the directory to generate install directory aware path. It only works on Windows. It returns \fBNULL\fP on other platforms. .UNINDENT .INDENT 0.0 .TP .B const char *grn_plugin_windows_base_dir(void) バージョン 5.0.9 で追加. .sp It returns the Groonga install directory. The install directory is computed from the directory that has \fBgroonga.dll\fP\&. You can use the directory to generate install directory aware path. It only works on Windows. It returns \fBNULL\fP on other platforms. .UNINDENT .INDENT 0.0 .TP .B int grn_plugin_charlen(grn_ctx\fI\ *ctx\fP, const char\fI\ *str_ptr\fP, unsigned int\fI\ str_length\fP, grn_encoding\fI\ encoding\fP) grn_plugin_charlen() returns the length (#bytes) of the first character in the string specified by \fIstr_ptr\fP and \fIstr_length\fP\&. If the starting bytes are invalid as a character, grn_plugin_charlen() returns 0. See grn_encoding in "groonga.h" for more details of \fIencoding\fP\&. .UNINDENT .INDENT 0.0 .TP .B int grn_plugin_isspace(grn_ctx\fI\ *ctx\fP, const char\fI\ *str_ptr\fP, unsigned int\fI\ str_length\fP, grn_encoding\fI\ encoding\fP) grn_plugin_isspace() returns the length (#bytes) of the first character in the string specified by \fIstr_ptr\fP and \fIstr_length\fP if it is a space character. Otherwise, grn_plugin_isspace() returns 0. .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_plugin_expr_var_init(grn_ctx\fI\ *ctx\fP, grn_expr_var\fI\ *var\fP, const char\fI\ *name\fP, int\fI\ name_size\fP) It initializes a \fIgrn_expr_var\fP\&. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBvar\fP \-\- The pointer of \fIgrn_expr_var\fP object to be initialized. .IP \(bu 2 \fBname\fP \-\- The name of \fIgrn_expr_var\fP object to be initialized. .IP \(bu 2 \fBname_size\fP \-\- The number of bytes of name. If \fIname_size\fP is negative, \fIname\fP must be NUL\-terminated. \fIname_size\fP is computed by \fIstrlen(name)\fP for the case. .UNINDENT .TP .B 戻り値 \fBGRN_SUCCESS\fP 。この関数は失敗しません。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj * grn_plugin_command_create(grn_ctx\fI\ *ctx\fP, const char\fI\ *name\fP, int\fI\ name_size\fP, grn_proc_func\fI\ func\fP, unsigned int\fI\ n_vars\fP, grn_expr_var\fI\ *vars\fP) It creates a command. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBname\fP \-\- The \fIproc\fP name of the command to be created. .IP \(bu 2 \fBname_size\fP \-\- The number of bytes of name. If \fIname_size\fP is negative, \fIname\fP must be NUL\-terminated. \fIname_size\fP is computed by \fIstrlen(name)\fP for the case. .IP \(bu 2 \fBfunc\fP \-\- The function name to be called by the created command. .IP \(bu 2 \fBn_vars\fP \-\- The number of the variables of the command to create. .IP \(bu 2 \fBvars\fP \-\- The pointer of initialized \fIgrn_expr_var\fP object. .UNINDENT .TP .B 戻り値 The created command object if it creates a command successfully, \fINULL\fP otherwise. See \fIctx\fP for error details. .UNINDENT .UNINDENT .SS \fBgrn_cache\fP .SS 概要 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 このAPIは実験的です。 .UNINDENT .UNINDENT .sp \fBgrn_cache\fP は \fB/reference/commands/select\fP コマンドのレスポンスを保持するためのデータストアです。一般的なオブジェクトのキャッシュとして使うものではありません。あくまで \fB/reference/commands/select\fP コマンドのためのものです。 .sp \fI\%grn_cache_current_set()\fP を使うことで現在のキャッシュオブジェクトを変更することができます。 \fB/reference/commands/select\fP コマンドのレスポンスが内部的に用いられます。 .sp \fB/reference/commands/select\fP コマンドは、一つのグローバルキャッシュオブジェクトを利用します。もし複数のデータベースをオープンしていた場合、そのキャッシュオブジェクトは共有されます。これは重要な問題です。 .sp もし複数のデータベースを開き、 \fB/reference/commands/select\fP コマンドを使用するのであれば、 \fBgrn_cache\fP オブジェクトを使う必要があります。 \fB/reference/executables/groonga\-httpd\fP のようなケースが該当します。もし一つのデータベースのみを開く場合や、 \fB/reference/commands/select\fP コマンドを使わない場合は、 \fBgrn_cache\fP オブジェクトを使う必要はありません。 \fIRroonga \fP のようなケースです。 .SS 例 .sp 以下はキャッシュを変更する例です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C grn_cache *cache; grn_cache *cache_previous; cache = grn_cache_open(ctx); cache_previous = grn_cache_current_get(ctx); grn_cache_current_set(ctx, cache); /* grn_ctx_send(ctx, ...); */ grn_cache_current_set(ctx, cache_previous); .ft P .fi .UNINDENT .UNINDENT .SS リファレンス .INDENT 0.0 .TP .B grn_cache \fBgrn_cache\fP は詳細を公開していないオブジェクトです。 \fI\%grn_cache_open()\fP で作成し、 \fI\%grn_cache_close()\fP で解放できます。 .UNINDENT .INDENT 0.0 .TP .B grn_cache *grn_cache_open(grn_ctx\fI\ *ctx\fP) 新規にキャッシュオブジェクトを作成します。 .sp 新しいキャッシュオブジェクト作成のためのメモリ割り当てに失敗した場合、 \fBNULL\fP を返します。エラー情報は \fBctx\fP に格納されます。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- その時点のコンテキスト。 .UNINDENT .TP .B 戻り値 新しいキャッシュオブジェクトの作成に成功した場合は \fBNULL\fP 以外の値を返します。このキャッシュオブジェクトは \fI\%grn_cache_close()\fP で解放されなければなりません。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_cache_close(grn_ctx\fI\ *ctx\fP, grn_cache\fI\ *cache\fP) \fBcache\fP のリソースを解放。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- その時点のコンテキスト。 .IP \(bu 2 \fBcache\fP \-\- キャッシュオブジェクトを解放する。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_cache_current_set(grn_ctx\fI\ *ctx\fP, grn_cache\fI\ *cache\fP) \fB/reference/commands/select\fP コマンドで使われるキャッシュオブジェクトを設定します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- その時点のコンテキスト。 .IP \(bu 2 \fBcache\fP \-\- \fB/reference/commands/select\fP コマンドで使われるキャッシュオブジェクト。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_cache *grn_cache_current_get(grn_ctx\fI\ *ctx\fP) \fB/reference/commands/select\fP コマンドで使われるキャッシュオブジェクトを取得します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- その時点のコンテキスト。 .UNINDENT .TP .B 戻り値 \fB/reference/commands/select\fP コマンドで使われるキャッシュオブジェクト。 \fBNULL\fP のこともあります。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_cache_set_max_n_entries(grn_ctx\fI\ *ctx\fP, grn_cache\fI\ *cache\fP, unsigned int\fI\ n\fP) キャッシュオブジェクトのエントリの最大数を設定します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- その時点のコンテキスト。 .IP \(bu 2 \fBcache\fP \-\- 変更するキャッシュオブジェクト。 .IP \(bu 2 \fBn\fP \-\- キャッシュオブジェクトの新しい最大エントリ数。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B unsigned int grn_cache_get_max_n_entries(grn_ctx\fI\ *ctx\fP, grn_cache\fI\ *cache\fP) キャッシュオブジェクトのエントリの最大数を取得します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- その時点のコンテキスト。 .IP \(bu 2 \fBcache\fP \-\- ターゲットキャッシュオブジェクト。 .UNINDENT .TP .B 戻り値 キャッシュオブジェクトの最大エントリ数。 .UNINDENT .UNINDENT .SS \fBgrn_column\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B GRN_COLUMN_NAME_ID \fB/reference/columns/pseudo\fP \fB_id\fP の名前を返します。 .sp 以下のように \fI\%GRN_COLUMN_NAME_ID_LEN\fP と一緒に使うと便利です: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C grn_obj *id_column; id_column = grn_ctx_get(ctx, GRN_COLUMN_NAME_ID, GRN_COLUMN_NAME_ID_LEN); .ft P .fi .UNINDENT .UNINDENT .sp 3.1.1から。 .UNINDENT .INDENT 0.0 .TP .B GRN_COLUMN_NAME_ID_LEN It returns the byte size of \fI\%GRN_COLUMN_NAME_ID\fP\&. .sp 3.1.1から。 .UNINDENT .INDENT 0.0 .TP .B GRN_COLUMN_NAME_KEY It returns the name of \fB/reference/columns/pseudo\fP \fB_key\fP\&. .sp It is useful to use with \fI\%GRN_COLUMN_NAME_KEY_LEN\fP like the following: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C grn_obj *key_column; key_column = grn_ctx_get(ctx, GRN_COLUMN_NAME_KEY, GRN_COLUMN_NAME_KEY_LEN); .ft P .fi .UNINDENT .UNINDENT .sp 3.1.1から。 .UNINDENT .INDENT 0.0 .TP .B GRN_COLUMN_NAME_KEY_LEN It returns the byte size of \fI\%GRN_COLUMN_NAME_KEY\fP\&. .sp 3.1.1から。 .UNINDENT .INDENT 0.0 .TP .B GRN_COLUMN_NAME_VALUE It returns the name of \fB/reference/columns/pseudo\fP \fB_value\fP\&. .sp It is useful to use with \fI\%GRN_COLUMN_NAME_VALUE_LEN\fP like the following: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C grn_obj *value_column; value_column = grn_ctx_get(ctx, GRN_COLUMN_NAME_VALUE, GRN_COLUMN_NAME_VALUE_LEN); .ft P .fi .UNINDENT .UNINDENT .sp 3.1.1から。 .UNINDENT .INDENT 0.0 .TP .B GRN_COLUMN_NAME_VALUE_LEN It returns the byte size of \fI\%GRN_COLUMN_NAME_VALUE\fP\&. .sp 3.1.1から。 .UNINDENT .INDENT 0.0 .TP .B GRN_COLUMN_NAME_SCORE \fB/reference/columns/pseudo\fP \fB_score\fP の名前を返します。 .sp 以下のように \fI\%GRN_COLUMN_NAME_SCORE_LEN\fP と一緒に使うと便利です: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C grn_obj *score_column; score_column = grn_ctx_get(ctx, GRN_COLUMN_NAME_SCORE, GRN_COLUMN_NAME_SCORE_LEN); .ft P .fi .UNINDENT .UNINDENT .sp 3.1.1から。 .UNINDENT .INDENT 0.0 .TP .B GRN_COLUMN_NAME_SCORE_LEN \fI\%GRN_COLUMN_NAME_SCORE\fP のサイズをバイト数で返します。 .sp 3.1.1から。 .UNINDENT .INDENT 0.0 .TP .B GRN_COLUMN_NAME_NSUBRECS \fB/reference/columns/pseudo\fP \fB_nsubrecs\fP の名前を返します .sp 以下のように \fI\%GRN_COLUMN_NAME_NSUBRECS_LEN\fP と一緒に使うと便利です: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C grn_obj *nsubrecs_column; nsubrecs_column = grn_ctx_get(ctx, GRN_COLUMN_NAME_NSUBRECS, GRN_COLUMN_NAME_NSUBRECS_LEN); .ft P .fi .UNINDENT .UNINDENT .sp 3.1.1から。 .UNINDENT .INDENT 0.0 .TP .B GRN_COLUMN_NAME_NSUBRECS_LEN \fI\%GRN_COLUMN_NAME_NSUBRECS\fP のサイズをバイト数で返す。 .sp 3.1.1から。 .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_column_create(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, const char\fI\ *name\fP, unsigned int\fI\ name_size\fP, const char\fI\ *path\fP, grn_obj_flags\fI\ flags\fP, grn_obj\fI\ *type\fP) tableに新たなカラムを定義します。nameは省略できません。一つのtableに同一のnameのcolumnを複数定義することはできません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBname\fP \-\- カラム名を指定します。 .IP \(bu 2 \fBname_size\fP \-\- nameパラメータのsize(byte)を指定します。 .IP \(bu 2 \fBpath\fP \-\- カラムを格納するファイルパスを指定します。 flagsに \fBGRN_OBJ_PERSISTENT\fP が指定されている場合のみ有効です。 NULLなら自動的にファイルパスが付与されます。 .IP \(bu 2 \fBflags\fP \-\- .sp \fBGRN_OBJ_PERSISTENT\fP を指定すると永続columnとなります。 .sp \fBGRN_OBJ_COLUMN_INDEX\fP を指定すると転置インデックスとなります。 .sp \fBGRN_OBJ_COLUMN_SCALAR\fP を指定するとスカラ値(単独の値)を格納します。 .sp \fBGRN_OBJ_COLUMN_VECTOR\fP を指定すると値の配列を格納します。 .sp \fBGRN_OBJ_COMPRESS_ZLIB\fP を指定すると値をzlib圧縮して格納します。 .sp \fBGRN_OBJ_COMPRESS_LZO\fP を指定すると値をlzo圧縮して格納します。 .sp \fBGRN_OBJ_COLUMN_INDEX\fP と共に \fBGRN_OBJ_WITH_SECTION\fP を指定すると、転置索引にsection(段落情報)を合わせて格納します。 .sp \fBGRN_OBJ_COLUMN_INDEX\fP と共に \fBGRN_OBJ_WITH_WEIGHT\fP を指定すると、転置索引にweight情報を合わせて格納します。 .sp \fBGRN_OBJ_COLUMN_INDEX\fP と共に \fBGRN_OBJ_WITH_POSITION\fP を指定すると、転置索引に出現位置情報を合わせて格納します。 .IP \(bu 2 \fBtype\fP \-\- カラム値の型を指定します。定義済みのtypeあるいはtableを指定できます。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_column_index_update(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *column\fP, grn_id\fI\ id\fP, unsigned int\fI\ section\fP, grn_obj\fI\ *oldvalue\fP, grn_obj\fI\ *newvalue\fP) oldvalue, newvalueの値から得られるキーに対応するcolumnの値の中の、id, sectionに対応するエントリを更新します。columnは \fBGRN_OBJ_COLUMN_INDEX\fP 型のカラムでなければなりません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBcolumn\fP \-\- 対象columnを指定します。 .IP \(bu 2 \fBid\fP \-\- 対象レコードのIDを指定します。 .IP \(bu 2 \fBsection\fP \-\- 対象レコードのセクション番号を指定します。 .IP \(bu 2 \fBoldvalue\fP \-\- 更新前の値を指定します。 .IP \(bu 2 \fBnewvalue\fP \-\- 更新後の値を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_column_table(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *column\fP) columnが属するtableを返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBcolumn\fP \-\- 対象columnを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_column_rename(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *column\fP, const char\fI\ *name\fP, unsigned int\fI\ name_size\fP) ctxが使用するdbにおいてcolumnに対応する名前をnameに更新します。columnは永続オブジェクトでなければいけません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBcolumn\fP \-\- 対象columnを指定します。 .IP \(bu 2 \fBname\fP \-\- 新しい名前を指定します。 .IP \(bu 2 \fBname_size\fP \-\- nameパラメータのsize(byte)を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_column_name(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, char\fI\ *namebuf\fP, int\fI\ buf_size\fP) カラムobjの名前の長さを返します。buf_sizeの長さが名前の長さ以上であった場合は、namebufに該当する名前をコピーします。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBnamebuf\fP \-\- 名前を格納するバッファ(呼出側で準備する)を指定します。 .IP \(bu 2 \fBbuf_size\fP \-\- namebufのサイズ(byte長)を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_column_index(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *column\fP, grn_operator\fI\ op\fP, grn_obj\fI\ **indexbuf\fP, int\fI\ buf_size\fP, int\fI\ *section\fP) columnに張られているindexのうち、opの操作を実行可能なものの数を返します。またそれらのidを、buf_sizeに指定された個数を上限としてindexbufに返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBcolumn\fP \-\- 対象のcolumnを指定します。 .IP \(bu 2 \fBop\fP \-\- indexで実行したい操作を指定します。 .IP \(bu 2 \fBindexbuf\fP \-\- indexを格納するバッファ(呼出側で準備する)を指定します。 .IP \(bu 2 \fBbuf_size\fP \-\- indexbufのサイズ(byte長)を指定します。 .IP \(bu 2 \fBsection\fP \-\- section番号を格納するint長バッファ(呼出側で準備する)を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_column_truncate(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *column\fP) .sp \fB注釈:\fP .INDENT 7.0 .INDENT 3.5 This is a dangerous API. You must not use this API when other thread or process accesses the target column. If you use this API against shared column, the process that accesses the column may be broken and the column may be broken. .UNINDENT .UNINDENT .sp バージョン 4.0.9 で追加. .sp Clears all values in the column. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBcolumn\fP \-\- truncate対象のカラム。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .SS \fBgrn_command_version\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_command_version .UNINDENT .INDENT 0.0 .TP .B GRN_COMMAND_VERSION_MIN .UNINDENT .INDENT 0.0 .TP .B GRN_COMMAND_VERSION_STABLE .UNINDENT .INDENT 0.0 .TP .B GRN_COMMAND_VERSION_MAX .UNINDENT .INDENT 0.0 .TP .B grn_command_version grn_get_default_command_version(void) デフォルトのcommand_versionを返します。 .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_set_default_command_version(grn_command_version\fI\ version\fP) デフォルトのcommand_versionを変更します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBversion\fP \-\- 変更後のデフォルトのcommand_versionを指定します。 .UNINDENT .UNINDENT .UNINDENT .SS \fBgrn_content_type\fP .SS 概要 .sp \fI\%grn_content_type\fP shows input type and output type. Currently, it is used only for output type. .sp Normally, you don\(aqt need to use this type. It is used internally in \fBgrn_ctx_send()\fP\&. .SS リファレンス .INDENT 0.0 .TP .B grn_content_type 指定可能な値は以下の通りです。 .INDENT 7.0 .TP .B \fIGRN_CONTENT_NONE\fP It means that outputting nothing or using the original format. \fB/reference/commands/dump\fP uses the type. .TP .B \fIGRN_CONTENT_TSV\fP It means tab separated values format. .TP .B \fIGRN_CONTENT_JSON\fP JSON形式: .TP .B \fIGRN_CONTENT_XML\fP It means XML format. .TP .B \fIGRN_CONTENT_MSGPACK\fP It means MessagePack format. You need MessagePack library on building Groonga. If you don\(aqt have MessagePack library, you can\(aqt use this type. .UNINDENT .UNINDENT .SS \fBgrn_ctx\fP .SS 概要 .sp \fI\%grn_ctx\fP は最も重要なオブジェクトです。\fI\%grn_ctx\fP はその時点の情報を保持します: .INDENT 0.0 .IP \(bu 2 最後に発生したエラー。 .IP \(bu 2 その時点のエンコーディング。 .IP \(bu 2 デフォルトの閾値。(例: select\-match\-escalation\-threshold) .IP \(bu 2 デフォルトのコマンドバージョン。( \fB/reference/command/command_version\fP )を参照のこと。 .UNINDENT .sp \fI\%grn_ctx\fP は基盤となる機能を提供します: .INDENT 0.0 .IP \(bu 2 メモリ管理機能 .IP \(bu 2 ロギング機能 .UNINDENT .sp ほとんどのAPIは \fI\%grn_ctx\fP を最初の引数にとります。 .sp 同じ \fI\%grn_ctx\fP を二つ以上のスレッドからは扱えません。\fI\%grn_ctx\fP はスレッドごとに作成する必要があります。一つのスレッドでは \fI\%grn_ctx\fP を二つ以上扱えますが、通常はその必要はありません。 .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_ctx TODO... .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_ctx_init(grn_ctx\fI\ *ctx\fP, int\fI\ flags\fP) ctxを初期化します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- 初期化するctx構造体へのポインタを指定します。 .IP \(bu 2 \fBflags\fP \-\- 初期化する \fBctx\fP のオプションを指定します。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_ctx_fin(grn_ctx\fI\ *ctx\fP) ctxの管理するメモリを解放し、使用を終了します。 .sp \fI\%grn_ctx_init()\fP ではなく \fI\%grn_ctx_open()\fP で \fBctx\fP を初期化した場合、 \fI\%grn_ctx_fin()\fP ではなく \fI\%grn_ctx_close()\fP を使わなければいけません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- 解放するctx構造体へのポインタを指定します。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_ctx *grn_ctx_open(int\fI\ flags\fP) 初期化された \fI\%grn_ctx\fP オブジェクトを返します。 .sp \fI\%grn_ctx_init()\fP で初期化された \fI\%grn_ctx\fP オブジェクトは構造体の実体をAPIの呼び元で確保するのに対して、 \fI\%grn_ctx_open()\fP ではGroongaライブラリの内部で、実体を確保します。 どちらで初期化された \fI\%grn_ctx\fP も、 \fI\%grn_ctx_fin()\fP で解放できます。 \fI\%grn_ctx_open()\fP で確保した \fI\%grn_ctx\fP 構造体に関しては、\fI\%grn_ctx_fin()\fP で解放した後に、その \fI\%grn_ctx\fP で作成した \fBgrn_obj\fP を \fBgrn_obj_close()\fP によって解放しても問題ありません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBflags\fP \-\- 初期化する \fBctx\fP のオプションを指定します。 .UNINDENT .TP .B 戻り値 初期化された \fI\%grn_ctx\fP オブジェクトを返します。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_ctx_close(grn_ctx\fI\ *ctx\fP) \fI\%grn_ctx_fin()\fP を呼び出し、その後、 \fI\%grn_ctx_open()\fP によって割り当てた \fBctx\fP のメモリを解放する。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- もう使わない \fI\%grn_ctx\fP 。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_ctx_set_finalizer(grn_ctx\fI\ *ctx\fP, grn_proc_func\fI\ *func\fP) ctxを破棄するときに呼ばれる関数を設定します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- 対象ctxを指定します。 .IP \(bu 2 \fBfunc\fP \-\- \fBctx\fP を破棄するときに呼ばれる関数を指定します。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_command_version grn_ctx_get_command_version(grn_ctx\fI\ *ctx\fP) command_versionを返します。 .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_ctx_set_command_version(grn_ctx\fI\ *ctx\fP, grn_command_version\fI\ version\fP) command_versionを変更します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBversion\fP \-\- 変更後のcommand_versionを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_ctx_use(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *db\fP) ctxが操作対象とするdbを指定します。NULLを指定した場合は、dbを操作しない状態(init直後の状態)になります。 .sp \fBGRN_CTX_PER_DB\fP フラグを指定した \fI\%grn_ctx\fP と一緒に使ってはいけません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBdb\fP \-\- ctxが使用するdbを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_ctx_db(grn_ctx\fI\ *ctx\fP) ctxが現在操作対象としているdbを返します。dbを使用していない場合はNULLを返します。 .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_ctx_get(grn_ctx\fI\ *ctx\fP, const char\fI\ *name\fP, int\fI\ name_size\fP) ctxが使用するdbからnameに対応するオブジェクトを検索して返す。nameに一致するオブジェクトが存在しなければNULLを返す。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBname\fP \-\- 検索しようとするオブジェクトの名前。 .IP \(bu 2 \fBname_size\fP \-\- 名前のバイト数。負の値が指定された場合は、終端をNULL文字とした文字列として扱われる。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_ctx_at(grn_ctx\fI\ *ctx\fP, grn_id\fI\ id\fP) ctx、またはctxが使用するdbからidに対応するオブジェクトを検索して返す。idに一致するオブジェクトが存在しなければNULLを返す。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBid\fP \-\- 検索しようとするオブジェクトのidを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_ctx_get_all_tables(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *tables_buffer\fP) It pushes all tables in the database of \fBctx\fP into \fBtables_buffer\fP\&. \fBtables_buffer\fP should be initialized as \fBGRN_PVECTOR\fP\&. You can use \fBGRN_PTR_INIT()\fP with \fBGRN_OBJ_VECTOR\fP flags to initialize \fBtables_buffer\fP\&. .sp 以下は例です。 .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C grn_rc rc; grn_obj tables; int i; int n_tables; GRN_PTR_INIT(&tables, GRN_OBJ_VECTOR, GRN_ID_NIL); rc = grn_ctx_get_all_tables(ctx, &tables); if (rc != GRN_SUCCESS) { GRN_OBJ_FIN(ctx, &tables); /* Handle error. */ return; } n_tables = GRN_BULK_VSIZE(&tables) / sizeof(grn_obj *); for (i = 0; i < n_tables; i++) { grn_obj *table = GRN_PTR_VALUE_AT(&tables, i); /* Use table. */ } /* Free resources. */ for (i = 0; i < n_tables; i++) { grn_obj *table = GRN_PTR_VALUE_AT(&tables, i); grn_obj_unlink(ctx, table); } GRN_OBJ_FIN(ctx, &tables); .ft P .fi .UNINDENT .UNINDENT .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- その時点のコンテキスト。 .IP \(bu 2 \fBtable_buffer\fP \-\- The output buffer to store tables. .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_content_type grn_ctx_get_output_type(grn_ctx\fI\ *ctx\fP) コンテキストの出力形式を取得します。 .sp Normally, this function isn\(aqt needed. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- その時点のコンテキスト。 .UNINDENT .TP .B 戻り値 The output type of the context. .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_ctx_set_output_type(grn_ctx\fI\ *ctx\fP, grn_content_type\fI\ type\fP) Sets the new output type to the context. It is used by executing a command by \fBgrn_expr_exec()\fP\&. If you use \fBgrn_ctx_send()\fP, the new output type isn\(aqt used. \fBgrn_ctx_send()\fP sets output type from command line internally. .sp Normally, this function isn\(aqt needed. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- その時点のコンテキスト。 .IP \(bu 2 \fBtype\fP \-\- 新しい出力形式。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_bool_rc grn_ctx_is_opened(grn_ctx\fI\ *ctx\fP, grn_id\fI\ id\fP) 指定したIDのオブジェクトが開かれているかどうかをチェックします。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- その時点のコンテキスト。 .IP \(bu 2 \fBid\fP \-\- チェック対象のオブジェクトのID。 .UNINDENT .TP .B 戻り値 指定したIDのオブジェクトが開かれていたら \fBGRN_TRUE\fP 、そうでなければ \fBGRN_FALSE\fP 。 .UNINDENT .UNINDENT .SS \fBgrn_db\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .sp TODO... .INDENT 0.0 .TP .B grn_db TODO... .UNINDENT .INDENT 0.0 .TP .B grn_db_create_optarg \fI\%grn_db_create()\fP のオプションを指定するために使います。 .UNINDENT .INDENT 0.0 .TP .B char **grn_db_create_optarg.builtin_type_names 組み込み型の名前となるnul終端文字列の配列を指定する。 .UNINDENT .INDENT 0.0 .TP .B int grn_db_create_optarg.n_builtin_type_names n_builtin_type_namesには、optarg.builtin_type_namesで指定する文字列の数を 指定する。配列のoffsetはenum型grn_builtin_typeの値に対応する。 .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_db_create(grn_ctx\fI\ *ctx\fP, const char\fI\ *path\fP, grn_db_create_optarg\fI\ *optarg\fP) 新たなdbを作成します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- 初期化済みの \fBgrn_ctx\fP を指定します。 .IP \(bu 2 \fBpath\fP \-\- 作成するdbを格納するファイルパスを指定します。NULLならtemporary dbとなります。NULL以外のパスを指定した場合はpersistent dbとなります。 .IP \(bu 2 \fBoptarg\fP \-\- .sp Currently, it is not used. It is just ignored. .sp 作成するdbの組み込み型の名前を変更する時に指定します。 .sp optarg.builtin_type_namesには、組み込み型の名前となるnull終端文字列の配列を指定します。optarg.n_builtin_type_namesには、optarg.builtin_type_namesで指定する文字列の数を指定します。配列のoffsetはenum型grn_builtin_typeの値に対応します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_db_open(grn_ctx\fI\ *ctx\fP, const char\fI\ *path\fP) 既存のdbを開きます。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBpath\fP \-\- 開こうとするdbを格納するファイルパスを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B void grn_db_touch(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *db\fP) dbの内容の最終更新時刻を現在時刻にします。 .sp 最終更新時刻はキャッシュが有効かどうかの判断などに利用されます。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBdb\fP \-\- 内容が変更されたdbを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_obj_db(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP) objの属するdbを返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_db_recover(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *db\fP) .sp \fB注釈:\fP .INDENT 7.0 .INDENT 3.5 これは実験的なAPIです。 .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 7.0 .INDENT 3.5 This is a dangerous API. You must not use this API when other thread or process opens the target database. If you use this API against shared database, the database may be broken. .UNINDENT .UNINDENT .sp バージョン 4.0.9 で追加. .sp Checks the passed database and recovers it if it is broken and it can be recovered. .sp This API uses lock existence for checking whether the database is broken or not. .sp 以下は復旧可能なケースです。 .INDENT 7.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 Index column is broken. The index column must have source column. .UNINDENT .UNINDENT .UNINDENT .sp 以下は復旧できないケースです。 .INDENT 7.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 Object name management feature is broken. .IP \(bu 2 Table is broken. .IP \(bu 2 Data column is broken. .UNINDENT .UNINDENT .UNINDENT .sp Object name management feature is used for managing table name, column name and so on. If the feature is broken, the database can\(aqt be recovered. Please re\-create the database from backup. .sp Table and data column can be recovered by removing an existence lock and re\-add data. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBdb\fP \-\- 復旧対象のデータベース。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_db_unmap(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *db\fP) .sp \fB注釈:\fP .INDENT 7.0 .INDENT 3.5 これは実験的なAPIです。 .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 7.0 .INDENT 3.5 This is a thread unsafe API. You can\(aqt touch the database while this API is running. .UNINDENT .UNINDENT .sp バージョン 5.0.7 で追加. .sp Unmaps all opened tables and columns in the passed database. Resources used by these opened tables and columns are freed. .sp Normally, this API isn\(aqt useless. Because resources used by opened tables and columns are managed by OS automatically. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBdb\fP \-\- 復旧対象のデータベース。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .SS \fBgrn_encoding\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_encoding TODO... .UNINDENT .INDENT 0.0 .TP .B grn_encoding grn_get_default_encoding(void) デフォルトのencodingを返します。 .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_set_default_encoding(grn_encoding\fI\ encoding\fP) デフォルトのencodingを変更します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBencoding\fP \-\- 変更後のデフォルトのencodingを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B const char *grn_encoding_to_string(grn_encoding\fI\ encoding\fP) エンコーディングの形式を文字列で返します。たとえば\(aqgrn_encoding_to_string(\fBGRN_ENC_UTF8\fP)\(aq は"utf8"を返します。 .sp 無効なエンコーディングの場合は"unknown"を返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBencoding\fP \-\- その時点のエンコーディング。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_encoding grn_encoding_parse(const char\fI\ *name\fP) エンコーディング名をパースし、grn_encodingを返します。たとえば、\(aqgrn_encoding_parse("UTF8")\(aq は\(aq\fBGRN_ENC_UTF8\fP\(aqを返します。 .sp \fBGRN_ENC_UTF8\fP は無効なエンコーディング名が与えた時に返されます。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBname\fP \-\- エンコーディング名。 .UNINDENT .UNINDENT .UNINDENT .SS grn_expr .sp \fIgrn_expr\fP は「式」を表現した \fBgrn_obj\fP です。以下は式が何をできるかのリストです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 式は \fI\%grn_expr_exec()\fP を使うと1つのレコードに複数の操作を適用できます。 .IP \(bu 2 式は検索条件を表現できます。 \fBgrn_table_select()\fP を使うと、式で表現した検索条件にマッチしたレコードだけを選択できます。 .UNINDENT .UNINDENT .UNINDENT .sp 文字列を式で表現する手段は2種類あります。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB/reference/grn_expr/query_syntax\fP .IP \(bu 2 \fB/reference/grn_expr/script_syntax\fP .UNINDENT .UNINDENT .UNINDENT .sp \fBgrn_expr_parse()\fP は式の文字列表現をパースし、パースした式を別の式に追加します。 .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B GRN_API grn_obj *grn_expr_create(grn_ctx\fI\ *ctx\fP, const char\fI\ *name\fP, unsigned int\fI\ name_size\fP) .UNINDENT .INDENT 0.0 .TP .B GRN_API grn_rc grn_expr_close(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *expr\fP) .UNINDENT .INDENT 0.0 .TP .B GRN_API grn_obj *grn_expr_add_var(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *expr\fP, const char\fI\ *name\fP, unsigned int\fI\ name_size\fP) .UNINDENT .INDENT 0.0 .TP .B GRN_API grn_obj *grn_expr_get_var_by_offset(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *expr\fP, unsigned int\fI\ offset\fP) .UNINDENT .INDENT 0.0 .TP .B GRN_API grn_obj *grn_expr_append_obj(grn_ctx *ctx, grn_obj *expr, grn_obj *obj, grn_operator op, int nargs); .UNINDENT .INDENT 0.0 .TP .B GRN_API grn_obj *grn_expr_append_const(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *expr\fP, grn_obj\fI\ *obj\fP, grn_operator\fI\ op\fP, int\fI\ nargs\fP) .UNINDENT .INDENT 0.0 .TP .B GRN_API grn_obj *grn_expr_append_const_str(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *expr\fP, const char\fI\ *str\fP, unsigned int\fI\ str_size\fP, grn_operator\fI\ op\fP, int\fI\ nargs\fP) .UNINDENT .INDENT 0.0 .TP .B GRN_API grn_obj *grn_expr_append_const_int(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *expr\fP, int\fI\ i\fP, grn_operator\fI\ op\fP, int\fI\ nargs\fP) .UNINDENT .INDENT 0.0 .TP .B GRN_API grn_rc grn_expr_append_op(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *expr\fP, grn_operator\fI\ op\fP, int\fI\ nargs\fP) .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_expr_get_keywords(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *expr\fP, grn_obj\fI\ *keywords\fP) Extracts keywords from \fBexpr\fP and stores to \fBkeywords\fP\&. Keywords in \fBkeywords\fP are owned by \fBexpr\fP\&. Don\(aqt unlink them. Each keyword is \fBGRN_BULK\fP and its domain is \fBGRN_DB_TEXT\fP\&. .sp \fBkeywords\fP must be \fBGRN_PVECTOR\fP\&. .sp 以下はスキーマの例です。 .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C grn_obj keywords; GRN_PTR_INIT(&keywords, GRN_OBJ_VECTOR, GRN_ID_NIL); grn_expr_get_keywords(ctx, expr, &keywords); { int i, n_keywords; n_keywords = GRN_BULK_VSIZE(&keywords) / sizeof(grn_obj *); for (i = 0; i < n_keywords; i++) { grn_obj *keyword = GRN_PTR_VALUE_AT(&keywords, i); const char *keyword_content; int keyword_size; keyword_content = GRN_TEXT_VALUE(keyword); keyword_size = GRN_TEXT_LEN(keyword); /* Use keyword_content and keyword_size. You don\(aqt need to unlink keyword. keyword is owned by expr. */ } } GRN_OBJ_FIN(ctx, &keywords); .ft P .fi .UNINDENT .UNINDENT .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- The context that creates the \fBexpr\fP\&. .IP \(bu 2 \fBexpr\fP \-\- The expression to be extracted. .IP \(bu 2 \fBkeywords\fP \-\- .sp The container to store extracted keywords. It must be \fBGRN_PVECTOR\fP\&. .sp Each extracted keyword is \fBGRN_BULK\fP and its domain is \fBGRN_DB_TEXT\fP\&. .sp Extracted keywords are owned by \fBexpr\fP\&. Don\(aqt unlink them. .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_expr_syntax_escape(grn_ctx\fI\ *ctx\fP, const char\fI\ *string\fP, int\fI\ string_size\fP, const char\fI\ *target_characters\fP, char\fI\ escape_character\fP, grn_obj\fI\ *escaped_string\fP) \fBstring\fP 中の \fBtarget_characters\fP を \fBescape_character\fP でエスケープします。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- エンコーディングは \fBstring\fP と同じでなければいけません。 \fBescaped_string\fP 用のバッファを確保するために使います。 .IP \(bu 2 \fBstring\fP \-\- 文字列式表現 .IP \(bu 2 \fBstring_size\fP \-\- \fBstring\fP のバイトサイズです。 \fB\-1\fP を指定した場合は \fBstring\fP がNULL終端文字列であるという意味になります。 .IP \(bu 2 \fBtarget_characters\fP \-\- NULL終端されたエスケープ対象文字。たとえば、 \fB/reference/grn_expr/query_syntax\fP 用の \fBtarget_characters\fP は \fB"+\-><~*()\e"\e\e:"\fP になります。 .IP \(bu 2 \fBescape_character\fP \-\- \fBtarget_characters\fP の文字をエスケープする文字です。たとえば、 \fB/reference/grn_expr/query_syntax\fP 用の \fBescaped_character\fP は \fB\e\e\fP (バックスラッシュ)になります。 .IP \(bu 2 \fBescaped_string\fP \-\- エスケープされた \fBstring\fP の出力先です。テキスト型のbulkでなければいけません。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_expr_syntax_escape_query(grn_ctx\fI\ *ctx\fP, const char\fI\ *query\fP, int\fI\ query_size\fP, grn_obj\fI\ *escaped_query\fP) \fB/reference/grn_expr/query_syntax\fP にある特別な文字をエスケープします。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- このエンコーディングは \fBquery\fP のエンコーディングと同じでなければなりません。 \fBescaped_query\fP 用のバッファを確保するために使います。 .IP \(bu 2 \fBquery\fP \-\- \fB/reference/grn_expr/query_syntax\fP にある文字列式の表現。 .IP \(bu 2 \fBquery_size\fP \-\- \fBquery\fP のバイトサイズです。 \fB\-1\fP を指定した場合は \fBquery\fP がNULL終端文字列であるという意味になります。 .IP \(bu 2 \fBescaped_query\fP \-\- エスケープされた\(ga\(gaquery\(ga\(gaの出力。テキスト型用のbulkを返す。 .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B GRN_API grn_rc grn_expr_compile(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *expr\fP) .UNINDENT .INDENT 0.0 .TP .B GRN_API grn_obj *grn_expr_exec(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *expr\fP, int\fI\ nargs\fP) .UNINDENT .INDENT 0.0 .TP .B GRN_API grn_obj *grn_expr_alloc(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *expr\fP, grn_id\fI\ domain\fP, grn_obj_flags\fI\ flags\fP) .UNINDENT .SS \fBgrn_geo\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_geo_point .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_geo_select_in_rectangle(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *index\fP, grn_obj\fI\ *top_left_point\fP, grn_obj\fI\ *bottom_right_point\fP, grn_obj\fI\ *res\fP, grn_operator\fI\ op\fP) It selects records that are in the rectangle specified by top_left_point parameter and bottom_right_point parameter. Records are searched by index parameter. Found records are added to res parameter table with op parameter operation. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBindex\fP \-\- the index column for TokyoGeoPoint or WGS84GeoPpoint type. .IP \(bu 2 \fBtop_left_point\fP \-\- the top left point of the target rectangle. (ShortText, Text, LongText, TokyoGeoPoint or WGS84GeoPoint) .IP \(bu 2 \fBbottom_right_point\fP \-\- the bottom right point of the target rectangle. (ShortText, Text, LongText, TokyoGeoPoint or WGS84GeoPoint) .IP \(bu 2 \fBres\fP \-\- the table to store found record IDs. It must be \fBGRN_TABLE_HASH_KEY\fP type table. .IP \(bu 2 \fBop\fP \-\- the operator for matched records. .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_geo_estimate_in_rectangle(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *index\fP, grn_obj\fI\ *top_left_point\fP, grn_obj\fI\ *bottom_right_point\fP) It estimates number of records in the rectangle specified by top_left_point parameter and bottom_right_point parameter. Number of records is estimated by index parameter. If an error is occurred, \-1 is returned. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBindex\fP \-\- the index column for TokyoGeoPoint or WGS84GeoPpoint type. .IP \(bu 2 \fBtop_left_point\fP \-\- the top left point of the target rectangle. (ShortText, Text, LongText, TokyoGeoPoint or WGS84GeoPoint) .IP \(bu 2 \fBbottom_right_point\fP \-\- the bottom right point of the target rectangle. (ShortText, Text, LongText, TokyoGeoPoint or WGS84GeoPoint) .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_geo_cursor_open_in_rectangle(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *index\fP, grn_obj\fI\ *top_left_point\fP, grn_obj\fI\ *bottom_right_point\fP, int\fI\ offset\fP, int\fI\ limit\fP) It opens a cursor to get records in the rectangle specfied by top_left_point parameter and bottom_right_point parameter. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBindex\fP \-\- the index column for TokyoGeoPoint or WGS84GeoPpoint type. .IP \(bu 2 \fBtop_left_point\fP \-\- the top left point of the target rectangle. (ShortText, Text, LongText, TokyoGeoPoint or WGS84GeoPoint) .IP \(bu 2 \fBbottom_right_point\fP \-\- the bottom right point of the target rectangle. (ShortText, Text, LongText, TokyoGeoPoint or WGS84GeoPoint) .IP \(bu 2 \fBoffset\fP \-\- the cursor returns records from offset parameter position. offset parameter is based on 0. .IP \(bu 2 \fBlimit\fP \-\- the cursor returns at most limit parameter records. \-1 means no limit. .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_posting *grn_geo_cursor_next(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *cursor\fP) It returns the next posting that has record ID. It returns NULL after all records are returned. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBcursor\fP \-\- the geo cursor. .UNINDENT .UNINDENT .UNINDENT .SS \fBgrn_hook\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_hook_entry TODO... .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_add_hook(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_hook_entry\fI\ entry\fP, int\fI\ offset\fP, grn_obj\fI\ *proc\fP, grn_obj\fI\ *data\fP) objに対してhookを追加します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBentry\fP \-\- .sp \fBGRN_HOOK_GET\fP は、objectの参照時に呼び出されるhookを定義します。 .sp \fBGRN_HOOK_SET\fP は、objectの更新時に呼び出されるhookを定義します。 .sp \fBGRN_HOOK_SELECT\fP は、検索処理の実行中に適時呼び出され、処理の実行状況を調べたり、実行の中断を指示することができます。 .IP \(bu 2 \fBoffset\fP \-\- .sp hookの実行順位。offsetに対応するhookの直前に新たなhookを挿入します。 .sp 0を指定した場合は先頭に挿入されます。\-1を指定した場合は末尾に挿入されます。 .sp objectに複数のhookが定義されている場合は順位の順に呼び出されます。 .IP \(bu 2 \fBproc\fP \-\- 手続きを指定します。 .IP \(bu 2 \fBdata\fP \-\- hook固有情報を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_obj_get_nhooks(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_hook_entry\fI\ entry\fP) objに定義されているhookの数を返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBentry\fP \-\- hookタイプを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_obj_get_hook(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_hook_entry\fI\ entry\fP, int\fI\ offset\fP, grn_obj\fI\ *data\fP) objに定義されているhookの手続き(proc)を返します。hook固有情報が定義されている場合は、その内容をdataにコピーして返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBentry\fP \-\- hookタイプを指定します。 .IP \(bu 2 \fBoffset\fP \-\- 実行順位を指定します。 .IP \(bu 2 \fBdata\fP \-\- hook固有情報格納バッファを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_delete_hook(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_hook_entry\fI\ entry\fP, int\fI\ offset\fP) objに定義されているhookを削除します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBentry\fP \-\- hookタイプを指定します。 .IP \(bu 2 \fBoffset\fP \-\- 実行順位を指定します。 .UNINDENT .UNINDENT .UNINDENT .SS \fBgrn_ii\fP .SS 概要 .sp buffered index builder .sp 特定のアプリケーション用に準備した内部APIです。 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_ii .UNINDENT .INDENT 0.0 .TP .B grn_ii_buffer .UNINDENT .INDENT 0.0 .TP .B grn_ii_buffer *grn_ii_buffer_open(grn_ctx\fI\ *ctx\fP, grn_ii\fI\ *ii\fP, long long unsigned int\fI\ update_buffer_size\fP) .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_ii_buffer_append(grn_ctx\fI\ *ctx\fP, grn_ii_buffer\fI\ *ii_buffer\fP, grn_id\fI\ rid\fP, unsigned int\fI\ section\fP, grn_obj\fI\ *value\fP) .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_ii_buffer_commit(grn_ctx\fI\ *ctx\fP, grn_ii_buffer\fI\ *ii_buffer\fP) .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_ii_buffer_close(grn_ctx\fI\ *ctx\fP, grn_ii_buffer\fI\ *ii_buffer\fP) .UNINDENT .SS \fBgrn_index_cursor\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_obj *grn_index_cursor_open(grn_ctx\fI\ *ctx\fP, grn_table_cursor\fI\ *tc\fP, grn_obj\fI\ *index\fP, grn_id\fI\ rid_min\fP, grn_id\fI\ rid_max\fP, int\fI\ flags\fP) \fBgrn_table_cursor\fP から取得できるそれぞれのレコードについて、 \fBGRN_OBJ_COLUMN_INDEX\fP 型のカラムの値を順番に取り出すためのカーソルを生成して返します。 .sp rid_min, rid_maxを指定して取得するレコードidの値を制限することができます。 .sp 戻り値であるgrn_index_cursorは \fBgrn_obj_close()\fP を使って解放します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtc\fP \-\- 対象cursorを指定します。 .IP \(bu 2 \fBindex\fP \-\- 対象インデックスカラムを指定します。 .IP \(bu 2 \fBrid_min\fP \-\- 出力するレコードidの下限を指定します。 .IP \(bu 2 \fBrid_max\fP \-\- 出力するレコードidの上限を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_posting *grn_index_cursor_next(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *ic\fP, grn_id\fI\ *tid\fP) cursorの範囲内のインデックスの値を順番に取り出します。 .sp tidにNULL以外を指定した場合は、index_cursorを作成するときに指定したtable_cursorの現在の対象レコードのidを返します。 .sp 戻り値である \fBgrn_posting\fP 構造体は解放する必要はありません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBic\fP \-\- 対象cursorを指定します。 .IP \(bu 2 \fBtid\fP \-\- テーブルレコードIDを指定します。 .UNINDENT .UNINDENT .UNINDENT .SS \fBgrn_info\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_info_type TODO... .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_obj_get_info(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_info_type\fI\ type\fP, grn_obj\fI\ *valuebuf\fP) objのtypeに対応する情報をvaluebufに格納します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objを指定します。 .IP \(bu 2 \fBtype\fP \-\- 取得する情報の種類を指定します。 .IP \(bu 2 \fBvaluebuf\fP \-\- 値を格納するバッファ(呼出側で準備)を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_set_info(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_info_type\fI\ type\fP, grn_obj\fI\ *value\fP) objのtypeに対応する情報をvalueの内容に更新します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objを指定します。 .IP \(bu 2 \fBtype\fP \-\- 設定する情報の種類を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_obj_get_element_info(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_id\fI\ id\fP, grn_info_type\fI\ type\fP, grn_obj\fI\ *value\fP) objのidに対応するレコードの、typeに対応する情報をvaluebufに格納します。呼出側ではtypeに応じて十分なサイズのバッファを確保しなければいけません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objを指定します。 .IP \(bu 2 \fBid\fP \-\- 対象IDを指定します。 .IP \(bu 2 \fBtype\fP \-\- 取得する情報の種類を指定します。 .IP \(bu 2 \fBvalue\fP \-\- 値を格納するバッファ(呼出側で準備)を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_set_element_info(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_id\fI\ id\fP, grn_info_type\fI\ type\fP, grn_obj\fI\ *value\fP) objのidに対応するレコードのtypeに対応する情報をvalueの内容に更新します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBid\fP \-\- 対象IDを指定します。 .IP \(bu 2 \fBtype\fP \-\- 設定する情報の種類を指定します。 .IP \(bu 2 \fBvalue\fP \-\- 設定しようとする値を指定します。 .UNINDENT .UNINDENT .UNINDENT .SS \fBgrn_match_escalation\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B long long int grn_ctx_get_match_escalation_threshold(grn_ctx\fI\ *ctx\fP) 検索の挙動をエスカレーションする閾値を返します。エスカレーションの詳細は検索の仕様に関するドキュメントを参照してください。 .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_ctx_set_match_escalation_threshold(grn_ctx\fI\ *ctx\fP, long long int\fI\ threshold\fP) 検索の挙動をエスカレーションする閾値を変更します。エスカレーションの詳細は検索の仕様に関するドキュメントを参照してください。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBthreshold\fP \-\- 変更後の検索の挙動をエスカレーションする閾値を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B long long int grn_get_default_match_escalation_threshold(void) デフォルトの検索の挙動をエスカレーションする閾値を返します。エスカレーションの詳細は検索の仕様に関するドキュメントを参照してください。 .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_set_default_match_escalation_threshold(long long int\fI\ threshold\fP) デフォルトの検索の挙動をエスカレーションする閾値を変更します。エスカレーションの詳細は詳細は検索の仕様に関するドキュメントを参照してください。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBthreshold\fP \-\- 変更後のデフォルトの検索の挙動をエスカレーションする閾値を指定します。 .UNINDENT .UNINDENT .UNINDENT .SS \fBgrn_obj\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_obj TODO... .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_obj_column(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, const char\fI\ *name\fP, unsigned int\fI\ name_size\fP) nameがカラム名の場合、それに対応するtableのカラムを返します。対応するカラムが存在しなければNULLを返します。 .sp nameはアクセサ文字列の場合、それに対応するaccessorを返します。アクセサ文字列とは、カラム名等を\(aq.\(aqで連結した文字列です。\(aq_id\(aq, \(aq_key\(aqは特殊なアクセサで、それぞれレコードID/keyを返します。例) \(aqcol1\(aq / \(aqcol2.col3\(aq / \(aqcol2._id\(aq .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBname\fP \-\- カラム名を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_bool grn_obj_is_builtin(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP) Check whether Groonga built\-in object. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- context .IP \(bu 2 \fBobj\fP \-\- target object .UNINDENT .TP .B 戻り値 \fBGRN_TRUE\fP for built\-in groonga object, \fBGRN_FALSE\fP otherwise. .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_obj_get_value(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_id\fI\ id\fP, grn_obj\fI\ *value\fP) objのIDに対応するレコードのvalueを取得します。valueを戻り値として返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBid\fP \-\- 対象レコードのIDを指定します。 .IP \(bu 2 \fBvalue\fP \-\- 値を格納するバッファ(呼出側で準備する)を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_obj_get_values(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_id\fI\ offset\fP, void\fI\ **values\fP) objに指定されたカラムについて、offsetに指定されたレコードIDを開始位置として、IDが連続するレコードに対応するカラム値が昇順に格納された配列へのポインタをvaluesにセットします。 .sp 取得できた件数が戻り値として返されます。エラーが発生した場合は \-1 が返されます。 .sp \fB注釈:\fP .INDENT 7.0 .INDENT 3.5 値が固定長であるカラムのみがobjに指定できます。範囲内のIDに対応するレコードが有効であるとは限りません。delete操作を実行したことのあるテーブルに対しては、\fBgrn_table_at()\fP などによって各レコードの存否を別途確認しなければなりません。 .UNINDENT .UNINDENT .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBoffset\fP \-\- 値を取得する範囲の開始位置となるレコードIDを指定します。 .IP \(bu 2 \fBvalues\fP \-\- 値の配列がセットされます。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_set_value(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_id\fI\ id\fP, grn_obj\fI\ *value\fP, int\fI\ flags\fP) objのIDに対応するレコードの値を更新します。対応するレコードが存在しない場合は \fBGRN_INVALID_ARGUMENT\fP を返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBid\fP \-\- 対象レコードのIDを指定します。 .IP \(bu 2 \fBvalue\fP \-\- 格納する値を指定します。 .IP \(bu 2 \fBflags\fP \-\- .sp 以下の値を指定できます。 .INDENT 2.0 .INDENT 2.0 .IP \(bu 2 \fI\%GRN_OBJ_SET\fP .IP \(bu 2 \fI\%GRN_OBJ_INCR\fP .IP \(bu 2 \fI\%GRN_OBJ_DECR\fP .UNINDENT .INDENT 2.0 .IP \(bu 2 \fI\%GRN_OBJ_APPEND\fP .IP \(bu 2 \fI\%GRN_OBJ_PREPEND\fP .IP \(bu 2 \fI\%GRN_OBJ_GET\fP .UNINDENT .INDENT 2.0 .IP \(bu 2 \fI\%GRN_OBJ_COMPARE\fP .IP \(bu 2 \fI\%GRN_OBJ_LOCK\fP .IP \(bu 2 \fI\%GRN_OBJ_UNLOCK\fP .UNINDENT .UNINDENT .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B GRN_OBJ_SET_MASK .UNINDENT .INDENT 0.0 .TP .B GRN_OBJ_SET レコードの値をvalueと置き換えます。 .UNINDENT .INDENT 0.0 .TP .B GRN_OBJ_INCR レコードの値にvalueを加算します。 .UNINDENT .INDENT 0.0 .TP .B GRN_OBJ_DECR レコードの値にvalueを減算します。 .UNINDENT .INDENT 0.0 .TP .B GRN_OBJ_APPEND レコードの値の末尾にvalueを追加します。 .UNINDENT .INDENT 0.0 .TP .B GRN_OBJ_PREPEND レコードの値の先頭にvalueを追加します。 .UNINDENT .INDENT 0.0 .TP .B GRN_OBJ_GET 新しいレコードの値をvalueにセットします。 .UNINDENT .INDENT 0.0 .TP .B GRN_OBJ_COMPARE レコードの値とvalueが等しいか調べます。 .UNINDENT .INDENT 0.0 .TP .B GRN_OBJ_LOCK 当該レコードをロックします。\fI\%GRN_OBJ_COMPARE\fP と共に指定された場合は、レコードの値とvalueが等しい場合に限ってロックします。 .UNINDENT .INDENT 0.0 .TP .B GRN_OBJ_UNLOCK 当該レコードのロックを解除します。 .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_remove(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP) objをメモリから解放し、それが永続オブジェクトであった場合は、該当するファイル一式を削除します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_rename(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, const char\fI\ *name\fP, unsigned int\fI\ name_size\fP) ctxが使用するdbにおいてobjに対応する名前をnameに更新します。objは永続オブジェクトでなければいけません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBname\fP \-\- 新しい名前を指定します。 .IP \(bu 2 \fBname_size\fP \-\- nameパラメータのsize(byte)を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_close(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP) 一時的なobjectであるobjをメモリから解放します。objに属するobjectも再帰的にメモリから解放されます。 .sp 永続的な、table, column, exprなどは解放してはいけません。一般的には、一時的か永続的かを気にしなくてよい \fI\%grn_obj_unlink()\fP を用いるべきです。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_reinit(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_id\fI\ domain\fP, unsigned char\fI\ flags\fP) objの型を変更します。 .sp objは \fBGRN_OBJ_INIT()\fP マクロなどで初期化済みでなければいけません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBdomain\fP \-\- 変更後のobjの型を指定します。 .IP \(bu 2 \fBflags\fP \-\- \fBGRN_OBJ_VECTOR\fP を指定するとdomain型の値のベクタを格納するオブジェクトになります。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B void grn_obj_unlink(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP) objをメモリから解放します。objに属するobjectも再帰的にメモリから解放されます。 .UNINDENT .INDENT 0.0 .TP .B const char *grn_obj_path(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP) objに対応するファイルパスを返します。一時objectならNULLを返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_obj_name(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, char\fI\ *namebuf\fP, int\fI\ buf_size\fP) objの名前の長さを返します。無名objectなら0を返します。 .sp 名前付きのobjectであり、buf_sizeの長さが名前の長以上であった場合は、namebufに該当する名前をコピーします。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBnamebuf\fP \-\- 名前を格納するバッファ(呼出側で準備する)を指定します。 .IP \(bu 2 \fBbuf_size\fP \-\- namebufのサイズ(byte長)を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_id grn_obj_get_range(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP) objパラメータのとる値の範囲を表わしているオブジェクトのIDを返します。例えば、\fBgrn_builtin_type\fP にある \fBGRN_DB_INT\fP などを返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_obj_expire(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, int\fI\ threshold\fP) objの占有するメモリのうち、可能な領域をthresholdを指標として解放します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_obj_check(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP) objに対応するファイルの整合性を検査します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_lock(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_id\fI\ id\fP, int\fI\ timeout\fP) objをlockします。timeout(秒)経過してもlockを取得できない場合は \fBGRN_RESOURCE_DEADLOCK_AVOIDED\fP を返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_unlock(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_id\fI\ id\fP) objをunlockします。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_clear_lock(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP) 強制的にロックをクリアします。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B unsigned int grn_obj_is_locked(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP) objが現在lockされていれば0以外の値を返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_obj_defrag(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, int\fI\ threshold\fP) objの占有するDBファイル領域のうち、可能な領域をthresholdを指標としてフラグメントの解消を行います。 .sp フラグメント解消が実行されたセグメントの数を返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_id grn_obj_id(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP) objのidを返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_delete_by_id(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *db\fP, grn_id\fI\ id\fP, grn_bool\fI\ removep\fP) dbからidに対応するテーブルやカラムなどを削除します。mroonga向けに用意した内部APIです。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBdb\fP \-\- The target database. .IP \(bu 2 \fBid\fP \-\- The object (table, column and so on) ID to be deleted. .IP \(bu 2 \fBremovep\fP \-\- If \fBGRN_TRUE\fP, clear object cache and remove relation between ID and key in database. Otherwise, just clear object cache. .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_path_by_id(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *db\fP, grn_id\fI\ id\fP, char\fI\ *buffer\fP) dbのidに対応するpathを返します。mroonga向けに用意した内部APIです。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBdb\fP \-\- The target database. .IP \(bu 2 \fBid\fP \-\- The object (table, column and so on) ID to be deleted. .IP \(bu 2 \fBbuffer\fP \-\- path string corresponding to the id will be set in this buffer. .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_cast_by_id(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *source\fP, grn_obj\fI\ *destination\fP, grn_bool\fI\ add_record_if_not_exist\fP) It casts value of \fBsource\fP to value with type of \fBdestination\fP\&. Casted value is appended to \fBdestination\fP\&. .sp Both \fBsource\fP and \fBdestination\fP must be bulk. .sp If \fBdestination\fP is a reference type bulk. (Reference type bulk means that type of \fBdestination\fP is a table.) \fBadd_record_if_not_exist\fP is used. If \fBsource\fP value doesn\(aqt exist in the table that is a type of \fBdestination\fP\&. The \fBsource\fP value is added to the table. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBctx\fP \-\- その時点のコンテキスト。 .IP \(bu 2 \fBsource\fP \-\- The bulk to be casted. .IP \(bu 2 \fBdestination\fP \-\- The bulk to specify cast target type and store casted value. .IP \(bu 2 \fBadd_record_if_not_exist\fP \-\- Whether adding a new record if \fBsource\fP value doesn\(aqt exist in cast target table. This parameter is only used when \fBdestination\fP is a reference type bulk. .UNINDENT .TP .B 戻り値 成功時は \fBGRN_SUCCESS\fP 、エラー時は \fBGRN_SUCCESS\fP 以外。 .UNINDENT .UNINDENT .SS \fBgrn_proc\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_proc_type TODO... .UNINDENT .INDENT 0.0 .TP .B grn_proc_func TODO... .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_proc_create(grn_ctx\fI\ *ctx\fP, const char\fI\ *name\fP, int\fI\ name_size\fP, grn_proc_type\fI\ type\fP, grn_proc_func\fI\ *init\fP, grn_proc_func\fI\ *next\fP, grn_proc_func\fI\ *fin\fP, unsigned int\fI\ nvars\fP, grn_expr_var\fI\ *vars\fP) nameに対応する新たなproc(手続き)をctxが使用するdbに定義します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBname\fP \-\- 作成するprocの名前を指定します。 .IP \(bu 2 \fBname_size\fP \-\- The number of bytes of name parameter. If negative value is specified, name parameter is assumed that NULL\-terminated string. .IP \(bu 2 \fBtype\fP \-\- procの種類を指定します。 .IP \(bu 2 \fBinit\fP \-\- 初期化関数のポインタを指定します。 .IP \(bu 2 \fBnext\fP \-\- 実処理関数のポインタを指定します。 .IP \(bu 2 \fBfin\fP \-\- 終了関数のポインタを指定します。 .IP \(bu 2 \fBnvars\fP \-\- procで使用する変数の数を指定します。 .IP \(bu 2 \fBvars\fP \-\- procで使用する変数の定義を指定します。( \fBgrn_expr_var\fP 構造体の配列) .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_proc_get_info(grn_ctx\fI\ *ctx\fP, grn_user_data\fI\ *user_data\fP, grn_expr_var\fI\ **vars\fP, unsigned int\fI\ *nvars\fP, grn_obj\fI\ **caller\fP) user_dataをキーとして、現在実行中の \fI\%grn_proc_func\fP 関数および定義されている変数( \fBgrn_expr_var\fP )の配列とその数を取得します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBuser_data\fP \-\- \fI\%grn_proc_func\fP に渡されたuser_dataを指定します。 .IP \(bu 2 \fBnvars\fP \-\- 変数の数を取得します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_set_finalizer(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_proc_func\fI\ *func\fP) objectを破棄するときに呼ばれる関数を設定します。 .sp table, column, proc, exprのみ設定可能です。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .IP \(bu 2 \fBfunc\fP \-\- objectを破棄するときに呼ばれる関数を指定します。 .UNINDENT .UNINDENT .UNINDENT .SS \fBgrn_search\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_search_optarg .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_obj_search(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP, grn_obj\fI\ *query\fP, grn_obj\fI\ *res\fP, grn_operator\fI\ op\fP, grn_search_optarg\fI\ *optarg\fP) objを対象としてqueryにマッチするレコードを検索し、opの指定に従ってresにレコードを追加あるいは削除します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 検索対象のobjectを指定します。 .IP \(bu 2 \fBquery\fP \-\- 検索クエリを指定します。 .IP \(bu 2 \fBres\fP \-\- 検索結果を格納するテーブルを指定します。 .IP \(bu 2 \fBop\fP \-\- \fBGRN_OP_OR\fP, \fBGRN_OP_AND\fP, \fBGRN_OP_AND_NOT\fP, \fBGRN_OP_ADJUST\fP のいずれかを指定します。 .IP \(bu 2 \fBoptarg\fP \-\- 詳細検索条件を指定します。 .UNINDENT .UNINDENT .UNINDENT .SS \fBgrn_table\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_obj *grn_table_create(grn_ctx\fI\ *ctx\fP, const char\fI\ *name\fP, unsigned int\fI\ name_size\fP, const char\fI\ *path\fP, grn_obj_flags\fI\ flags\fP, grn_obj\fI\ *key_type\fP, grn_obj\fI\ *value_type\fP) nameパラメータに対応する新たなtableをctxが使用するdbに定義します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBname\fP \-\- .sp 作成するtableの名前を指定します。NULLなら無名tableとなります。 .sp persistent dbに対して名前をありのtableを作成するときには、flagsに \fBGRN_OBJ_PERSISTENT\fP が指定されていなけれなりません。 .IP \(bu 2 \fBpath\fP \-\- 作成するtableのファイルパスを指定します。 flagsに \fBGRN_OBJ_PERSISTENT\fP が指定されている場合のみ有効です。 NULLなら自動的にファイルパスが付与されます。 .IP \(bu 2 \fBflags\fP \-\- .sp \fBGRN_OBJ_PERSISTENT\fP を指定すると永続tableとなります。 .sp \fBGRN_OBJ_TABLE_PAT_KEY\fP, \fBGRN_OBJ_TABLE_HASH_KEY\fP, \fBGRN_OBJ_TABLE_NO_KEY\fP のいずれかを指定します。 .sp \fBGRN_OBJ_KEY_NORMALIZE\fP を指定すると正規化された文字列がkeyとなります。 .sp \fBGRN_OBJ_KEY_WITH_SIS\fP を指定するとkey文字列の全suffixが自動的に登録されます。 .IP \(bu 2 \fBkey_type\fP \-\- .sp keyの型を指定します。\fBGRN_OBJ_TABLE_NO_KEY\fP が指定された場合は無効です。 既存のtypeあるいはtableを指定できます。 .sp key_typeにtable Aを指定してtable Bを作成した場合、Bは必ずAのサブセットとなります。 .IP \(bu 2 \fBvalue_type\fP \-\- keyに対応する値を格納する領域の型を指定します。 tableはcolumnとは別に、keyに対応する値を格納する領域を一つだけ持つことができます。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_id grn_table_add(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, const void\fI\ *key\fP, unsigned int\fI\ key_size\fP, int\fI\ *added\fP) keyに対応する新しいrecordをtableに追加し、そのIDを返します。keyに対応するrecordがすでにtableに存在するならば、そのrecordのIDを返します。 .sp \fBGRN_OBJ_TABLE_NO_KEY\fP が指定されたtableでは、key, key_size は無視されます。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBkey\fP \-\- 検索keyを指定します。 .IP \(bu 2 \fBadded\fP \-\- NULL以外の値が指定された場合、新たにrecordが追加された時には1が、既存recordだった時には0がセットされます。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_id grn_table_get(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, const void\fI\ *key\fP, unsigned int\fI\ key_size\fP) It finds a record that has key parameter and returns ID of the found record. If table parameter is a database, it finds an object (table, column and so on) that has key parameter and returns ID of the found object. .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- The table or database. .IP \(bu 2 \fBkey\fP \-\- The record or object key to be found. .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_id grn_table_at(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, grn_id\fI\ id\fP) tableにidに対応するrecordが存在するか確認し、存在すれば指定されたIDを、存在しなければ \fBGRN_ID_NIL\fP を返します。 .sp 注意: 実行には相応のコストがかかるのであまり頻繁に呼ばないようにして下さい。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBid\fP \-\- 検索idを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_id grn_table_lcp_search(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, const void\fI\ *key\fP, unsigned int\fI\ key_size\fP) tableが \fBGRN_TABLE_PAT_KEY\fP もしくは \fBGRN_TABLE_DAT_KEY\fP を指定して作ったtableなら、longest common prefix searchを行い、対応するIDを返します。 .sp tableが \fBGRN_TABLE_HASH_KEY\fP を指定して作ったtableなら、完全に一致するキーを検索し、対応するIDを返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBkey\fP \-\- 検索keyを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_table_get_key(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, grn_id\fI\ id\fP, void\fI\ *keybuf\fP, int\fI\ buf_size\fP) tableのIDに対応するレコードのkeyを取得します。 .sp 対応するレコードが存在する場合はkey長を返します。見つからない場合は0を返します。対応するキーの検索に成功し、またbuf_sizeの長さがkey長以上であった場合は、keybufに該当するkeyをコピーします。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBid\fP \-\- 対象レコードのIDを指定します。 .IP \(bu 2 \fBkeybuf\fP \-\- keyを格納するバッファ(呼出側で準備する)を指定します。 .IP \(bu 2 \fBbuf_size\fP \-\- keybufのサイズ(byte長)を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_table_delete(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, const void\fI\ *key\fP, unsigned int\fI\ key_size\fP) tableのkeyに対応するレコードを削除します。対応するレコードが存在しない場合は \fBGRN_INVALID_ARGUMENT\fP を返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBkey\fP \-\- 検索keyを指定します。 .IP \(bu 2 \fBkey_size\fP \-\- 検索keyのサイズを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_table_delete_by_id(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, grn_id\fI\ id\fP) tableのidに対応するレコードを削除します。対応するレコードが存在しない場合は \fBGRN_INVALID_ARGUMENT\fP を返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBid\fP \-\- レコードIDを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_table_update_by_id(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, grn_id\fI\ id\fP, const void\fI\ *dest_key\fP, unsigned int\fI\ dest_key_size\fP) tableのidに対応するレコードのkeyを変更します。新しいkeyとそのbyte長をdest_keyとdest_key_sizeに指定します。 .sp この操作は、\fBGRN_TABLE_DAT_KEY\fP 型のテーブルのみ使用できます。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBid\fP \-\- レコードIDを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_table_update(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, const void\fI\ *src_key\fP, unsigned int\fI\ src_key_size\fP, const void\fI\ *dest_key\fP, unsigned int\fI\ dest_key_size\fP) tableのsrc_keyに対応するレコードのkeyを変更します。新しいkeyとそのbyte長をdest_keyとdest_key_sizeに指定します。 .sp この操作は、\fBGRN_TABLE_DAT_KEY\fP 型のテーブルのみ使用できます。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBsrc_key\fP \-\- 対象レコードのkeyを指定します。 .IP \(bu 2 \fBsrc_key_size\fP \-\- 対象レコードのkeyの長さ(byte)を指定します。 .IP \(bu 2 \fBdest_key\fP \-\- 変更後のkeyを指定します。 .IP \(bu 2 \fBdest_key_size\fP \-\- 変更後のkeyの長さ(byte)を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_table_truncate(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP) tableの全レコードを一括して削除します。 .sp 注意: multithread環境では他のthreadのアクセスによって、存在しないアドレスへアクセスし、SIGSEGVが発生する可能性があります。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_table_sort_key TODO... .UNINDENT .INDENT 0.0 .TP .B grn_table_sort_flags TODO... .UNINDENT .INDENT 0.0 .TP .B int grn_table_sort(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, int\fI\ offset\fP, int\fI\ limit\fP, grn_obj\fI\ *result\fP, grn_table_sort_key\fI\ *keys\fP, int\fI\ n_keys\fP) table内のレコードをソートし、上位limit個の要素をresultに格納します。 .sp keys.keyには、tableのcolumn,accessor,procのいずれかが指定できます。keys.flagsには、\fBGRN_TABLE_SORT_ASC\fP / \fBGRN_TABLE_SORT_DESC\fP のいずれかを指定できます。\fBGRN_TABLE_SORT_ASC\fP では昇順、\fBGRN_TABLE_SORT_DESC\fP では降順でソートされます。keys.offsetは、内部利用のためのメンバです。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBoffset\fP \-\- sortされたレコードのうち、(0ベースで)offset番目から順にresにレコードを格納します。 .IP \(bu 2 \fBlimit\fP \-\- resに格納するレコードの上限を指定します。 .IP \(bu 2 \fBresult\fP \-\- 結果を格納するtableを指定します。 .IP \(bu 2 \fBkeys\fP \-\- ソートキー配列へのポインタを指定します。 .IP \(bu 2 \fBn_keys\fP \-\- ソートキー配列のサイズを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_table_group_result TODO... .UNINDENT .INDENT 0.0 .TP .B grn_table_group_flags TODO... .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_table_group(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, grn_table_sort_key\fI\ *keys\fP, int\fI\ n_keys\fP, grn_table_group_result\fI\ *results\fP, int\fI\ n_results\fP) tableのレコードを特定の条件でグループ化します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBkeys\fP \-\- group化キー構造体の配列へのポインタを指定します。 .IP \(bu 2 \fBn_keys\fP \-\- group化キー構造体の配列のサイズを指定します。 .IP \(bu 2 \fBresults\fP \-\- group化の結果を格納する構造体の配列へのポインタを指定します。 .IP \(bu 2 \fBn_results\fP \-\- group化の結果を格納する構造体の配列のサイズを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_table_setoperation(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table1\fP, grn_obj\fI\ *table2\fP, grn_obj\fI\ *res\fP, grn_operator\fI\ op\fP) table1とtable2をopの指定に従って集合演算した結果をresに格納します。 .sp resにtable1あるいはtable2そのものを指定した場合を除けば、table1, table2は破壊されません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable1\fP \-\- 対象table1を指定します。 .IP \(bu 2 \fBtable2\fP \-\- 対象table2を指定します。 .IP \(bu 2 \fBres\fP \-\- 結果を格納するtableを指定します。 .IP \(bu 2 \fBop\fP \-\- 実行する演算の種類を指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_table_difference(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table1\fP, grn_obj\fI\ *table2\fP, grn_obj\fI\ *res1\fP, grn_obj\fI\ *res2\fP) table1とtable2から重複するレコードを取り除いた結果をそれぞれres1, res2に格納します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable1\fP \-\- 対象table1を指定します。 .IP \(bu 2 \fBtable2\fP \-\- 対象table2を指定します。 .IP \(bu 2 \fBres1\fP \-\- 結果を格納するtableを指定します。 .IP \(bu 2 \fBres2\fP \-\- 結果を格納するtableを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_table_columns(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, const char\fI\ *name\fP, unsigned int\fI\ name_size\fP, grn_obj\fI\ *res\fP) nameパラメータから始まるtableのカラムIDをresパラメータに格納します。name_sizeパラメータが0の場合はすべてのカラムIDを格納します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBname\fP \-\- 取得したいカラム名のprefixを指定します。 .IP \(bu 2 \fBname_size\fP \-\- nameパラメータの長さを指定します。 .IP \(bu 2 \fBres\fP \-\- 結果を格納する \fBGRN_TABLE_HASH_KEY\fP のtableを指定します。 .UNINDENT .TP .B 戻り値 格納したカラムIDの数を返します。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B unsigned int grn_table_size(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP) tableに登録されているレコードの件数を返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_table_rename(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, const char\fI\ *name\fP, unsigned int\fI\ name_size\fP) ctxが使用するdbにおいてtableに対応する名前をnameに更新します。tableの全てのcolumnも同時に名前が変更されます。tableは永続オブジェクトでなければいけません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBname_size\fP \-\- nameパラメータのsize(byte)を指定します。 .UNINDENT .UNINDENT .UNINDENT .SS \fBgrn_table_cursor\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_table_cursor TODO... .UNINDENT .INDENT 0.0 .TP .B grn_table_cursor *grn_table_cursor_open(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *table\fP, const void\fI\ *min\fP, unsigned int\fI\ min_size\fP, const void\fI\ *max\fP, unsigned int\fI\ max_size\fP, int\fI\ offset\fP, int\fI\ limit\fP, int\fI\ flags\fP) tableに登録されているレコードを順番に取り出すためのカーソルを生成して返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtable\fP \-\- 対象tableを指定します。 .IP \(bu 2 \fBmin\fP \-\- keyの下限を指定します。(NULLは下限なしと見なします。) \fBGRN_CURSOR_PREFIX\fP については後述。 .IP \(bu 2 \fBmin_size\fP \-\- minのsizeを指定します。\fBGRN_CURSOR_PREFIX\fP については後述。 .IP \(bu 2 \fBmax\fP \-\- keyの上限を指定します。(NULLは上限なしと見なします。) \fBGRN_CURSOR_PREFIX\fP については後述。 .IP \(bu 2 \fBmax_size\fP \-\- maxのsizeを指定します。\fBGRN_CURSOR_PREFIX\fP については無視される場合があります。 .IP \(bu 2 \fBflags\fP \-\- .sp \fBGRN_CURSOR_ASCENDING\fP を指定すると昇順にレコードを取り出します。 .sp \fBGRN_CURSOR_DESCENDING\fP を指定すると降順にレコードを取り出します。(下記 \fBGRN_CURSOR_PREFIX\fP を指定し、keyが近いレコードを取得する場合、もしくは、common prefix searchを行う場合には、\fBGRN_CURSOR_ASCENDING\fP / \fBGRN_CURSOR_DESCENDING\fP は無視されます。) .sp \fBGRN_CURSOR_GT\fP を指定するとminに一致したkeyをcursorの範囲に含みません。(minがNULLの場合もしくは、下記 \fBGRN_CURSOR_PREFIX\fP を指定し、keyが近いレコードを取得する場合、もしくは、common prefix searchを行う場合には、\fBGRN_CURSOR_GT\fP は無視されます。) .sp \fBGRN_CURSOR_LT\fP を指定するとmaxに一致したkeyをcursorの範囲に含みません。(maxがNULLの場合もしくは、下記 \fBGRN_CURSOR_PREFIX\fP を指定した場合には、\fBGRN_CURSOR_LT\fP は無視されます。) .sp \fBGRN_CURSOR_BY_ID\fP を指定するとID順にレコードを取り出します。(下記 \fBGRN_CURSOR_PREFIX\fP を指定した場合には、\fBGRN_CURSOR_BY_ID\fP は無視されます。) \fBGRN_OBJ_TABLE_PAT_KEY\fP を指定したtableについては、\fBGRN_CURSOR_BY_KEY\fP を指定するとkey順にレコードを取り出します。( \fBGRN_OBJ_TABLE_HASH_KEY\fP , \fBGRN_OBJ_TABLE_NO_KEY\fP を指定したテーブルでは \fBGRN_CURSOR_BY_KEY\fP は無視されます。) .sp \fBGRN_CURSOR_PREFIX\fP を指定すると、 \fBGRN_OBJ_TABLE_PAT_KEY\fP を指定したテーブルに関する下記のレコードを取り出すカーソルが作成されます。maxがNULLの場合には、keyがminと前方一致するレコードを取り出します。max_sizeパラメータは無視されます。 .sp maxとmax_sizeが指定され、かつ、テーブルのkeyがShortText型である場合、maxとcommon prefix searchを行い、common prefixがmin_sizeバイト以上のレコードを取り出します。minは無視されます。 .sp maxとmax_sizeが指定され、かつ、テーブルのkeyが固定長型の場合、maxとPAT木上で近い位置にあるノードから順番にレコードを取り出します。ただし、keyのパトリシア木で、min_sizeバイト未満のビットに対するノードで、maxと異なった方向にあるノードに対応するレコードについては取り出しません。PAT木上で位置が近いこととkeyの値が近いことは同一ではありません。この場合、maxで与えられるポインタが指す値は、対象テーブルのkeyサイズと同じか超える幅である必要があります。minは無視されます。 .sp \fBGRN_CURSOR_BY_ID\fP / \fBGRN_CURSOR_BY_KEY\fP / \fBGRN_CURSOR_PREFIX\fP の3フラグは、同時に指定することができません。 .sp \fBGRN_OBJ_TABLE_PAT_KEY\fP を指定して作ったテーブルで、\fBGRN_CURSOR_PREFIX\fP と \fBGRN_CURSOR_RK\fP を指定すると、半角小文字のアルファベット文字列から、それを旧JIS X 4063:2000規格に従って全角カタカナに変換した文字列に前方一致する値をkeyとするレコードを取り出します。\fBGRN_ENC_UTF8\fP のみをサポートしています。\fBGRN_CURSOR_ASCENDING\fP / \fBGRN_CURSOR_DESCENDING\fP は無効であり、レコードをkey値の昇降順で取り出すことはできません。 .IP \(bu 2 \fBoffset\fP \-\- .sp 該当する範囲のレコードのうち、(0ベースで)offset番目からレコードを取り出します。 .sp \fBGRN_CURSOR_PREFIX\fP を指定したときは負の数を指定することはできません。 .IP \(bu 2 \fBlimit\fP \-\- .sp 該当する範囲のレコードのうち、limit件のみを取り出します。\-1が指定された場合は、全件が指定されたものとみなします。 .sp \fBGRN_CURSOR_PREFIX\fP を指定したときは\-1より小さい負の数を指定することはできません。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_table_cursor_close(grn_ctx\fI\ *ctx\fP, grn_table_cursor\fI\ *tc\fP) \fI\%grn_table_cursor_open()\fP で生成したcursorを解放します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtc\fP \-\- 対象cursorを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_id grn_table_cursor_next(grn_ctx\fI\ *ctx\fP, grn_table_cursor\fI\ *tc\fP) cursorのカレントレコードを一件進めてそのIDを返します。cursorの対象範囲の末尾に達すると \fBGRN_ID_NIL\fP を返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtc\fP \-\- 対象cursorを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_table_cursor_get_key(grn_ctx\fI\ *ctx\fP, grn_table_cursor\fI\ *tc\fP, void\fI\ **key\fP) cursorのカレントレコードのkeyをkeyパラメータにセットし、その長さを返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtc\fP \-\- 対象cursorを指定します。 .IP \(bu 2 \fBkey\fP \-\- カレントレコードのkeyへのポインタがセットされます。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B int grn_table_cursor_get_value(grn_ctx\fI\ *ctx\fP, grn_table_cursor\fI\ *tc\fP, void\fI\ **value\fP) cursorパラメータのカレントレコードのvalueをvalueパラメータにセットし、その長さを返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtc\fP \-\- 対象cursorを指定します。 .IP \(bu 2 \fBvalue\fP \-\- カレントレコードのvalueへのポインタがセットされます。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_table_cursor_set_value(grn_ctx\fI\ *ctx\fP, grn_table_cursor\fI\ *tc\fP, const void\fI\ *value\fP, int\fI\ flags\fP) cursorのカレントレコードのvalueを引数の内容に置き換えます。cursorのカレントレコードが存在しない場合は \fBGRN_INVALID_ARGUMENT\fP を返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtc\fP \-\- 対象cursorを指定します。 .IP \(bu 2 \fBvalue\fP \-\- 新しいvalueの値を指定します。 .IP \(bu 2 \fBflags\fP \-\- \fBgrn_obj_set_value()\fP のflagsと同様の値を指定できます。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_rc grn_table_cursor_delete(grn_ctx\fI\ *ctx\fP, grn_table_cursor\fI\ *tc\fP) cursorのカレントレコードを削除します。cursorのカレントレコードが存在しない場合は \fBGRN_INVALID_ARGUMENT\fP を返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtc\fP \-\- 対象cursorを指定します。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_table_cursor_table(grn_ctx\fI\ *ctx\fP, grn_table_cursor\fI\ *tc\fP) cursorが属するtableを返します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBtc\fP \-\- 対象cursorを指定します。 .UNINDENT .UNINDENT .UNINDENT .SS \fBgrn_thread_*\fP .SS 概要 .sp スレッド関連のAPIには \fBgrn_thread_\fP プレフィックスがついています。 .sp 通常、このAPIを使う必要はありません。 .sp Groongaサーバーを実装するときにこのAPIを使いたくなるかもしれません。 .SS 例 .sp 以下は、 \fB/reference/executables/groonga\fP が実際に使っている \fBgrn_thread_*\fP APIの使い方です。 \fB/reference/executables/groonga\fP は最大スレッド数を増やすと、スレッドプールのサイズを増やします。一方、 \fB/reference/executables/groonga\fP は最大スレッド数を減らすと、スレッドプールのサイズを減らします。もし、すでに減少後のスレッドプールのサイズ以上のスレッドが動いていたらそれらを止めます。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C static grn_mutex q_mutex; static grn_cond q_cond; static uint32_t nfthreads; static uint32_t max_nfthreads; static uint32_t groonga_get_thread_limit(void *data) { return max_nfthreads; } static void groonga_set_thread_limit(uint32_t new_limit, void *data) { uint32_t i; uint32_t current_nfthreads; MUTEX_LOCK(q_mutex); current_nfthreads = nfthreads; max_nfthreads = new_limit; MUTEX_UNLOCK(q_mutex); if (current_nfthreads > new_limit) { for (i = 0; i < current_nfthreads; i++) { MUTEX_LOCK(q_mutex); COND_SIGNAL(q_cond); MUTEX_UNLOCK(q_mutex); } } } int main(int argc, char *argv) { /* ... */ grn_thread_set_get_limit_func(groonga_get_thread_limit, NULL); grn_thread_set_set_limit_func(groonga_set_thread_limit, NULL); grn_init(); /* ... */ } .ft P .fi .UNINDENT .UNINDENT .SS リファレンス .INDENT 0.0 .TP .B uint32_t (*grn_thread_get_limit_func)(void\fI\ *data\fP) 最大スレッド数を返す関数の型です。 .UNINDENT .INDENT 0.0 .TP .B void (*grn_thread_set_limit_func)(uint32_t\fI\ new_limit\fP, void\fI\ *data\fP) 最大スレッド数を設定する関数の型です。 .UNINDENT .INDENT 0.0 .TP .B uint32_t grn_thread_get_limit(void) 最大スレッド数を返します。 .sp \fI\%grn_thread_set_get_limit_func()\fP で \fI\%grn_thread_get_limit_func\fP を設定していない場合は、常に \fB0\fP を返します。 .INDENT 7.0 .TP .B 戻り値 最大スレッド数または \fB0\fP 。 .UNINDENT .UNINDENT .INDENT 0.0 .TP .B void_t grn_thread_set_limit(uint32_t\fI\ new_limit\fP) 最大スレッド数を設定します。 .sp \fI\%grn_thread_set_set_limit_func()\fP で \fI\%grn_thread_set_limit_func\fP を設定していない場合はなにもしません。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBnew_limit\fP \-\- 新しい最大スレッド数。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B void grn_thread_set_get_limit_func(grn_thread_get_limit_func\fI\ func\fP, void\fI\ *data\fP) 最大スレッド数を返すカスタム関数を設定します。 .sp \fBdata\fP は \fI\%grn_thread_get_limit()\fP が \fBfunc\fP を呼ぶときに \fBfunc\fP に渡されます。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBfunc\fP \-\- 最大スレッド数を返すカスタム関数。 .IP \(bu 2 \fBdata\fP \-\- \fBfunc\fP が呼ばれるときに \fBfunc\fP に渡されるユーザーのためのデータ。 .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B void grn_thread_set_set_limit_func(grn_thread_set_limit_func\fI\ func\fP, void\fI\ *data\fP) 最大スレッド数を設定するカスタム関数を設定します。 .sp \fBdata\fP は \fI\%grn_thread_set_limit()\fP が \fBfunc\fP を呼ぶときに \fBfunc\fP に渡されます。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBfunc\fP \-\- 最大スレッド数を設定するカスタム関数。 .IP \(bu 2 \fBdata\fP \-\- \fBfunc\fP が呼ばれるときに \fBfunc\fP に渡されるユーザーのためのデータ。 .UNINDENT .UNINDENT .UNINDENT .SS \fBgrn_type\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_builtin_type TODO... .UNINDENT .INDENT 0.0 .TP .B grn_obj *grn_type_create(grn_ctx\fI\ *ctx\fP, const char\fI\ *name\fP, unsigned int\fI\ name_size\fP, grn_obj_flags\fI\ flags\fP, unsigned int\fI\ size\fP) nameに対応する新たなtype(型)をdbに定義します。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBname\fP \-\- 作成するtypeの名前を指定します。 .IP \(bu 2 \fBflags\fP \-\- \fBGRN_OBJ_KEY_VAR_SIZE\fP, \fBGRN_OBJ_KEY_FLOAT\fP, \fBGRN_OBJ_KEY_INT\fP, \fBGRN_OBJ_KEY_UINT\fP のいずれかを指定します。 .IP \(bu 2 \fBsize\fP \-\- \fBGRN_OBJ_KEY_VAR_SIZE\fP の場合は最大長、それ以外の場合は長さ(単位:byte)を指定します。 .UNINDENT .UNINDENT .UNINDENT .SS \fBgrn_user_data\fP .SS 概要 .sp TODO... .SS 例 .sp TODO... .SS リファレンス .INDENT 0.0 .TP .B grn_user_data TODO... .UNINDENT .INDENT 0.0 .TP .B grn_user_data *grn_obj_user_data(grn_ctx\fI\ *ctx\fP, grn_obj\fI\ *obj\fP) objectに登録できるユーザデータへのポインタを返します。table, column, proc, exprのみ使用可能です。 .INDENT 7.0 .TP .B パラメタ .INDENT 7.0 .IP \(bu 2 \fBobj\fP \-\- 対象objectを指定します。 .UNINDENT .UNINDENT .UNINDENT .SH 仕様 .SS GQTP .sp GQTPはGroonga Query Transfer Protocolの頭文字です。GQTPはgroonga用の独自プロトコルです。 .SS プロトコル .sp GQTPはステートフルなクライアント・サーバーモデルのプロトコルです。以下の流れが1つの処理単位です: .INDENT 0.0 .IP \(bu 2 クライアントがリクエストを送る .IP \(bu 2 サーバーがリクエストを受け取る .IP \(bu 2 サーバーがリクエストを処理する .IP \(bu 2 サーバーがレスポンスを返す .IP \(bu 2 クライアントがレスポンスを受け取る .UNINDENT .sp 1つのセッション内で0個以上の処理単位を実行できます。 .sp リクエストもレスポンスもGQTPヘッダーとボディから成ります。GQTPヘッダーは固定長のデータです。ボディは可変長サイズのデータです。ボディのサイズはGQTPヘッダーの中に入っています。GQTPではボディの中身については何も定義しません。 .SS GQTPヘッダー .sp GQTPヘッダーは以下の符号なし整数値から成ります: .TS center; |l|l|l|. _ T{ 名前 T} T{ サイズ T} T{ 説明 T} _ T{ \fBprotocol\fP T} T{ 1byte T} T{ プロトコルの種類。 T} _ T{ \fBquery_type\fP T} T{ 1byte T} T{ ボディのコンテントタイプ。 T} _ T{ \fBkey_length\fP T} T{ 2byte T} T{ 未使用。 T} _ T{ \fBlevel\fP T} T{ 1byte T} T{ 未使用。 T} _ T{ \fBflags\fP T} T{ 1byte T} T{ フラグ。 T} _ T{ \fBstatus\fP T} T{ 2byte T} T{ リターンコード。 T} _ T{ \fBsize\fP T} T{ 4byte T} T{ ボディのサイズ。 T} _ T{ \fBopaque\fP T} T{ 4byte T} T{ 未使用。 T} _ T{ \fBcas\fP T} T{ 8byte T} T{ 未使用。 T} _ .TE .sp ヘッダーのすべての値はネットワークバイトオーダーを使っています。 .sp 以下のセクションではそれぞれのヘッダーの値で利用可能な値について説明します。 .sp GQTPヘッダーは全部で24byteになります。 .SS \fBprotocol\fP .sp リクエストのGQTPヘッダーでもレスポンスのGQTPヘッダーでも、この値は常に \fB0xc7\fP になります。 .SS \fBquery_type\fP .sp この値は以下のいずれかの値です: .TS center; |l|l|l|. _ T{ 名前 T} T{ 値 T} T{ 説明 T} _ T{ \fBNONE\fP T} T{ 0 T} T{ 自由形式。 T} _ T{ \fBTSV\fP T} T{ 1 T} T{ 値をタブで区切った形式。 T} _ T{ \fBJSON\fP T} T{ 2 T} T{ JSON。 T} _ T{ \fBXML\fP T} T{ 3 T} T{ XML。 T} _ T{ \fBMSGPACK\fP T} T{ 4 T} T{ MessagePack。 T} _ .TE .sp リクエストGQTPヘッダーでは使われません。 .sp レスポンスGQTPヘッダーで使われます。ボディは指定した形式にします。 .SS \fBflags\fP .sp この値は以下の値をビット単位ORしたものになります: .TS center; |l|l|l|. _ T{ 名前 T} T{ 値 T} T{ 説明 T} _ T{ \fBMORE\fP T} T{ 0x01 T} T{ まだデータがあります。 T} _ T{ \fBTAIL\fP T} T{ 0x02 T} T{ これ以上データはありません。 T} _ T{ \fBHEAD\fP T} T{ 0x04 T} T{ 未使用。 T} _ T{ \fBQUIET\fP T} T{ 0x08 T} T{ レスポンスを出力しません。 T} _ T{ \fBQUIT\fP T} T{ 0x10 T} T{ 終了します。 T} _ .TE .sp \fBMORE\fP あるいは \fBTAIL\fP フラグは必ず指定しないといけません。 .sp \fBMORE\fP フラグを使うときは \fBQUIET\fP フラグも使うべきです。リクエストが途中のときはレスポンスを出力する必要がないからです。 .sp セッションを終了するときは \fBQUIT\fP フラグを使ってください。 .SS \fBstatus\fP .sp 利用可能な値です。将来的に新しいステータスが追加される可能性があります。 .INDENT 0.0 .IP \(bu 2 0: \fBSUCCESS\fP .IP \(bu 2 1: \fBEND_OF_DATA\fP .IP \(bu 2 65535: \fBUNKNOWN_ERROR\fP .IP \(bu 2 65534: \fBOPERATION_NOT_PERMITTED\fP .IP \(bu 2 65533: \fBNO_SUCH_FILE_OR_DIRECTORY\fP .IP \(bu 2 65532: \fBNO_SUCH_PROCESS\fP .IP \(bu 2 65531: \fBINTERRUPTED_FUNCTION_CALL\fP .IP \(bu 2 65530: \fBINPUT_OUTPUT_ERROR\fP .IP \(bu 2 65529: \fBNO_SUCH_DEVICE_OR_ADDRESS\fP .IP \(bu 2 65528: \fBARG_LIST_TOO_LONG\fP .IP \(bu 2 65527: \fBEXEC_FORMAT_ERROR\fP .IP \(bu 2 65526: \fBBAD_FILE_DESCRIPTOR\fP .IP \(bu 2 65525: \fBNO_CHILD_PROCESSES\fP .IP \(bu 2 65524: \fBRESOURCE_TEMPORARILY_UNAVAILABLE\fP .IP \(bu 2 65523: \fBNOT_ENOUGH_SPACE\fP .IP \(bu 2 65522: \fBPERMISSION_DENIED\fP .IP \(bu 2 65521: \fBBAD_ADDRESS\fP .IP \(bu 2 65520: \fBRESOURCE_BUSY\fP .IP \(bu 2 65519: \fBFILE_EXISTS\fP .IP \(bu 2 65518: \fBIMPROPER_LINK\fP .IP \(bu 2 65517: \fBNO_SUCH_DEVICE\fP .IP \(bu 2 65516: \fBNOT_A_DIRECTORY\fP .IP \(bu 2 65515: \fBIS_A_DIRECTORY\fP .IP \(bu 2 65514: \fBINVALID_ARGUMENT\fP .IP \(bu 2 65513: \fBTOO_MANY_OPEN_FILES_IN_SYSTEM\fP .IP \(bu 2 65512: \fBTOO_MANY_OPEN_FILES\fP .IP \(bu 2 65511: \fBINAPPROPRIATE_I_O_CONTROL_OPERATION\fP .IP \(bu 2 65510: \fBFILE_TOO_LARGE\fP .IP \(bu 2 65509: \fBNO_SPACE_LEFT_ON_DEVICE\fP .IP \(bu 2 65508: \fBINVALID_SEEK\fP .IP \(bu 2 65507: \fBREAD_ONLY_FILE_SYSTEM\fP .IP \(bu 2 65506: \fBTOO_MANY_LINKS\fP .IP \(bu 2 65505: \fBBROKEN_PIPE\fP .IP \(bu 2 65504: \fBDOMAIN_ERROR\fP .IP \(bu 2 65503: \fBRESULT_TOO_LARGE\fP .IP \(bu 2 65502: \fBRESOURCE_DEADLOCK_AVOIDED\fP .IP \(bu 2 65501: \fBNO_MEMORY_AVAILABLE\fP .IP \(bu 2 65500: \fBFILENAME_TOO_LONG\fP .IP \(bu 2 65499: \fBNO_LOCKS_AVAILABLE\fP .IP \(bu 2 65498: \fBFUNCTION_NOT_IMPLEMENTED\fP .IP \(bu 2 65497: \fBDIRECTORY_NOT_EMPTY\fP .IP \(bu 2 65496: \fBILLEGAL_BYTE_SEQUENCE\fP .IP \(bu 2 65495: \fBSOCKET_NOT_INITIALIZED\fP .IP \(bu 2 65494: \fBOPERATION_WOULD_BLOCK\fP .IP \(bu 2 65493: \fBADDRESS_IS_NOT_AVAILABLE\fP .IP \(bu 2 65492: \fBNETWORK_IS_DOWN\fP .IP \(bu 2 65491: \fBNO_BUFFER\fP .IP \(bu 2 65490: \fBSOCKET_IS_ALREADY_CONNECTED\fP .IP \(bu 2 65489: \fBSOCKET_IS_NOT_CONNECTED\fP .IP \(bu 2 65488: \fBSOCKET_IS_ALREADY_SHUTDOWNED\fP .IP \(bu 2 65487: \fBOPERATION_TIMEOUT\fP .IP \(bu 2 65486: \fBCONNECTION_REFUSED\fP .IP \(bu 2 65485: \fBRANGE_ERROR\fP .IP \(bu 2 65484: \fBTOKENIZER_ERROR\fP .IP \(bu 2 65483: \fBFILE_CORRUPT\fP .IP \(bu 2 65482: \fBINVALID_FORMAT\fP .IP \(bu 2 65481: \fBOBJECT_CORRUPT\fP .IP \(bu 2 65480: \fBTOO_MANY_SYMBOLIC_LINKS\fP .IP \(bu 2 65479: \fBNOT_SOCKET\fP .IP \(bu 2 65478: \fBOPERATION_NOT_SUPPORTED\fP .IP \(bu 2 65477: \fBADDRESS_IS_IN_USE\fP .IP \(bu 2 65476: \fBZLIB_ERROR\fP .IP \(bu 2 65475: \fBLZO_ERROR\fP .IP \(bu 2 65474: \fBSTACK_OVER_FLOW\fP .IP \(bu 2 65473: \fBSYNTAX_ERROR\fP .IP \(bu 2 65472: \fBRETRY_MAX\fP .IP \(bu 2 65471: \fBINCOMPATIBLE_FILE_FORMAT\fP .IP \(bu 2 65470: \fBUPDATE_NOT_ALLOWED\fP .IP \(bu 2 65469: \fBTOO_SMALL_OFFSET\fP .IP \(bu 2 65468: \fBTOO_LARGE_OFFSET\fP .IP \(bu 2 65467: \fBTOO_SMALL_LIMIT\fP .IP \(bu 2 65466: \fBCAS_ERROR\fP .IP \(bu 2 65465: \fBUNSUPPORTED_COMMAND_VERSION\fP .UNINDENT .SS \fBsize\fP .sp ボディのサイズです。ボディの最大サイズは4GiBです。これは \fBsize\fP が4byteの符号なし整数だからです。4GiB以上のサイズのデータを送りたい場合は \fBMORE\fP フラグを使ってください。 .SS 例 .SS GQTPサーバの起動 .sp Groongaには、専用のプロトコルであるGQTPが存在します。GQTPを用いることにより、データベースへとリモートアクセスすることができます。以下の書式はGQTPサーバの起動方法を示しています。 .sp Form: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [\-p PORT_NUMBER] \-s DB_PATH .ft P .fi .UNINDENT .UNINDENT .sp \fI\-s\fP オプションはGroongaをサーバとして起動するためのオプションです。DB_PATHには既存のデータベースのパスを指定します。 \fI\-p\fP オプションとその引数により、サーバのポート番号を指定することができます。ポート番号を省略した場合は10043が使用されます。 .sp 以下のコマンドにより、デフォルトのポート番号で待ち受けるサーバを起動することができます。サーバは指定されたデータベースへの操作を受け付けます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-s /tmp/groonga\-databases/introduction.db Ctrl\-c % .ft P .fi .UNINDENT .UNINDENT .SS GQTPデーモンの起動 .sp GQTPサーバはデーモンとして起動することができます。オプションとして、 \fI\-s\fP の代わりに \fI\-d\fP を与えてください。 .sp Form: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [\-p PORT_NUMBER] \-d DB_PATH .ft P .fi .UNINDENT .UNINDENT .sp Groongaをデーモンとして起動したときは、デーモンのプロセスIDが表示されます。以下の例では、12345というプロセスIDが表示されています。サーバとして起動した場合と同様に、指定されたデータベースへの操作を受け付けます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-d /tmp/groonga\-databases/introduction.db 12345 % .ft P .fi .UNINDENT .UNINDENT .SS GQTPサーバへの接続 .sp GQTPサーバに接続するクライアントは、以下のように起動します。 .sp Form: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C groonga [\-p PORT_NUMBER] \-c [HOST_NAME_OR_IP_ADDRESS] .ft P .fi .UNINDENT .UNINDENT .sp 上記のコマンドによって起動されたクライアントは、サーバとの接続に成功すると対話モードに入ります。HOST_NAME_OR_IP_ADDRESSにはサーバのホスト名もしくはIPアドレスを指定します。HOST_NAME_OR_IP_ADDRESSが省略されたときは"localhost"をサーバのホスト名として採用します。また、 \fI\-p\fP オプションとその引数により、サーバのポート番号を指定することができます。ポート番号を省略した場合は10043が使用されます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-c status # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # { # "uptime": 0, # "max_command_version": 2, # "n_queries": 0, # "cache_hit_rate": 0.0, # "version": "4.0.1", # "alloc_count": 140, # "command_version": 1, # "starttime": 1395806078, # "default_command_version": 1 # } # ] > ctrl\-d % .ft P .fi .UNINDENT .UNINDENT .sp 対話モードでは、標準入力からコマンドを読み込んで順次実行します。 .SS GQTPサーバの終了 .sp GQTPサーバを終了する安全は方法は、クライアントを起動して \fB/reference/commands/shutdown\fP を発行することです。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % groonga \-c > shutdown % .ft P .fi .UNINDENT .UNINDENT .SS 参照 .INDENT 0.0 .IP \(bu 2 \fB/reference/executables/groonga\fP .IP \(bu 2 \fB/server/gqtp\fP .UNINDENT .SS 検索 .sp \fB/reference/commands/select\fP コマンドがqueryパラメータを使ってどのように検索するのかを説明します。 .SS 検索の挙動 .sp 検索の挙動には以下の3種類あり、検索結果によって動的に使い分けています。 .INDENT 0.0 .IP 1. 3 完全一致検索 .IP 2. 3 非わかち書き検索 .IP 3. 3 部分一致検索 .UNINDENT .sp どのように検索の挙動を使い分けているかを説明する前に、まず、それぞれの検索の挙動を説明します。 .SS 完全一致検索 .sp 検索対象文書は複数の語彙にトークナイズ(分割)され、それぞれを単位とした語彙表に索引を管理します。 検索キーワードも同一の方法でトークナイズされます。 .sp このとき、検索キーワードをトークナイズした結果得られる語彙の配列と同一の配列を含む文書を検索する処理を完全一致検索と呼んでいます。 .sp たとえば、TokenMecabトークナイザを使用した索引では「東京都民」という文字列は .INDENT 0.0 .INDENT 3.5 東京 / 都民 .UNINDENT .UNINDENT .sp という二つの語彙の配列として格納されます。この索引に対して「東京都」というキーワードで検索した時、このキーワードは、 .INDENT 0.0 .INDENT 3.5 東京 / 都 .UNINDENT .UNINDENT .sp という二つの語彙の配列として処理されます。この語彙の並びは、「東京 / 都民」という語彙の並びには一致しませんので、完全一致検索ではヒットしません。 .sp これに対して、TokenBigramトークナイザを使用した索引では「東京都民」という文字列は .INDENT 0.0 .INDENT 3.5 東京 / 京都 / 都民 / 民 .UNINDENT .UNINDENT .sp という四つの語彙の配列として格納されます。この索引に対して「東京都」というキーワードで検索した時、このキーワードは、 .INDENT 0.0 .INDENT 3.5 東京 / 京都 .UNINDENT .UNINDENT .sp という二つの語彙の配列として処理されます。この語彙の並びは、「東京 / 京都 / 都民」という語彙の並びに含まれますので、完全一致検索でヒットします。 .sp なお、TokenBigramトークナイザでは、アルファベット・数値・記号文字列についてはbigramを生成せず、一つの連続したトークンとして扱います。たとえば、「楽しいbilliard」という文字列は、 .INDENT 0.0 .INDENT 3.5 楽し / しい / billiard .UNINDENT .UNINDENT .sp という三つの語彙の配列として格納されます。これに対して「bill」というキーワードで検索した時、このキーワードは、 .INDENT 0.0 .INDENT 3.5 bill .UNINDENT .UNINDENT .sp という一つの語彙として処理されます。この語彙の並びは「楽し / しい / billiard」という語彙の並びには含まれないので、完全一致でヒットしません。 .sp これに対して、TokenBigramSplitSymbolAlphaトークナイザではアルファベット文字列についてもbigramを生成し、「楽しいbilliard」という文字列は、 .INDENT 0.0 .INDENT 3.5 楽し / しい / いb / bi / il / ll / li / ia / ar / rd / d .UNINDENT .UNINDENT .sp という十一の語彙の配列として格納されます。これに対して「bill」というキーワードで検索した時、このキーワードは、 .INDENT 0.0 .INDENT 3.5 bi / il / ll .UNINDENT .UNINDENT .sp という三つの語彙として処理されます。この語彙の並びは「楽し / しい / いb / bi / il / ll / li / ia / ar / rd / d」という語彙の並びに含まれるので、完全一致でヒットします。 .SS 非わかち書き検索 .sp 非わかち書き検索はパトリシア木で語彙表を構築している場合のみ利用可能です。 .sp 非わかち書き検索の挙動はTokenBigramなどN\-gram系のトークナイザーを利用している場合とTokenMecabトークナイザーを利用している場合で挙動が変わります。 .sp N\-gram系のトークナイザーを利用している場合はキーワードで前方一致検索をします。 .sp 例えば、「bill」というキーワードで検索した場合、「bill」も「billiard」もヒットします。 .sp TokenMeCabトークナイザーの場合はわかち書き前のキーワードで前方一致検索をします。 .sp 例えば、「スープカレー」というキーワードで検索した場合、「スープカレーバー」(1単語扱い)にヒットしますが、「スープカレー」("スープ"と"カレー"の2単語扱い)や「スープカレーライス」("スープ"と"カレーライス"の2単語扱い)にはヒットしません。 .SS 部分一致検索 .sp 部分一致検索はパトリシア木で語彙表を構築していて、かつ、KEY_WITH_SISオプションを指定している場合のみ利用可能です。KEY_WITH_SISオプションが指定されていない場合は非わかち書き検索と同等です。 .sp 部分一致検索の挙動はTokenBigramなどN\-gram系のトークナイザーを利用している場合とTokenMecabトークナイザーを利用している場合で挙動が変わります。 .sp Bigramの場合は前方一致検索と中間一致検索と後方一致検索を行います。 .sp 例えば、「ill」というキーワードで検索した場合、「bill」も「billiard」もヒットします。 .sp TokenMeCabトークナイザーの場合はわかち書き後のキーワードで前方一致検索と中間一致検索と後方一致検索をします。 .sp 例えば、「スープカレー」というキーワードで検索した場合、「スープカレー」("スープ"と"カレー"の2単語扱い)や「スープカレーライス」("スープ"と"カレーライス"の2単語扱い)、「スープカレーバー」(1単語扱い)にもヒットします。 .SS 検索の使い分け .sp Groongaは基本的に完全一致検索のみを行います。完全一致検索でのヒット件数が所定の閾値以下の場合に限り、非わかち書き検索を行い、それでもヒット件数が閾値以下の場合は部分一致検索を行います。(閾値のデフォルト値は0です。) .sp ただし、すでに検索結果セットが存在する場合はたとえヒット件数が閾値以下でも完全一致検索のみを行います。 .sp 例えば、以下のようなクエリの場合は、それぞれの検索でヒット件数が閾値以下の場合は完全一致検索、非わかち書き検索、部分一致検索を順に行います。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Shops \-\-match_column description \-\-query スープカレー .ft P .fi .UNINDENT .UNINDENT .sp しかし、以下のように全文検索を行う前に検索結果セットが存在する場合は完全一致検索のみを行います。(point > 3で閾値の件数よりヒットしている場合): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Shops \-\-filter \(aq"point > 3 && description @ \e"スープカレー\e""\(aq .ft P .fi .UNINDENT .UNINDENT .sp そのため、descriptionに「スープカレーライス」が含まれていても、「スープカレーライス」は「スープカレー」に完全一致しないのでヒットしません。 .SH 制限事項 .sp Groongaにはいくつか制限事項があります。 .SS テーブルの制限 .sp テーブルには以下の制限があります。 .INDENT 0.0 .IP \(bu 2 1つのキーの最大サイズ: 4096Bytes .IP \(bu 2 キーのサイズを合計した上限値: 4GByte .IP \(bu 2 最大レコード数: 268,435,455 (約2億6千万) .UNINDENT .sp 実際には他の諸条件の制約により上記の値まで到達しない場合もあります。 .SS インデックス上限値 .sp 1つのインデックスにおける論理上の上限値は以下のとおりです。 .INDENT 0.0 .IP \(bu 2 最大語彙数: 268,435,455 (約2億6千万) .IP \(bu 2 最大インデックスサイズ: 256GByte .UNINDENT .sp 実際には他の諸条件の制約により上記の値まで到達しない場合もあります。 .SS カラムの制限 .sp 1つのカラムにつき、次の制限があります。 .INDENT 0.0 .IP \(bu 2 カラムに格納した値の合計サイズの上限値: 256GiB .UNINDENT .SH トラブルシューティング .SS 同じ検索キーワードなのに全文検索結果が異なる .sp 同じ検索キーワードでも一緒に指定するクエリによっては全文検索の結果が異なることがあります。ここでは、その原因と対策方法を説明します。 .SS 例 .sp まず、実際に検索結果が異なる例を説明します。 .sp DDLは以下の通りです。BlogsテーブルのbodyカラムをTokenMecabトークナイザーを使ってトークナイズしてからインデックスを作成しています。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Blogs TABLE_NO_KEY column_create Blogs body COLUMN_SCALAR ShortText column_create Blogs updated_at COLUMN_SCALAR Time table_create Terms TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenMecab \-\-normalizer NormalizerAuto column_create Terms blog_body COLUMN_INDEX|WITH_POSITION Blogs body .ft P .fi .UNINDENT .UNINDENT .sp テスト用のデータは1件だけ投入します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C load \-\-table Blogs [ ["body", "updated_at"], ["東京都民に深刻なダメージを与えました。", "2010/9/21 10:18:34"], ] .ft P .fi .UNINDENT .UNINDENT .sp まず、全文検索のみで検索します。この場合ヒットします。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > select Blogs \-\-filter \(aqbody @ "東京都"\(aq [[0,4102.268052438,0.000743783],[[[1],[["_id","UInt32"],["updated_at","Time"],["body","ShortText"]],[1,1285031914.0,"東京都民に深刻なダメージを与えました。"]]]] .ft P .fi .UNINDENT .UNINDENT .sp 続いて、範囲指定と全文検索を組み合わせて検索します(1285858800は2010/10/1 0:0:0の秒表記)。この場合もヒットします。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > select Blogs \-\-filter \(aqbody @ "東京都" && updated_at < 1285858800\(aq [[0,4387.524084839,0.001525487],[[[1],[["_id","UInt32"],["updated_at","Time"],["body","ShortText"]],[1,1285031914.0,"東京都民に深刻なダメージを与えました。"]]]] .ft P .fi .UNINDENT .UNINDENT .sp 最後に、範囲指定と全文検索の順番を入れ替えて検索します。個々の条件は同じですが、この場合はヒットしません。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > select Blogs \-\-filter \(aqupdated_at < 1285858800 && body @ "東京都"\(aq [[0,4400.292570838,0.000647716],[[[0],[["_id","UInt32"],["updated_at","Time"],["body","ShortText"]]]]] .ft P .fi .UNINDENT .UNINDENT .sp どうしてこのような挙動になるかを説明します。 .SS 原因 .sp このような挙動になるのは全文検索時に複数の検索の挙動を使い分けているからです。ここでは簡単に説明するので、詳細は \fB/spec/search\fP を参照してください。 .sp 検索の挙動には以下の3種類があります。 .INDENT 0.0 .IP 1. 3 完全一致検索 .IP 2. 3 非わかち書き検索 .IP 3. 3 部分一致検索 .UNINDENT .sp Groongaは基本的に完全一致検索のみを行います。上記の例では「東京都民に深刻なダメージを与えました。」を「東京都」というクエリで検索していますが、TokenMecabトークナイザーを使っている場合はこのクエリはマッチしません。 .sp 検索対象の「東京都民に深刻なダメージを与えました。」は .INDENT 0.0 .INDENT 3.5 東京 / 都民 / に / 深刻 / な / ダメージ / を / 与え / まし / た / 。 .UNINDENT .UNINDENT .sp とトークナイズされますが、クエリの「東京都」は .INDENT 0.0 .INDENT 3.5 東京 / 都 .UNINDENT .UNINDENT .sp とトークナイズされるため、完全一致しません。 .sp Groongaは完全一致検索した結果のヒット件数が所定の閾値を超えない場合に限り、非わかち書き検索を行い、それでもヒット件数が閾値を超えない場合は部分一致検索を行います(閾値は1がデフォルト値となっています)。このケースのデータは部分一致検索ではヒットするので、「東京都」クエリのみを指定するとヒットします。 .sp しかし、以下のように全文検索前にすでに閾値が越えている場合(「updated_at < 1285858800」で1件ヒットし、閾値を越える)は、たとえ完全一致検索で1件もヒットしない場合でも部分一致検索などを行いません。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C select Blogs \-\-filter \(aqupdated_at < 1285858800 && body @ "東京都"\(aq .ft P .fi .UNINDENT .UNINDENT .sp そのため、条件の順序を変えると検索結果が変わるという状況が発生します。以下で、この情報を回避する方法を2種類紹介しますが、それぞれトレードオフとなる条件があるので採用するかどうかを十分検討してください。 .SS 対策方法1: トークナイザーを変更する .sp TokenMecabトークナイザーは事前に準備した辞書を用いてトークナイズするため、再現率よりも適合率を重視したトークナイザーと言えます。一方、TokenBigramなど、N\-gram系のトークナイザーは適合率を重視したトークナイザーと言えます。例えば、TokenMecabの場合「東京都」で「京都」に完全一致することはありませんが、TokenBigramでは完全一致します。一方、TokenMecabでは「東京都民」に完全一致しませんが、TokenBigramでは完全一致します。 .sp このようにN\-gram系のトークナイザーを指定することにより再現率をあげることができますが、適合率が下がり検索ノイズが含まれる可能性が高くなります。この度合いを調整するためには \fB/reference/commands/select\fP のmatch_columnsで使用する索引毎に重み付けを指定します。 .sp ここでも、前述の例を使って具体例を示します。まず、TokenBigramを用いた索引を追加します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C table_create Bigram TABLE_PAT_KEY ShortText \-\-default_tokenizer TokenBigram \-\-normalizer NormalizerAuto column_create Bigram blog_body COLUMN_INDEX|WITH_POSITION Blogs body .ft P .fi .UNINDENT .UNINDENT .sp この状態でも以前はマッチしなかったレコードがヒットするようになります。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > select Blogs \-\-filter \(aqupdated_at < 1285858800 && body @ "東京都"\(aq [[0,7163.448064902,0.000418127],[[[1],[["_id","UInt32"],["updated_at","Time"],["body","ShortText"]],[1,1285031914.0,"東京都民に深刻なダメージを与えました。"]]]] .ft P .fi .UNINDENT .UNINDENT .sp しかし、N\-gram系のトークナイザーの方がTokenMecabトークナイザーよりも語のヒット数が多いため、N\-gram系のヒットスコアの方が重く扱われてしまいます。N\-gram系のトークナイザーの方がTokenMecabトークナイザーよりも適合率の低い場合が多いので、このままでは検索ノイズが上位に表示される可能性が高くなります。 .sp そこで、TokenMecabトークナイザーを使って作った索引の方をTokenBigramトークナイザーを使って作った索引よりも重視するように重み付けを指定します。これは、match_columnsオプションで指定できます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > select Blogs \-\-match_columns \(aqTerms.blog_body * 10 || Bigram.blog_body * 3\(aq \-\-query \(aq東京都\(aq \-\-output_columns \(aq_score, body\(aq [[0,8167.364602632,0.000647003],[[[1],[["_score","Int32"],["body","ShortText"]],[13,"東京都民に深刻なダメージを与えました。"]]]] .ft P .fi .UNINDENT .UNINDENT .sp この場合はスコアが11になっています。内訳は、Terms.blog_body索引(TokenMecabトークナイザーを使用)でマッチしたので10、Bigram.blog_body索引(TokenBigramトークナイザーを使用)でマッチしたので3、これらを合計して13になっています。このようにTokenMecabトークナイザーの重みを高くすることにより、検索ノイズが上位にくることを抑えつつ再現率を上げることができます。 .sp この例は日本語だったのでTokenBigramトークナイザーでよかったのですが、アルファベットの場合はTokenBigramSplitSymbolAlphaトークナイザーなども利用する必要があります。例えば、「楽しいbilliard」はTokenBigramトークナイザーでは .INDENT 0.0 .INDENT 3.5 楽し / しい / billiard .UNINDENT .UNINDENT .sp となり、「bill」では完全一致しません。一方、TokenBigramSplitSymbolAlphaトークナイザーを使うと .INDENT 0.0 .INDENT 3.5 楽し / しい / いb / bi / il / ll / li / ia / ar / rd / d .UNINDENT .UNINDENT .sp となり、「bill」でも完全一致します。 .sp TokenBigramSplitSymbolAlphaトークナイザーを使う場合も重み付けを考慮する必要があることはかわりありません。 .sp 利用できるバイグラム系のトークナイザーの一覧は以下の通りです。 .INDENT 0.0 .IP \(bu 2 TokenBigram: バイグラムでトークナイズする。連続する記号・アルファベット・数字は一語として扱う。 .IP \(bu 2 TokenBigramSplitSymbol: 記号もバイグラムでトークナイズする。連続するアルファベット・数字は一語として扱う。 .IP \(bu 2 TokenBigramSplitSymbolAlpha: 記号とアルファベットもバイグラムでトークナイズする。連続する数字は一語として扱う。 .IP \(bu 2 TokenBigramSplitSymbolAlphaDigit: 記号・アルファベット・数字もバイグラムでトークナイズする。 .IP \(bu 2 TokenBigramIgnoreBlank: バイグラムでトークナイズする。連続する記号・アルファベット・数字は一語として扱う。空白は無視する。 .IP \(bu 2 TokenBigramIgnoreBlankSplitSymbol: 記号もバイグラムでトークナイズする。連続するアルファベット・数字は一語として扱う。空白は無視する。 .IP \(bu 2 TokenBigramIgnoreBlankSplitSymbolAlpha: 記号とアルファベットもバイグラムでトークナイズする。連続する数字は一語として扱う。空白は無視する。 .IP \(bu 2 TokenBigramIgnoreBlankSplitSymbolAlphaDigit: 記号・アルファベット・数字もバイグラムでトークナイズする。空白は無視する。 .UNINDENT .SS 対策方法2: 閾値をあげる .sp 非わかち書き検索・部分一致検索を利用するかどうかの閾値は\-\-with\-match\-escalation\-threshold configureオプションで変更することができます。以下のように指定すると、100件以下のヒット数であれば、たとえ完全一致検索でヒットしても、非わかち書き検索・部分一致検索を行います。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-with\-match\-escalation\-threshold=100 .ft P .fi .UNINDENT .UNINDENT .sp この場合も対策方法1同様、検索ノイズが上位に現れる可能性が高くなることに注意してください。検索ノイズが多くなった場合は指定する値を低くする必要があります。 .SS mmap Cannot allocate memoryエラーを回避するには .SS 例 .sp ログファイルに以下のようなmmapエラーが存在する場合があります。: .INDENT 0.0 .INDENT 3.5 2013\-06\-04 08:19:34.835218|A|4e86e700|mmap(4194304,551,432017408)=Cannot allocate memory <13036498944> .UNINDENT .UNINDENT .sp <13036498944> はこの場合mmapの合計サイズ(約12GB)です。 .SS 対策方法 .sp 以下の観点を確認する必要があります。 .INDENT 0.0 .IP \(bu 2 十分なメモリの空きが存在するか? .IP \(bu 2 マッピング最大数を超過していないか? .UNINDENT .sp 十分な空きメモリがあるかを調べるために、vmstat コマンドを使うことができます。 .sp 最大マッピング数を超過しているかどうかを確認するために、 vm.max_map_count の値を調べることができます。 .sp もしこの問題が vm.max_map_count の値を調整することで解決するなら、これが原因です。 .sp groongaはメモリを256KBごとに確保するので、扱えるデータベースのサイズを以下の式で見積ることができます: .INDENT 0.0 .INDENT 3.5 (database size) = vm.max_map_count * (memory chunks) .UNINDENT .UNINDENT .sp 16GBを超えるデータベースを扱うには、少くとも65536を vm.max_map_count の値として設定しないといけません。 .INDENT 0.0 .INDENT 3.5 database size (16GB) = vm.max_map_count (65536) * memory chunks (256KB) .UNINDENT .UNINDENT .sp sudo sysctl \-w vm.max_map_count=65536 で一時的に vm.max_map_count を調整することができます。 .sp その後、設定値を \fB/etc/sysctl.conf\fP もしくは \fB/etc/sysctl.d/*.conf\fP へと保存します。 .sp チューニング関連のパラメータについては、 \fB/reference/tuning\fP のドキュメントを参照してください。 .SH 開発 .sp このセクションではGroongaを使った開発について説明します。例えば、Groongaをデータベースとして使ったアプリケーション、libgroongaを使ったライブラリ、libgroongaの言語バインディングなどを開発することがあるでしょう。 .SS Travis CI .sp このセクションでは \fI\%Travis CI\fP 上でGroongaを使う方法について説明します。Travis CIはオープンソースコミュニティ用の継続的インテグレーション(CI)サービスです。 .sp オープンソースソフトウェアを開発しているならTravis CIを使えます。このセクションではGroonga関連の設定のみ説明します。Travis CI一般については \fI\%Travis CI: Documentation\fP を読んでください。 .SS 設定 .sp Travis CIは64\-bit版のUbuntu 12.04 LTS サーバ版を使っています。( \fI\%Travis CI: About Travis CI Environment\fP 参照。)Travis CIにGroongaをインストールするために、Groongaプロジェクトが提供しているUbuntu 12.04 LTS用のapt\-lineを使えます。 .sp \fB\&.travis.yml\fP でビルド方法を変更することができます。( \fI\%Travis CI: Conifugration your Travis CI build with .travis.yml\fP 参照。) \fBbefore_install\fP フックまたは \fBinstall\fP フックを使います。もし、Travis CIがサポートしている言語(例えばRuby)を使ったソフトウェアの場合は \fBbefore_install\fP を使います。そうでない場合は \fBinstall\fP を使います。 .sp 以下の \fBsudo\fP と \fBbefore_install\fP の設定を \fB\&.travis.yml\fP に加えます: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C sudo: required before_install: \- curl \-\-silent \-\-location https://github.com/groonga/groonga/raw/master/data/travis/setup.sh | sh .ft P .fi .UNINDENT .UNINDENT .sp ここで使っているセットアップスクリプトの中で \fBsudo\fP コマンドを使っているので、 \fBsudo: required\fP の設定が必要になります。 .sp \fBbefore_install\fP フックではなく \fBinstall\fP フックを使わなければいけない場合は、単に \fBbefore_install:\fP を \fBinstall:\fP に書き換えてください。 .sp 上記の設定でビルド中にGroongaを使えるようになります。 .SS 例 .sp Travis CI上でGroongaを使っているオープンソースソフトウェアは以下の通りです .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%rroonga\fP (Rubyバインディング) .INDENT 2.0 .IP \(bu 2 \fI\%Travis CIでのrroongaのビルド結果\fP .IP \(bu 2 \fI\%rroonga用の.travis.yml\fP .UNINDENT .IP \(bu 2 \fI\%nroonga\fP (node.jsバインディング) .INDENT 2.0 .IP \(bu 2 \fI\%Travis CIでのnroongaのビルド結果\fP .IP \(bu 2 \fI\%nroonga用の.travis.yml\fP .UNINDENT .IP \(bu 2 \fI\%logaling\-command\fP (A glossary management command line tool) .INDENT 2.0 .IP \(bu 2 \fI\%Travis CIでのlogaling\-commandのビルド結果\fP .IP \(bu 2 \fI\%logaling\-command用の.travis.yml\fP .UNINDENT .UNINDENT .UNINDENT .UNINDENT .SH GROONGAへのコントリビュート方法 .sp Groongaプロジェクトではみなさんからのコントリビュートを歓迎します!コントリビュートの方法はいくつもあります。Groongaを使ったり誰かに紹介することもコントリビュートですし、バグレポートを送ったり、Groonga本体やGroonga関連の開発に参加することもコントリビュートです。プログラムではなく、ドキュメントでのコントリビュートも歓迎します! .INDENT 0.0 .TP .B ユーザーの立場で: このドキュメントを読んでください。 .TP .B 布教する立場で: Groongaについてまわりの人に話してください。 .TP .B 開発者の立場で: 不具合報告や開発、ドキュメント これらについてはこのセクションで説明します。 .UNINDENT .SS バグレポートの送り方 .sp バグレポートを送るには2つやり方があります: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 課題追跡システムへ登録する .IP \(bu 2 メーリングリストへ報告する .UNINDENT .UNINDENT .UNINDENT .sp どちらのやり方でも大丈夫です。 .SS 課題追跡システムへ登録する .sp Groongaプロジェクトは \fI\%Github issue tracker\fP を使っています。 .sp GitHub issue tracker へのバグレポートは英語または日本語で大丈夫です。 .SS メーリングリストへ報告する .sp GroongaプロジェクトではGroongaについて議論するための \fB/community\fP があります。バグを説明したメールを送ってください。 .SS ドキュメント関連のコントリビュート方法 .sp ドキュメントツールとして \fI\%Sphinx\fP を使います。 .SS Introduction .sp This documentation describes about how to write, generate and manage Groonga documentation. .SS 必要なソフトウェアのインストール .sp Groongaはドキュメントツールとして \fI\%Sphinx\fP を使います。 .sp 以下はSphinxをインストールするコマンドラインです。 .sp Debian GNU/Linux, Ubuntu: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get install \-V \-y python\-sphinx .ft P .fi .UNINDENT .UNINDENT .sp CentOS, Fedora: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo yum install \-y python\-pip % sudo pip install sphinx .ft P .fi .UNINDENT .UNINDENT .sp OS X: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % brew install python % brew install gettext % export PATH=\(gabrew \-\-prefix gettext\(ga/bin:$PATH % pip install sphinx .ft P .fi .UNINDENT .UNINDENT .SS Run \fBconfigure\fP with \fB\-\-enable\-document\fP .sp Groonga disables documentation generation by default. You need to enable it explicitly by adding \fB\-\-enable\-document\fP option to \fBconfigure\fP: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-enable\-document .ft P .fi .UNINDENT .UNINDENT .sp Now, your Groonga build is documentation ready. .SS HTMLファイルを生成 .sp You can generate HTML by the following command: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make \-C doc html .ft P .fi .UNINDENT .UNINDENT .sp You can find generated HTML documentation at \fBdoc/locale/en/html/\fP\&. .SS Update .sp You can find sources of documentation at \fBdoc/source/\fP\&. The sources should be written in English. See \fBi18n\fP about how to translate documentation. .sp You can update the target file when you update the existing documentation file. .sp You need to update file list after you add a new file, change file path and delete existing file. You can update file list by the following command: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make \-C doc update\-files .ft P .fi .UNINDENT .UNINDENT .sp The command updates \fBdoc/files.am\fP\&. .SS 国際化 .sp 今のところ、Groongaには日本語でのドキュメントしかありません。1.2.2からgettextベースの \fI\%Sphinx I18N feature\fP を使ってドキュメントの国際化対応を始めました。この仕組みではベースの言語として英語を使い、日本語などの他の言語には英語からその言語に翻訳します。すべてのドキュメントはdoc/source/以下において、それをSphinxで処理します。 .sp しかし、今のところ、doc/source/では日本語を使っています。そのため、まずは、doc/source/以下にある日本語のドキュメントを英語に翻訳する必要があります。ドキュメントを翻訳して、パッチを送ってくれるととても喜びます。 .SS 翻訳の流れ .sp doc/source/*.txtを更新したら、翻訳を始めます。 .sp これが翻訳の流れです: .INDENT 0.0 .IP 1. 3 Groongaのリポジトリをcloneします。 .IP 2. 3 \&.poファイルを更新します。 .IP 3. 3 \&.poファイルを編集します。 .IP 4. 3 HTMLファイルを生成します。 .IP 5. 3 HTMLの出力を確認します。 .IP 6. 3 翻訳が完了するまで、2.\-4.を繰り返します。 .IP 7. 3 翻訳作業の成果をGroongaプロジェクトに送ってください! .UNINDENT .sp 上記の流れを実行するコマンドラインです。詳細は以降のセクションで説明します。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # Please fork https://github.com/groonga/groonga on GitHub % git clone https://github.com/${YOUR_GITHUB_ACCOUNT}/groonga.git % ./autogen.sh % ./configure % cd doc/locale/${LANGUAGE}/LC_MESSAGES # ${LANGUAGE} is language code such as \(aqja\(aq. % make update # *.po are updated % editor *.po # translate *.po # you can use your favorite editor % cd .. % make html % browser html/index.html # confirm translation % git add LC_MESSAGES/*.po % git commit % git push .ft P .fi .UNINDENT .UNINDENT .SS Groongaリポジトリのcloneの仕方 .sp はじめに、GitHub上のGroongaリポジトリをforkしてください。 \fI\%https://github.com/groonga/groonga\fP にアクセスして \fIFork\fP ボタンを押すだけです。これで自分のGroongaリポジトリをcloneすることができます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % git clone https://github.com/${YOUR_GITHUB_ACCOUNT}/groonga.git .ft P .fi .UNINDENT .UNINDENT .sp cloneした後はconfigureする必要があります。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd groonga % ./autogen.sh % ./configure .ft P .fi .UNINDENT .UNINDENT .sp この作業は初回セットアップ時のみだけの作業です。 .sp 以上の作業で問題があった場合は、 \fI\%http://packages.groonga.org/source/groonga/\fP にあるソースファイルを利用してもよいです。 .SS \&.poファイルの更新の仕方 .sp doc/locale/${LANGUAGE}/LC_MESSAGESディレクトリで \fImake update\fP を実行すると.poファイルを更新できます。(\fI${LANGUAGE}\fP は\(aqja\(aqなど自分の言語の言語コードに置き換えてください。): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd doc/locale/ja/LC_MESSAGES % make update .ft P .fi .UNINDENT .UNINDENT .SS \&.poの編集の仕方 .sp \&.poファイルを編集するためのツールがあります。.poファイルは単なるテキストなので好きなエディタで編集できます。以下は.poファイルの編集に特化したエディタのリストです。 .INDENT 0.0 .TP .B Emacs\(aqs \fI\%po\-mode\fP gettextに同梱されています。 .TP .B \fI\%Poedit\fP \&.po専用エディタです。たくさんのプラットフォームで動作します。 .TP .B gted これも.po専用エディタです。Eclipseプラグインとして実装されています。 .UNINDENT .SS HTMLファイルの生成方法 .sp doc/locale/${LANGUAGE}ディレクトリで \fImake html\fP を実行すると更新した.poファイルを使ってHTMLファイルを生成できます。(\fI${LANGUAGE}\fP は\(aqja\(aqなど自分の言語の言語コードに置き換えてください。): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd doc/locale/ja/ % make html .ft P .fi .UNINDENT .UNINDENT .sp 全ての言語のHTMLファイルを生成するにはdoc/locale/ディレクトリで \fImake html\fP を実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd doc/locale % make html .ft P .fi .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 \&.moファイルは \fImake html\fP で自動的に更新されるので、.moファイルのことを気にする必要はありません。 .UNINDENT .UNINDENT .SS HTML出力の確認の仕方 .sp HTMLファイルはdoc/locale/${LANGUAGE}/html/以下に出力されます。(\fI${LANGUAGE}\fP は\(aqja\(aqなど自分の言語の言語コードに置き換えてください。)好きなブラウザで出力されたHTMLを確認してください。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % firefox doc/locale/ja/html/index.html .ft P .fi .UNINDENT .UNINDENT .SS 翻訳の成果の送り方 .sp 翻訳の成果はGitHubのpull requestかメールで送ってください。メールで送る場合はパッチでも.poファイルそのものでも構いません。 .SS pull requestの送り方 .sp pull requestを送るためのコマンドライン: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % git add doc/locale/ja/LC_MESSAGES/*.po % git commit % git push .ft P .fi .UNINDENT .UNINDENT .sp これでGitHub上でpull requestを送る準備ができました。あとは、GitHub上の自分のリポジトリのページへアクセスして \fIPull Request\fP ボタンを押すだけです。 .sp \fB参考:\fP .INDENT 0.0 .INDENT 3.5 \fI\%Help.GitHub \- pull requestを送る\fP\&. .UNINDENT .UNINDENT .SS パッチの送り方 .sp パッチを作るためのコマンドライン .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % git add doc/locale/ja/LC_MESSAGES/*.po % git commit % git format\-patch origin/master .ft P .fi .UNINDENT .UNINDENT .sp カレントディレクトリに000X\-YYY.patchという名前のファイルができていると思います。これをGroongaプロジェクトに送ってください! .sp \fB参考:\fP .INDENT 0.0 .INDENT 3.5 \fB/community\fP に連絡先の情報があります。 .UNINDENT .UNINDENT .SS \&.poファイルの送り方 .sp doc/locale/${LANGUAGE}/LC_MESSAGES/以下を.tar.gzや.zipなどでアーカイブにしてGroongaプロジェクトに送ってください!(\fI${LANGUAGE}\fP は\(aqja\(aqなど自分の言語の言語コードに置き換えてください。)こちらでアーカイブの中の内容をマージします。 .sp \fB参考:\fP .INDENT 0.0 .INDENT 3.5 \fB/community\fP に連絡先の情報があります。 .UNINDENT .UNINDENT .SS 新しい言語の追加方法 .sp 新しい翻訳対象の言語を追加するコマンドライン: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd doc/locale % make add LOCALE=${LANGUAGE} # specify your language code such as \(aqde\(aq. .ft P .fi .UNINDENT .UNINDENT .sp \fI${LANGUAGE}\fP は\(aqja\(aqなどの自分の言語の言語コードに置き換えてください。 .sp \fB参考:\fP .INDENT 0.0 .INDENT 3.5 \fI\%言語名を表記するためのコードの一覧\fP\&. .UNINDENT .UNINDENT .SS C API .sp 今のところ、C APIのドキュメントはinclude/groonga.hにありますが、これをdoc/source/c\-api/*.txtに移動したいと思っています。C APIのドキュメントを移動して、パッチを送ってくれるととても喜びます。 .sp Sphinxの \fI\%the C domain markup\fP を使う予定です。 .SS Groonga開発者向け情報 .SS リポジトリ .sp Groongaのリポジトリは \fI\%GitHub\fP 上にあります。次のコマンドでcloneできます。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % git clone \-\-recursive https://github.com/groonga/groonga.git .ft P .fi .UNINDENT .UNINDENT .sp \fI\%Groonga関係のプロジェクト(grntest, fluent\-plugin\-groongaなど)\fP のリストはリンク先をごらんください。 .SS リポジトリーのGroongaをビルドする方法 .sp このドキュメントではビルドシステム毎にリポジトリーにあるGroongaをビルドする方法を説明します。GNU/LinuxまたはUnix(*BSDやSolaris、OS Xなど)でGroongaを開発する場合はGNU AutotoolsかCMakeを選べます。Windowsで開発する場合はCMakeを使う必要があります。 .SS GNU Autotoolsを使ってリポジトリーのGroongaをビルドする方法 .sp このドキュメントはGNU Autotoolsを使ってリポジトリーのGroongaをビルドする方法を説明します。 .sp WindowsでGroongaを開発する場合はこの方法を使えません。Groongaの開発にWindowsを使いたい場合は \fBwindows_cmake\fP を参照してください。 .SS 必要なソフトウェアのインストール .sp TODO .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%Autoconf\fP .IP \(bu 2 \fI\%Automake\fP .IP \(bu 2 \fI\%GNU Libtool\fP .IP \(bu 2 \fI\%Ruby\fP .IP \(bu 2 \fI\%Git\fP .IP \(bu 2 \fI\%Cutter\fP .IP \(bu 2 \&... .UNINDENT .UNINDENT .UNINDENT .SS リポジトリーからGroongaをチェックアウト .sp ユーザーはリリースされたソースアーカイブを使います。しかし、開発者はリポジトリーからGroongaをビルドするべきです。なぜなら、リポジトリーにあるソースコードが最新のソースコードだからです。 .sp Groongaのリポジトリーは \fI\%GitHub\fP にあります。リポジトリーから最新のソースコードをチェックアウトします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % git clone \-\-recursive git@github.com:groonga/groonga.git .ft P .fi .UNINDENT .UNINDENT .SS \fBconfigure\fP を作る .sp \fBconfigure\fP を作る必要があります。 \fBconfigure\fP はソースアーカイブには含まれていますが、リポジトリーには含まれていません。 .sp \fBconfigure\fP はあなたのシステムを検出してあなたの環境用のビルドパラメーターを生成するビルドツールです。 .sp \fBconfigure\fP を作るために \fBautogen.sh\fP を実行します: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./autogen.sh .ft P .fi .UNINDENT .UNINDENT .SS \fBconfigure\fP を実行 .sp \fBconfigure\fP にオプションを渡してビルドパラメーターをカスタマイズできます。 .sp 開発者向けのオススメの \fBconfigure\fP オプションは次の通りです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \-\-prefix=/tmp/local \-\-enable\-debug \-\-enable\-mruby \-\-with\-ruby .ft P .fi .UNINDENT .UNINDENT .sp それぞれのオプションの説明です。 .INDENT 0.0 .TP .B \fB\-\-prefix=/tmp/local\fP あなたのGroongaを一時ディレクトリーにインストールように指定しています。 \fB/tmp/local\fP ディレクトリーを削除することで「クリーンインストール」を試すことができます。インストール処理をデバッグするときに便利です。 .TP .B \fB\-\-enable\-debug\fP C/C++コンパイラーのデバッグオプションを有効にします。GDBやLLDBなどのデバッガーでデバッグするときに便利です。 .TP .B \fB\-\-eanble\-mruby\fP mrubyサポートを有効にします。この機能はデフォルトで無効になっていますが、開発者はこの機能を有効にするべきです。 .TP .B \fB\-\-with\-ruby\fP \fB\-\-enable\-mruby\fP オプションと機能テストの実行に必要です。 .UNINDENT .SS \fBmake\fP を実行 .sp これでGroongaをビルドできるようになりました。 .sp 開発者向けのオススメの \fBmake\fP のコマンドラインです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make \-j8 > /dev/null .ft P .fi .UNINDENT .UNINDENT .sp \fB\-j8\fP はビルド時間を短縮します。並列ビルドが有効になっているためです。もし、CPUコアが8よりもたくさんあるのであれば、 \fB8\fP をもっと増やすとさらにビルドタイムを短縮できるでしょう。 .sp \fB> /dev/null\fP をつけることで警告メッセージとエラーメッセージだけが見えるようになります。開発者は新しいコミットで警告メッセージもエラーメッセージも増やすべきではありません。 .SS 参考 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB/contribution/development/test\fP .UNINDENT .UNINDENT .UNINDENT .SS GNU/LinuxまたはUnix上でCMakeを使ってリポジトリーのGroongaをビルドする方法 .sp このドキュメントではGNU/LinuxまたはUnix上でCMakeを使ってリポジトリーのGroongaをビルドする方法を説明します。 .sp Unixとは*BSDやSolaris、OS Xなどのことです。 .sp Groongaの開発にWindowsを使いたい場合は \fBwindows_cmake\fP を参照してください。 .sp Groongaをリリースするときはこの方法を使うことはできません。GroongaのリリースシステムはGNU Autotoolsを使ったビルドでしかサポートしてません。GNU Autotoolsを使ったビルドについては \fBunix_autotools\fP を参照してください。 .SS 必要なソフトウェアのインストール .sp TODO .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%CMake\fP .IP \(bu 2 \fI\%Ruby\fP .IP \(bu 2 \fI\%Git\fP .IP \(bu 2 \fI\%Cutter\fP .IP \(bu 2 \&... .UNINDENT .UNINDENT .UNINDENT .SS リポジトリーからGroongaをチェックアウト .sp ユーザーはリリースされたソースアーカイブを使います。しかし、開発者はリポジトリーからGroongaをビルドするべきです。なぜなら、リポジトリーにあるソースコードが最新のソースコードだからです。 .sp Groongaのリポジトリーは \fI\%GitHub\fP にあります。リポジトリーから最新のソースコードをチェックアウトします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % git clone \-\-recursive git@github.com:groonga/groonga.git .ft P .fi .UNINDENT .UNINDENT .SS \fBcmake\fP を実行 .sp あなたの環境用の \fBMakefile\fP を作る必要があります。 .sp \fBcmake\fP へオプションを渡してビルドパラメーターをカスタマイズできます。 .sp 開発者向けのオススメ \fBcmake\fP オプションは次の通りです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cmake . \-DCMAKE_INSTALL_PREFIX=/tmp/local \-DGRN_WITH_DEBUG=on \-DGRN_WITH_MRUBY=on .ft P .fi .UNINDENT .UNINDENT .sp それぞれのオプションの説明です。 .sp \fB\-DCMAKE_INSTALL_PREFIX=/tmp/local\fP .INDENT 0.0 .INDENT 3.5 あなたのGroongaを一時ディレクトリーにインストールように指定しています。 \fB/tmp/local\fP ディレクトリーを削除することで「クリーンインストール」を試すことができます。インストール処理をデバッグするときに便利です。 .UNINDENT .UNINDENT .sp \fB\-DGRN_WITH_DEBUG=on\fP .INDENT 0.0 .INDENT 3.5 C/C++コンパイラーのデバッグオプションを有効にします。GDBやLLDBなどのデバッガーでデバッグするときに便利です。 .UNINDENT .UNINDENT .sp \fB\-DGRN_WITH_MRUBY=on\fP .INDENT 0.0 .INDENT 3.5 mrubyサポートを有効にします。この機能はデフォルトで無効になっていますが、開発者はこの機能を有効にするべきです。 .UNINDENT .UNINDENT .SS \fBmake\fP を実行 .sp これでGroongaをビルドできるようになりました。 .sp 開発者向けのオススメの \fBmake\fP のコマンドラインです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make \-j8 > /dev/null .ft P .fi .UNINDENT .UNINDENT .sp \fB\-j8\fP はビルド時間を短縮します。並列ビルドが有効になっているためです。もし、CPUコアが8よりもたくさんあるのであれば、 \fB8\fP をもっと増やすとさらにビルドタイムを短縮できるでしょう。 .sp \fB> /dev/null\fP をつけることで警告メッセージとエラーメッセージだけが見えるようになります。開発者は新しいコミットで警告メッセージもエラーメッセージも増やすべきではありません。 .SS 参考 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB/contribution/development/test\fP .UNINDENT .UNINDENT .UNINDENT .SS Windows上でCMakeを使ってリポジトリーのGroongaをビルドする方法 .sp このドキュメントではWindows上でCMakeを使ってリポジトリーのGroongaをビルドする方法を説明します。 .sp Groongaの開発にGNU/LinuxまたはUnixを使いたい人は \fBunix_cmake\fP を参照してください。 .sp Unixとは*BSDやSolaris、OS Xなどのことです。 .SS 必要なソフトウェアのインストール .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%Microsoft Visual Studio Express 2013 for Windows Desktop\fP .IP \(bu 2 \fI\%CMake\fP .IP \(bu 2 \fI\%Ruby\fP .INDENT 2.0 .IP \(bu 2 \fI\%RubyInstaller for Windows\fP をオススメします。 .UNINDENT .IP \(bu 2 \fI\%Git\fP: Windows用のGitクライアントはいくつかあります。例: .INDENT 2.0 .IP \(bu 2 \fI\%公式のGitパッケージ\fP .IP \(bu 2 \fI\%TortoiseGit\fP .IP \(bu 2 \fI\%Git for Windows\fP .IP \(bu 2 \fI\%GitHub Desktop\fP .UNINDENT .UNINDENT .UNINDENT .UNINDENT .SS リポジトリーからGroongaをチェックアウト .sp ユーザーはリリースされたソースアーカイブを使います。しかし、開発者はリポジトリーからGroongaをビルドするべきです。なぜなら、リポジトリーにあるソースコードが最新のソースコードだからです。 .sp Groongaのリポジトリーは \fI\%GitHub\fP にあります。リポジトリーから最新のソースコードをチェックアウトします: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > git clone \-\-recursive git@github.com:groonga/groonga.git .ft P .fi .UNINDENT .UNINDENT .SS \fBcmake\fP を実行 .sp あなたの環境用の \fBMakefile\fP を作る必要があります。 .sp \fBcmake\fP へオプションを渡してビルドパラメーターをカスタマイズできます。 .sp \fB\-G\fP オプションを指定する必要があります。有効な \fB\-G\fP の値は次の通りです。 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB"Visual Studio 12 2013"\fP: 32bitビルド用。 .IP \(bu 2 \fB"Visual Studio 12 2013 Win64"\fP: 64bitビルド用。 .UNINDENT .UNINDENT .UNINDENT .sp 開発者向けのオススメ \fBcmake\fP オプションは次の通りです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > cmake . \-G "Visual Studio 12 2013 Win64" \-DCMAKE_INSTALL_PREFIX=C:\eGroonga \-DGRN_WITH_MRUBY=on .ft P .fi .UNINDENT .UNINDENT .sp それぞれのオプションの説明です。 .sp \fB\-G "Visual Studio 12 2013 Win64"\fP .sp \fB\-DCMAKE_INSTALL_PREFIX=C:\eGroonga\fP .INDENT 0.0 .INDENT 3.5 ビルドしたGroongaを \fBC:\e\eGroonga\fP にインストールする、と指定しています。 .UNINDENT .UNINDENT .sp \fB\-DGRN_WITH_MRUBY=on\fP .INDENT 0.0 .INDENT 3.5 mrubyサポートを有効にします。この機能はデフォルトで無効になっていますが、開発者はこの機能を有効にするべきです。 .UNINDENT .UNINDENT .SS Groongaをビルド .sp これでGroongaをビルドできるようになりました。 .sp Visual Studioまたは \fBcmake \-\-build\fP を使えます。 .sp \fBcmake \-\-build\fP でGroongaをビルドするコマンドラインは次の通りです: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C > cmake \-\-build . \-\-config Debug .ft P .fi .UNINDENT .UNINDENT .SS 参考 .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB/contribution/development/test\fP .UNINDENT .UNINDENT .UNINDENT .SS Groonga 通信アーキテクチャ .SS GQTPでのアーキテクチャ .INDENT 0.0 .IP \(bu 2 comが外部からの接続を受け付ける。 .IP \(bu 2 comは1スレッド。 .IP \(bu 2 comがedgeを作る。 .IP \(bu 2 edgeは接続と1対1対応。 .IP \(bu 2 edgeはctxを含む。 .IP \(bu 2 workerはthreadと1対1対応。 .IP \(bu 2 workerは上限が個定数。 .IP \(bu 2 workerは、1つのedgeと結びつくことができる。 .IP \(bu 2 edgeごとにqueueを持つ。 .IP \(bu 2 msgはcomによって、edgeのqueueにenqueueされる。 edgeがworkerに結びついていないときは、同時に、ctx_newというqueueに、msgをenqueueした対象のedgeをenqueueする。 .UNINDENT .SS ユーザーと協力して開発をうまく進めていくための指針 .sp Groongaを使ってくれているユーザーと協力して 開発をうまく進めていくためにこうするといい、という事柄をまとめました。 まとめておくと、新しく開発に加わる人とも共有することができます。 .SS twitter編 .sp Groongaを使ってもらえるようにtwitterのアカウントGroongaを取得して 日々、リリースの案内をしたり、ユーザーサポートをしたりしています。 .sp リリースの案内に利用する場合には、やりとりを考えなくて良いですが、 複数人によるサポートをGroongaで行う場合に、どうサポートするのが 良いのか/どうしてそうするのかという共通認識を持っていないと一貫性のないサポートとなってしま います。 .sp twitterでサポートされている安心感からGroongaユーザーの拡大に繋げる ことができるようにサポートの際に気をつけることをまとめます。 .SS 過去のツイートはおさらいしておく .SS 理由 .sp 自分がツイートした内容を把握していない返信をされたら普通いい気はしません。 .SS 対応 .sp 過去のツイートをおさらいし、こうすれば良いという提案をできるのが望ましいです。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C 良い例: ○○だと原因は□□ですね。××すると大丈夫です。 .ft P .fi .UNINDENT .UNINDENT .SS こちらから情報を提供する .SS 理由 .sp 困っているユーザーが複数回ツイートして限られたなかで情報を提供してくれていることがあります。 その限られたツイートから解決方法が見つかればユーザーにとって余計な手間が少なくて済みます。 あれこれ情報提供を要求すると、ユーザーはそのぶん確認する作業が必要になります。 .SS 対応 .sp 最初に声をかけるときに解決策を1つか2つ提案できると望ましいです。ユーザーにあまり負担を感じさせないようにすると良いです。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C 良い例: ○○の場合は□□の可能性があるので、××を試してもらえますか? .ft P .fi .UNINDENT .UNINDENT .SS twitterでのやりとりはできるだけ他の場所(例えばredmine)へと誘導しない .SS 理由 .sp twitterは気軽につぶやけることが重要なので、気軽にできないことを相手に要求すると萎縮されてしまう可能性があります。 .sp いきなりredmineでバグ報告をお願いすると、しりごみしてしまうかもしれません。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C 駄目な例: 再現手順をMLかredmineに報告してもらえますか? .ft P .fi .UNINDENT .UNINDENT .sp Groonga関連で気軽につぶやけないとなると開発者は困っている人を見つけられないし、利用者は困ったままとなるので、双方にとって嬉しくない状態になってしまいます。 .SS 対応 .sp twitterでやりとりを完結できるようにします。 .SS クエリの実現 .sp Groongaのデータベースには大量のデータを格納し、その中から必要な部分を高速に取り出すことができます。必要な部分をGroongaのデータベースに問い合わせるためのクエリの表現と実行に関して、Groongaは複数の手段を用意しています。 .SS クエリ実行のためのインタフェース .sp Groongaは低機能で単純なライブラリインタフェースから、高機能で複雑なコマンドインタフェースまでいくつかの階層的なインタフェースをユーザプログラムに提供しています。 .sp クエリ実行のためのインタフェースも階層的なインタフェースのそれぞれに対応する形で用意されています。以下に低レイヤなインタフェースから順に説明します。 .SS DB_API .sp DB_APIは、Groongaデータベースを操作するための一群のC言語向けAPI関数を提供します。DB_APIはデータベースを構成する個々の部分に対する単純な操作関数を提供します。DB_APIの機能を組み合わせることによって複雑なクエリを実行することができます。後述のすべてのクエリインタフェースはDB_APIの機能を組み合わせることによって実現されています。 .SS grn_expr .sp grn_exprは、Groongaデータベースに対する検索処理や更新処理のための条件を表現するためのデータ構造で、複数の条件を再帰的に組み合わせてより複雑な条件を表現することができます。grn_exprによって表現されたクエリを実行するためには、grn_table_select()関数を使用します。 .SS Groonga実行ファイル .sp Groongaデータベースを操作するためのコマンドインタープリタです。渡されたコマンドを解釈し、実行結果を返します。コマンドの実処理はC言語で記述されます。ユーザがC言語で定義した関数を新たなコマンドとしてGroonga実行ファイルに組み込むことができます。各コマンドはいくつかの文字列引数を受け取り、これをクエリとして解釈して実行します。引数をgrn_exprとして解釈するか、別の形式として解釈してDB_APIを使ってデータベースを操作するかはコマンド毎に自由に決めることができます。 .SS grn_exprで表現できるクエリ .sp grn_exprは代入や関数呼び出しのような様々な操作を表現できますが、この中で検索クエリを表現するgrn_exprのことを特に条件式とよびます。条件式を構成する個々の要素を関係式と呼びます。条件式は一個以上の関係式か、あるいは条件式を論理演算子で結合したものです。 .sp 論理演算子は、以下の3種類があります。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C && (論理積) || (論理和) ! (否定) .ft P .fi .UNINDENT .UNINDENT .sp 関係式は、下記の11種類が用意されています。また、ユーザが定義した関数を新たな関係式として使うこともできます。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C equal(==) not_equal(!=) less(<) greater(>) less_equal(<=) greater_equal(>=) contain() near() similar() prefix() suffix() .ft P .fi .UNINDENT .UNINDENT .SS grn_table_select() .sp grn_table_select()関数は、grn_exprで表現された検索クエリを実行するときに使います。引数として、検索対象となるテーブル、クエリを表すgrn_expr、検索結果を格納するテーブル、それに検索にマッチしたレコードを検索結果にどのように反映するかを指定する演算子を渡します。演算子と指定できるのは下記の4種類です。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C GRN_OP_OR GRN_OP_AND GRN_OP_BUT GRN_OP_ADJUST .ft P .fi .UNINDENT .UNINDENT .sp GRN_OP_ORは、検索対象テーブルの中からクエリにマッチするレコードを検索結果テーブルに加えます。GRN_OP_OR以外の演算子は、検索結果テーブルが空でない場合にだけ意味を持ちます。GRN_OP_ANDは、検索結果テーブルの中からクエリにマッチしないレコードを取り除きます。GRN_OP_BUTは、検索結果テーブルの中からクエリにマッチするレコードを取り除きます。GRN_OP_ADJUSTは、検索結果テーブルの中でクエリにマッチするレコードに対してスコア値の更新のみを行います。 .sp grn_table_select()は、データベース上に定義されたテーブルや索引などを組み合わせて可能な限り高速に指定されたクエリを実行しようとします。 .SS 関係式 .sp 関係式は、検索しようとしているデータが満たすべき条件を、指定した値の間の関係として表現します。いずれの関係式も、その関係が成り立ったときに評価されるcallback、コールバック関数に渡されるargとを引数として指定することができます。callbackが与えられず、argのみが数値で与えられた場合はスコア値の係数とみなされます。主な関係式について説明します。 .SS equal(v1, v2, arg, callback) .sp v1の値とv2の値が等しいことを表します。 .SS not_equal(v1, v2, arg, callback) .sp v1の値とv2の値が等しくないことを表します。 .SS less(v1, v2, arg, callback) .sp v1の値がv2の値よりも小さいことを表します。 .SS greater(v1, v2, arg, callback) .sp v1の値がv2の値よりも大きいことを表します。 .SS less_equal(v1, v2, arg, callback) .sp v1の値がv2の値と等しいか小さいことを表します。 .SS greater_equal(v1, v2, arg, callback) .sp v1の値がv2の値と等しいか大きいことを表します。 .SS contain(v1, v2, mode, arg, callback) .sp v1の値がv2の値を含んでいることを表します。また、v1の値が要素に分解されるとき、それぞれの要素に対して二つ目の要素が一致するためのmodeとして下記のいずれかを指定することができます。 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C EXACT: v2の値もv1の値と同様に要素に分解したとき、それぞれの要素が完全に一致する(デフォルト) UNSPLIT: v2の値は要素に分解しない PREFIX: v1の値の要素がv2の値に前方一致する SUFFIX: v1の値の要素がv2の値に後方一致する PARTIAL: v1の値の要素がv2の値に中間一致する .ft P .fi .UNINDENT .UNINDENT .SS near(v1, v2, arg, callback) .sp v1の値の中に、v2の値の要素が接近して含まれていることを表します。(v2には値の配列を渡します) .SS similar(v1, v2, arg, callback) .sp v1の値とv2の値が類似していることを表します。 .SS prefix(v1, v2, arg, callback) .sp v1の値がv2の値に対して前方一致することを表します。 .SS suffix(v1, v2, arg, callback) .sp v1の値がv2の値に対して後方一致することを表します。 .SS クエリの実例 .sp grn_exprを使って様々な検索クエリを表現することができます。 .SS 検索例1 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var); grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1); grn_expr_append_obj(ctx, query, column, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1); grn_expr_append_op(ctx, query, GRN_OP_CALL, 3); result = grn_table_select(ctx, table, query, NULL, GRN_OP_OR); .ft P .fi .UNINDENT .UNINDENT .sp tableのcolumnの値がstringを含むレコードをresultに返します。columnの値が\(aqneedle in haystack\(aqであるレコードr1と、columnの値が\(aqhaystack\(aqであるレコードr2がtableに登録されていたとき、stringに\(aqneedle\(aqを指定したなら、レコードr1のみがヒットします。 .SS 検索例2 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var); grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1); grn_expr_append_obj(ctx, query, column1, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, exact, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, score1, GRN_OP_PUSH, 1); grn_expr_append_op(ctx, query, GRN_OP_CALL, 5); result = grn_table_select(ctx, table, query, NULL, GRN_OP_OR); grn_obj_close(ctx, query); GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var); grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1); grn_expr_append_obj(ctx, query, column2, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, exact, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, score2, GRN_OP_PUSH, 1); grn_expr_append_op(ctx, query, GRN_OP_CALL, 5); grn_table_select(ctx, table, query, result, GRN_OP_ADJUST); grn_obj_close(ctx, query); .ft P .fi .UNINDENT .UNINDENT .sp tableのcolumn1の値がstringにexactモードでヒットするレコードについて得られるスコア値にscore1を積算してresultにセットします。次に、resultにセットされたレコードのうち、column2の値がstringにexactモードでヒットするレコードについては、得られたスコア値にscore2を積算したものを、元のスコア値に加えます。 .SS 検索例3 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var); grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1); grn_expr_append_obj(ctx, query, column1, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, exact, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, score1, GRN_OP_PUSH, 1); grn_expr_append_op(ctx, query, GRN_OP_CALL, 5); result = grn_table_select(ctx, table, query, NULL, GRN_OP_OR); grn_obj_close(ctx, query); if (grn_table_size(ctx, result) < t1) { GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var); grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1); grn_expr_append_obj(ctx, query, column1, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, partial, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, score2, GRN_OP_PUSH, 1); grn_expr_append_op(ctx, query, GRN_OP_CALL, 3); grn_table_select(ctx, table, query, result, GRN_OP_OR); grn_obj_close(ctx, query); } .ft P .fi .UNINDENT .UNINDENT .sp tableのcolumn1の値がstringにexactモードでヒットするレコードについて得られるスコア値にscore1を積算してresultにセットします。得られた検索結果数がt1よりも小さい場合は、partialモードで再度検索し、ヒットしたレコードについて得られるスコア値にscore2を積算してresultに追加します。 .SS 検索例4 .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var); grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1); grn_expr_append_obj(ctx, query, column, GRN_OP_PUSH, 1); grn_expr_append_op(ctx, query, GRN_OP_CALL, 3); result = grn_table_select(ctx, table, query, NULL, GRN_OP_OR); .ft P .fi .UNINDENT .UNINDENT .sp tableのcolumnの値がstringに含まれるレコードをresultに返します。 columnの値が\(aqneedle\(aqであるレコードr1と、columnの値が\(aqhaystack\(aqであるレコードr2がtableに登録されていたとき、stringに\(aqhay in haystack\(aqを指定したなら、レコードr2のみがヒットします。 .SS リリース手順 .SS 前提条件 .sp リリース手順の前提条件は以下の通りです。 .INDENT 0.0 .IP \(bu 2 ビルド環境は Debian GNU/Linux (sid) .IP \(bu 2 コマンドラインの実行例はzsh .UNINDENT .sp 作業ディレクトリ例は以下を使用します。 .INDENT 0.0 .IP \(bu 2 GROONGA_DIR=$HOME/work/groonga .IP \(bu 2 GROONGA_CLONE_DIR=$HOME/work/groonga/groonga.clean .IP \(bu 2 GROONGA_ORG_PATH=$HOME/work/groonga/groonga.org .IP \(bu 2 CUTTER_DIR=$HOME/work/cutter .IP \(bu 2 CUTTER_SOURCE_PATH=$HOME/work/cutter/cutter .UNINDENT .SS ビルド環境の準備 .sp 以下にGroongaのリリース作業を行うために事前にインストール しておくべきパッケージを示します。 .sp なお、ビルド環境としては Debian GNU/Linux (sid)を前提として説明しているため、その他の環境では適宜読み替えて下さい。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo apt\-get install \-V debootstrap createrepo rpm mercurial python\-docutils python\-jinja2 ruby\-full mingw\-w64 g++\-mingw\-w64 mecab libmecab\-dev nsis gnupg2 dh\-autoreconf python\-sphinx bison .ft P .fi .UNINDENT .UNINDENT .sp Debian系(.deb)やRed Hat系(.rpm)パッケージのビルドには \fI\%Vagrant\fP を使用します。apt\-getでインストールできるのは古いバージョンなので、Webサイトから最新版をダウンロードしてインストールすることをおすすめします。 .sp Vagrantで使用する仮想化ソフトウェア(VirtualBox、VMwareなど)がない場合、合わせてインストールしてください。なお、VirtualBoxはsources.listにcontribセクションを追加すればapt\-getでインストールできます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cat /etc/apt/sources.list deb http://ftp.jp.debian.org/debian/ sid main contrib deb\-src http://ftp.jp.debian.org/debian/ sid main contrib % sudo apt\-get update % sudo apt\-get install virtualbox .ft P .fi .UNINDENT .UNINDENT .sp また、rubyのrakeパッケージを以下のコマンドによりインストールします。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo gem install rake .ft P .fi .UNINDENT .UNINDENT .SS パッケージ署名用秘密鍵のインポート .sp リリース作業ではRPMパッケージに対する署名を行います。 その際、パッケージ署名用の鍵が必要です。 .sp Groongaプロジェクトでは署名用の鍵をリリース担当者の公開鍵で暗号化してリポジトリのpackages/ディレクトリ以下へと登録しています。 .sp リリース担当者はリポジトリに登録された秘密鍵を復号した後に鍵のインポートを以下のコマンドにて行います。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages % gpg \-\-decrypt release\-key\-secret.asc.gpg.(担当者) > (復号した鍵 ファイル) % gpg \-\-import (復号した鍵ファイル) .ft P .fi .UNINDENT .UNINDENT .sp 鍵のインポートが正常終了すると gpg \-\-list\-keys でGroongaの署名用の鍵を確認することができます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C pub 1024R/F10399C0 2012\-04\-24 uid groonga Key (groonga Official Signing Key) sub 1024R/BC009774 2012\-04\-24 .ft P .fi .UNINDENT .UNINDENT .sp 鍵をインポートしただけでは使用することができないため、インポートした鍵に対してtrust,signを行う必要があります。 .sp 以下のコマンドを実行して署名を行います。(途中の選択肢は省略): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % gpg \-\-edit\-key packages@groonga.org gpg> trust gpg> sign gpg> save gpg> quit .ft P .fi .UNINDENT .UNINDENT .sp この作業は、新規にリリースを行うことになった担当者やパッケージに署名する鍵に変更があった場合などに行います。 .SS リリース作業用ディレクトリの作成 .sp Groongaのリリース作業ではリリース専用の環境下(コンパイルフラグ)でビルドする必要があります。 .sp リリース時と開発時でディレクトリを分けずに作業することもできますが、誤ったコンパイルフラグでリリースしてしまう危険があります。 .sp そのため、以降の説明では$GROONGA_DIR以下のディレクトリにリリース用の作業ディレクトリ(groonga.clean)としてソースコードをcloneしたものとして説明します。 .sp リリース用のクリーンな状態でソースコードを取得するために$GROONGA_DIRにて以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % git clone \-\-recursive git@github.com:groonga/groonga.git groonga.clean .ft P .fi .UNINDENT .UNINDENT .sp この作業はリリース作業ごとに行います。 .SS 変更点のまとめ .sp 前回リリース時からの変更点を$GROONGA_CLONE_DIR/doc/source/news.txtにまとめます。 ここでまとめた内容についてはリリースアナウンスにも使用します。 .sp 前回リリースからの変更履歴を参照するには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % git log \-p \-\-reverse $(git tag | tail \-1).. .ft P .fi .UNINDENT .UNINDENT .sp ログを^commitで検索しながら、以下の基準を目安として変更点を追記していきます。 .sp 含めるもの .INDENT 0.0 .IP \(bu 2 ユーザへ影響するような変更 .IP \(bu 2 互換性がなくなるような変更 .UNINDENT .sp 含めないもの .INDENT 0.0 .IP \(bu 2 内部的な変更(変数名の変更やらリファクタリング) .UNINDENT .SS Groongaのウェブサイトの取得 .sp GroongaのウェブサイトのソースはGroonga同様にgithubにリポジトリを置いています。 .sp リリース作業では後述するコマンド(make update\-latest\-release)にてトップページのバージョンを置き換えることができるようになっています。 .sp Groongaのウェブサイトのソースコードを$GROONGA_ORG_PATHとして取得するためには、$GROONGA_DIRにて以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % git clone git@github.com:groonga/groonga.org.git .ft P .fi .UNINDENT .UNINDENT .sp これで、$GROONGA_ORG_PATHにgroonga.orgのソースを取得できます。 .SS cutterのソースコード取得 .sp Groongaのリリース作業では、cutterに含まれるスクリプトを使用しています。 .sp そこであらかじめ用意しておいた$HOME/work/cutterディレクトリにてcutterのソースコードを以下のコマンドにて取得します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % git clone git@github.com:clear\-code/cutter.git .ft P .fi .UNINDENT .UNINDENT .sp これで、$CUTTER_SOURCE_PATHディレクトリにcutterのソースを取得できます。 .SS configureスクリプトの生成 .sp Groongaのソースコードをcloneした時点ではconfigureスクリプトが含まれておらず、そのままmakeコマンドにてビルドすることができません。 .sp $GROONGA_CLONE_DIRにてautogen.shを以下のように実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sh autogen.sh .ft P .fi .UNINDENT .UNINDENT .sp このコマンドの実行により、configureスクリプトが生成されます。 .SS configureスクリプトの実行 .sp Makefileを生成するためにconfigureスクリプトを実行します。 .sp リリース用にビルドするためには以下のオプションを指定してconfigureを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \e \-\-prefix=/tmp/local \e \-\-with\-launchpad\-uploader\-pgp\-key=(Launchpadに登録したkeyID) \e \-\-with\-groonga\-org\-path=$HOME/work/groonga/groonga.org \e \-\-enable\-document \e \-\-with\-ruby \e \-\-enable\-mruby \e \-\-with\-cutter\-source\-path=$HOME/work/cutter/cutter .ft P .fi .UNINDENT .UNINDENT .sp configureオプションである\-\-with\-groonga\-org\-pathにはGroongaのウェブサイトのリポジトリをcloneした場所を指定します。 .sp configureオプションである\-\-with\-cutter\-source\-pathにはcutterのソースをcloneした場所を指定します。 .sp 以下のようにGroongaのソースコードをcloneした先からの相対パスを指定することもできます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./configure \e \-\-prefix=/tmp/local \e \-\-with\-launchpad\-uploader\-pgp\-key=(Launchpadに登録したkeyID) \e \-\-with\-groonga\-org\-path=../groonga.org \e \-\-enable\-document \e \-\-with\-ruby \e \-\-enable\-mruby \e \-\-with\-cutter\-source\-path=../../cutter/cutter .ft P .fi .UNINDENT .UNINDENT .sp あらかじめpackagesユーザでpackages.groonga.orgにsshログインできることを確認しておいてください。 .sp ログイン可能であるかの確認は以下のようにコマンドを実行して行います。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ssh packages@packages.groonga.org .ft P .fi .UNINDENT .UNINDENT .SS make update\-latest\-releaseの実行 .sp make update\-latest\-releaseコマンドでは、OLD_RELEASE_DATEに前回のリリースの日付を、NEW_RELEASE_DATEに次回リリースの日付を指定します。 .sp 2.0.2のリリースを行った際は以下のコマンドを実行しました。:: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make update\-latest\-release OLD_RELEASE=2.0.1 OLD_RELEASE_DATE=2012\-03\-29 NEW_RELEASE_DATE=2012\-04\-29 .ft P .fi .UNINDENT .UNINDENT .sp これにより、clone済みのGroongaのWebサイトのトップページのソース(index.html,ja/index.html)やRPMパッケージのspecファイルのバージョン表記などが更新されます。 .SS make update\-filesの実行 .sp ロケールメッセージの更新や変更されたファイルのリスト等を更新するために以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make update\-files .ft P .fi .UNINDENT .UNINDENT .sp make update\-filesを実行すると新規に追加されたファイルなどが各種.amファイルへとリストアップされます。 .sp リリースに必要なファイルですので漏れなくコミットします。 .SS make update\-poの実行 .sp ドキュメントの最新版と各国語版の内容を同期するために、poファイルの更新を以下のコマンドにて実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make update\-po .ft P .fi .UNINDENT .UNINDENT .sp make update\-poを実行すると、doc/locale/ja/LC_MESSAGES以下の各種.poファイルが更新されます。 .SS poファイルの翻訳 .sp make update\-poコマンドの実行により更新した各種.poファイルを翻訳します。 .sp 翻訳結果をHTMLで確認するために、以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make \-C doc/locale/ja html % make \-C doc/locale/en html .ft P .fi .UNINDENT .UNINDENT .sp 確認が完了したら、翻訳済みpoファイルをコミットします。 .SS リリースタグの設定 .sp リリース用のタグを打つには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make tag .ft P .fi .UNINDENT .UNINDENT .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 タグを打った後にconfigureを実行することで、ドキュメント生成時のバージョン番号に反映されます。 .UNINDENT .UNINDENT .SS リリース用アーカイブファイルの作成 .sp リリース用のソースアーカイブファイルを作成するために以下のコマンドを$GROONGA_CLONE_DIRにて実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make dist .ft P .fi .UNINDENT .UNINDENT .sp これにより$GROONGA_CLONE_DIR/groonga\-(バージョン).tar.gzが作成されます。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 タグを打つ前にmake distを行うとversionが古いままになることがあります。 するとgroonga \-\-versionで表示されるバージョン表記が更新されないので注意が必要です。 make distで生成したtar.gzのversionおよびversion.shがタグと一致することを確認するのが望ましいです。 .UNINDENT .UNINDENT .SS パッケージのビルド .sp リリース用のアーカイブファイルができたので、パッケージ化する作業を行います。 .sp パッケージ化作業は以下の3種類を対象に行います。 .INDENT 0.0 .IP \(bu 2 Debian系(.deb) .IP \(bu 2 Red Hat系(.rpm) .IP \(bu 2 Windows系(.exe,.zip) .UNINDENT .sp パッケージのビルドではいくつかのサブタスクから構成されています。 .SS ビルド用パッケージのダウンロード .sp debパッケージのビルドに必要なパッケージをダウンロードするには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages/apt % make download .ft P .fi .UNINDENT .UNINDENT .sp これにより、lucid以降の関連する.debパッケージやソースアーカイブなどがカレントディレクトリ以下へとダウンロードされます。 .sp rpmパッケージのビルドに必要なパッケージをダウンロードするには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages/yum % make download .ft P .fi .UNINDENT .UNINDENT .sp これにより、GroongaやMySQLのRPM/SRPMパッケージなどがカレントディレクトリ以下へとダウンロードされます。 .sp windowsパッケージのビルドに必要なパッケージをダウンロードするには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages/windows % make download .ft P .fi .UNINDENT .UNINDENT .sp これにより、Groongaのインストーラやzipアーカイブがカレントディレクトリ以下へとダウンロードされます。 .sp sourceパッケージに必要なものをダウンロードするには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages/source % make download .ft P .fi .UNINDENT .UNINDENT .sp これにより過去にリリースしたソースアーカイブ(.tar.gz)が packages/source/filesディレクトリ以下へとダウンロードされます。 .SS Debian系パッケージのビルド .sp Groongaのpackages/aptサブディレクトリに移動して、以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages/apt % make build PALALLEL=yes .ft P .fi .UNINDENT .UNINDENT .sp make build PALALLEL=yesコマンドを実行すると、ディストリビューションのリリースとアーキテクチャの組み合わせでビルドを平行して行うことができます。 .sp 現在サポートされているのは以下の通りです。 .INDENT 0.0 .IP \(bu 2 Debian GNU/Linux .INDENT 2.0 .IP \(bu 2 wheezy i386/amd64 .IP \(bu 2 jessie i386/amd64 .UNINDENT .UNINDENT .sp 正常にビルドが終了すると$GROONGA_CLONE_DIR/packages/apt/repositories配下に.debパッケージが生成されます。 .sp make build ではまとめてビルドできないこともあります。 その場合にはディストリビューションごとやアーキテクチャごとなど、個別にビルドすることで問題が発生している箇所を切り分ける必要があります。 .sp 生成したパッケージへの署名を行うには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make sign\-packages .ft P .fi .UNINDENT .UNINDENT .sp リリース対象のファイルをリポジトリに反映するには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make update\-repository .ft P .fi .UNINDENT .UNINDENT .sp リポジトリにGnuPGで署名を行うために以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make sign\-repository .ft P .fi .UNINDENT .UNINDENT .SS Red Hat系パッケージのビルド .sp Groongaのpackages/yumサブディレクトリに移動して、以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages/yum % make build PALALLEL=yes .ft P .fi .UNINDENT .UNINDENT .sp make build PALALLEL=yesコマンドを実行すると、ディストリビューションのリリースとアーキテクチャの組み合わせでビルドを平行して行うことができます。 .sp 現在サポートされているのは以下の通りです。 .INDENT 0.0 .IP \(bu 2 centos\-5 i386/x86_64 .IP \(bu 2 centos\-6 i386/x86_64 .IP \(bu 2 centos\-7 i386/x86_64 .UNINDENT .sp ビルドが正常終了すると$GROONGA_CLONE_DIR/packages/yum/repositories配下にRPMパッケージが生成されます。 .INDENT 0.0 .IP \(bu 2 repositories/yum/centos/5/i386/Packages .IP \(bu 2 repositories/yum/centos/5/x86_64/Packages .IP \(bu 2 repositories/yum/centos/6/i386/Packages .IP \(bu 2 repositories/yum/centos/6/x86_64/Packages .IP \(bu 2 repositories/yum/centos/7/i386/Packages .IP \(bu 2 repositories/yum/centos/7/x86_64/Packages .UNINDENT .sp リリース対象のRPMに署名を行うには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make sign\-packages .ft P .fi .UNINDENT .UNINDENT .sp リリース対象のファイルをリポジトリに反映するには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make update\-repository .ft P .fi .UNINDENT .UNINDENT .SS Windows用パッケージのビルド .sp packages/windowsサブディレクトリに移動して、以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages/windows % make build % make package % make installer .ft P .fi .UNINDENT .UNINDENT .sp make releaseを実行することでbuildからuploadまで一気に実行することができますが、途中で失敗することもあるので順に実行することをおすすめします。 .sp make buildでクロスコンパイルを行います。 正常に終了するとdist\-x64/dist\-x86ディレクトリ以下にx64/x86バイナリを作成します。 .sp make packageが正常に終了するとzipアーカイブをfilesディレクトリ以下に作成します。 .sp make installerが正常に終了するとWindowsインストーラをfilesディレクトリ以下に作成します。 .SS パッケージの動作確認 .sp ビルドしたパッケージに対しリリース前の動作確認を行います。 .sp Debian系もしくはRed Hat系の場合には本番環境へとアップロードする前にローカルのaptないしyumのリポジトリを参照して正常に更新できることを確認します。 .sp ここでは以下のようにrubyを利用してリポジトリをwebサーバ経由で参照できるようにします。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ruby \-run \-e httpd \-\- packages/yum/repositories (yumの場合) % ruby \-run \-e httpd \-\- packages/apt/repositories (aptの場合) .ft P .fi .UNINDENT .UNINDENT .SS grntestの準備 .sp grntestを実行するためにはGroongaのテストデータとgrntestのソースが必要です。 .sp まずGroongaのソースを任意のディレクトリへと展開します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % tar zxvf groonga\-(バージョン).tar.gz .ft P .fi .UNINDENT .UNINDENT .sp 次にGroongaのtest/functionディレクトリ以下にgrntestのソースを展開します。 つまりtest/function/grntestという名前でgrntestのソースを配置します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ls test/function/grntest/ README.md binlib license test .ft P .fi .UNINDENT .UNINDENT .SS grntestの実行方法 .sp grntestではGroongaコマンドを明示的にしていすることができます。 後述のパッケージごとのgrntestによる動作確認では以下のようにして実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % GROONGA=(groongaのパス指定) test/function/run\-test.sh .ft P .fi .UNINDENT .UNINDENT .sp 最後にgrntestによる実行結果が以下のようにまとめて表示されます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C 55 tests, 52 passes, 0 failures, 3 not checked tests. 94.55% passed. .ft P .fi .UNINDENT .UNINDENT .sp grntestでエラーが発生しないことを確認します。 .SS Debian系の場合 .sp Debian系の場合の動作確認手順は以下の通りとなります。 .INDENT 0.0 .IP \(bu 2 旧バージョンをchroot環境へとインストールする .IP \(bu 2 chroot環境の/etc/hostsを書き換えてpackages.groonga.orgがホストを 参照するように変更する .IP \(bu 2 ホストでwebサーバを起動してドキュメントルートをビルド環境のもの (repositories/apt/packages)に設定する .IP \(bu 2 アップグレード手順を実行する .IP \(bu 2 grntestのアーカイブを展開してインストールしたバージョンでテストを実 行する .IP \(bu 2 grntestの正常終了を確認する .UNINDENT .SS Red Hat系の場合 .sp Red Hat系の場合の動作確認手順は以下の通りとなります。 .INDENT 0.0 .IP \(bu 2 旧バージョンをchroot環境へとインストール .IP \(bu 2 chroot環境の/etc/hostsを書き換えてpackages.groonga.orgがホストを参照するように変更する .IP \(bu 2 ホストでwebサーバを起動してドキュメントルートをビルド環境のもの(packages/yum/repositories)に設定する .IP \(bu 2 アップグレード手順を実行する .IP \(bu 2 grntestのアーカイブを展開してインストールしたバージョンでテストを実行する .IP \(bu 2 grntestの正常終了を確認する .UNINDENT .SS Windows向けの場合 .INDENT 0.0 .IP \(bu 2 新規インストール/上書きインストールを行う .IP \(bu 2 grntestのアーカイブを展開してインストールしたバージョンでテストを実行する .IP \(bu 2 grntestの正常終了を確認する .UNINDENT .sp zipアーカイブも同様にしてgrntestを実行し動作確認を行います。 .SS リリースアナウンスの作成 .sp リリースの際にはリリースアナウンスを流して、Groongaを広く通知します。 .sp news.txtに変更点をまとめましたが、それを元にリリースアナウンスを作成します。 .sp リリースアナウンスには以下を含めます。 .INDENT 0.0 .IP \(bu 2 インストール方法へのリンク .IP \(bu 2 リリースのトピック紹介 .IP \(bu 2 リリース変更点へのリンク .IP \(bu 2 リリース変更点(news.txtの内容) .UNINDENT .sp リリースのトピック紹介では、これからGroongaを使う人へアピールする点や既存のバージョンを利用している人がアップグレードする際に必要な情報を提供します。 .sp 非互換な変更が含まれるのであれば、回避方法等の案内を載せることも重要です。 .sp 参考までに過去のリリースアナウンスへのリンクを以下に示します。 .INDENT 0.0 .IP \(bu 2 [Groonga\-talk] [ANN] Groonga 2.0.2 .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%http://sourceforge.net/mailarchive/message.php?msg_id=29195195\fP .UNINDENT .UNINDENT .UNINDENT .IP \(bu 2 [groonga\-dev,00794] [ANN] Groonga 2.0.2 .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fI\%http://osdn.jp/projects/groonga/lists/archive/dev/2012\-April/000794.html\fP .UNINDENT .UNINDENT .UNINDENT .UNINDENT .SS パッケージのアップロード .sp 動作確認が完了し、Debian系、Red Hat系、Windows向け、ソースコードそれぞれにおいてパッケージやアーカイブのアップロードを行います。 .sp Debian系のパッケージのアップロードには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages/apt % make upload .ft P .fi .UNINDENT .UNINDENT .sp Red Hat系のパッケージのアップロードには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages/yum % make upload .ft P .fi .UNINDENT .UNINDENT .sp Windows向けのパッケージのアップロードには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages/windows % make upload .ft P .fi .UNINDENT .UNINDENT .sp ソースアーカイブのアップロードには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages/source % make upload .ft P .fi .UNINDENT .UNINDENT .sp アップロードが正常終了すると、リリース対象のリポジトリデータやパッケージ、アーカイブ等がpackages.groonga.orgへと反映されます。 .SS Ubuntu用パッケージのアップロード .sp Ubuntu向けのパッケージのアップロードには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % cd packages/ubuntu % make upload .ft P .fi .UNINDENT .UNINDENT .sp 現在サポートされているのは以下の通りです。 .INDENT 0.0 .IP \(bu 2 precise i386/amd64 .IP \(bu 2 trusty i386/amd64 .IP \(bu 2 vivid i386/amd64 .UNINDENT .sp アップロードが正常終了すると、launchpad.net上でビルドが実行され、ビルド結果がメールで通知されます。ビルドに成功すると、リリース対象のパッケージがlaunchpad.netのGroongaチームのPPAへと反映されます。公開されているパッケージは以下のURLで確認できます。 .INDENT 0.0 .INDENT 3.5 \fI\%https://launchpad.net/~groonga/+archive/ubuntu/ppa\fP .UNINDENT .UNINDENT .SS blogroonga(ブログ)の更新 .sp \fI\%http://groonga.org/blog/\fP および \fI\%http://groonga.org/blog/\fP にて公開されているリリース案内を作成します。 .sp 基本的にはリリースアナウンスの内容をそのまま記載します。 .sp cloneしたWebサイトのソースに対して以下のファイルを新規追加します。 .INDENT 0.0 .IP \(bu 2 groonga.org/en/_post/(リリース日)\-release.md .IP \(bu 2 groonga.org/ja/_post/(リリース日)\-release.md .UNINDENT .sp 編集した内容をpushする前に確認したい場合にはJekyllおよびRedCloth(Textileパーサー)、RDiscount(Markdownパーサー)、JavaScript interpreter(therubyracer、Node.jsなど)が必要です。 インストールするには以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo gem install jekyll RedCloth rdiscount therubyracer .ft P .fi .UNINDENT .UNINDENT .sp jekyllのインストールを行ったら、以下のコマンドでローカルにwebサーバを起動します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % jekyll serve \-\-watch .ft P .fi .UNINDENT .UNINDENT .sp あとはブラウザにてhttp://localhost:4000にアクセスして内容に問題がないかを確認します。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 記事を非公開の状態でアップロードするには.mdファイルのpublished:をfalseに設定します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C \-\-\- layout: post.en title: Groonga 2.0.5 has been released published: false \-\-\- .ft P .fi .UNINDENT .UNINDENT .UNINDENT .UNINDENT .SS ドキュメントのアップロード .sp doc/source以下のドキュメントを更新、翻訳まで完了している状態で、ドキュメントのアップロード作業を行います。 .sp そのためにはまず以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make update\-document .ft P .fi .UNINDENT .UNINDENT .sp これによりcloneしておいたgroonga.orgのdoc/locale以下に更新したドキュメントがコピーされます。 .sp 生成されているドキュメントに問題のないことを確認できたら、コミット、pushしてgroonga.orgへと反映します。 .SS Homebrewの更新 .sp OS Xでのパッケージ管理方法として \fI\%Homebrew\fP があります。 .sp Groongaを簡単にインストールできるようにするために、Homebrewへpull requestを送ります。 .INDENT 0.0 .INDENT 3.5 \fI\%https://github.com/mxcl/homebrew\fP .UNINDENT .UNINDENT .sp すでにGroongaのFormulaは取り込まれているので、リリースのたびにFormulaの内容を更新する作業を実施します。 .sp Groonga 3.0.6のときは以下のように更新してpull requestを送りました。 .INDENT 0.0 .INDENT 3.5 \fI\%https://github.com/mxcl/homebrew/pull/21456/files\fP .UNINDENT .UNINDENT .sp 上記URLを参照するとわかるようにソースアーカイブのurlとsha1チェックサムを更新します。 .SS リリースアナウンス .sp 作成したリリースアナウンスをメーリングリストへと流します。 .INDENT 0.0 .IP \(bu 2 groonga\-dev \fI\%groonga\-dev@lists.osdn.me\fP .IP \(bu 2 Groonga\-talk \fI\%groonga\-talk@lists.sourceforge.net\fP .UNINDENT .SS Twitterでリリースアナウンスをする .sp blogroongaのリリースエントリには「リンクをあなたのフォロワーに共有する」ためのツイートボタンがあるので、そのボタンを使ってリリースアナウンスします。(画面下部に配置されている) .sp このボタンを経由する場合、ツイート内容に自動的にリリースタイトル(「groonga 2.0.8リリース」など)とblogroongaのリリースエントリのURLが挿入されます。 .sp この作業はblogroongaの英語版、日本語版それぞれで行います。 あらかじめgroongaアカウントでログインしておくとアナウンスを円滑に行うことができます。 .sp 以上でリリース作業は終了です。 .SS リリース後にやること .sp リリースアナウンスを流し終えたら、次期バージョンの開発が始まります。 .INDENT 0.0 .IP \(bu 2 Groonga プロジェクトの新規バージョン追加 .IP \(bu 2 Groonga のbase_versionの更新 .UNINDENT .SS Groonga プロジェクトの新規バージョン追加 .sp \fI\%Groonga プロジェクトの設定ページ\fP にて新規バージョンを追加します。(例: release\-2.0.6) .SS Groonga バージョン更新 .sp $GROONGA_CLONE_DIRにて以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make update\-version NEW_VERSION=2.0.6 .ft P .fi .UNINDENT .UNINDENT .sp これにより$GROONGA_CLONE_DIR/base_versionが更新されるのでコミットしておきます。 .sp \fB注釈:\fP .INDENT 0.0 .INDENT 3.5 base_versionはtar.gzなどのリリース用のファイル名で使用します。 .UNINDENT .UNINDENT .SS ビルド時のTIPS .SS ビルドを並列化したい .sp make build PALALLEL=yesを指定するとchroot環境で並列にビルドを 実行できます。 .SS 特定の環境向けのみビルドしたい .sp Debian系の場合、CODES,ARCHITECTURESオプションを明示的に指定することで、特定のリリース、アーキテクチャのみビルドすることができます。 .sp squeezeのi386のみビルドしたい場合には以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make build ARCHITECTURES=i386 CODES=squeeze .ft P .fi .UNINDENT .UNINDENT .sp buildコマンド以外でも build\-package\-deb build\-repository\-debなどのサブタスクでもARCHITECTURES,CODES指定は有効です。 .sp Red Hat系の場合、ARCHITECTURES,DISTRIBUTIONSオプションを明示的に指定することで、特定のリリース、アーキテクチャのみビルドすることができます。 .sp fedoraのi386のみビルドしたい場合には以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make build ARCHITECTURES=i386 DISTRIBUTIONS=fedora .ft P .fi .UNINDENT .UNINDENT .sp buildコマンド以外でも build\-in\-chroot build\-repository\-rpmなどのサブタスクでもARCHITECTURES,DISTRIBUTIONSの指定は有効です。 .sp centosの場合、CENTOS_VERSIONSを指定することで特定のバージョンのみビルドすることができます。 .SS パッケージの署名用のパスフレーズを知りたい .sp パッケージの署名に必要な秘密鍵のパスフレーズについては リリース担当者向けの秘密鍵を復号したテキストの1行目に記載してあります。 .SS バージョンを明示的に指定してドキュメントを生成したい .sp リリース後にドキュメントの一部を差し替えたい場合、特に何も指定しないと生成したHTMLに埋め込まれるバージョンが「v3.0.1\-xxxxxドキュメント」となってしまうことがあります。gitでのコミット時ハッシュの一部が使われるためです。 .sp これを回避するには、以下のようにDOCUMENT_VERSIONやDOCUMENT_VERSION_FULLを明示的に指定します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % make update\-document DOCUMENT_VERSION=3.0.1 DOCUMENT_VERSION_FULL=3.0.1 .ft P .fi .UNINDENT .UNINDENT .SS テスト方法 .sp TODO: Write in English. .sp TODO: Write about \fBtest/command/run\-test.sh\fP\&. .SS テスト環境の構築 .SS Cutterのインストール .sp Groongaは、テストのフレームワークとして \fI\%Cutter\fP を用いています。 .sp Cutterのインストール方法は \fI\%プラットフォーム毎のCutterのインストール方法\fP をご覧下さい。 .SS lcovのインストール .sp カバレッジ情報を計測するためには、lcov 1.6以上が必要です。DebianやUbuntuでは以下のようにしてインストールできます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo aptitude install \-y lcov .ft P .fi .UNINDENT .UNINDENT .SS clangのインストール .sp ソースコードの静的解析を行うためには、clang(scan\-build)をインストールする必要があります。DebianやUbuntuでは以下のようにしてインストールできます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo aptitude install \-y clang .ft P .fi .UNINDENT .UNINDENT .SS libmemcachedのインストール .sp memcachedのバイナリプロトコルのテストを動作させるためには、libmemcachedの導入が必要です。squeeze以降のDebianやKarmic以降のUubntuでは以下の用にしてインストールできます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % sudo aptitude install \-y libmemcached\-dev .ft P .fi .UNINDENT .UNINDENT .SS テストの動作 .sp Groongaのトップディレクトリで、以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C make check .ft P .fi .UNINDENT .UNINDENT .SS カバレッジ情報 .sp Groongaのトップディレクトリで、以下のコマンドを実行します。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C make coverage .ft P .fi .UNINDENT .UNINDENT .sp すると、coverageディレクトリ以下に、カバレッジ情報が入ったhtmlが出力されます。 .sp カバレッジには、Lines/Functions/Branchesの3つの対象があります。それぞれ、行/関数/分岐に対応します。Functionsがもっとも重要な対象です。すべての関数がテストされるようになっていることを心がけてください。 .sp テストがカバーしていない部分の編集は慎重に行ってください。また、テストがカバーしている部分を増やすことも重要です。 .SS 様々なテスト .sp テストは、test/unitディレクトリにおいて、./run\-test.shを実行することによっても行えます。run\-test.shはいくつかのオプションをとります。詳細は、./run\-test.sh \-\-helpを実行しヘルプをご覧ください。 .SS 特定のテスト関数のみテストする .sp 特定のテスト関数(Cutterではテストと呼ぶ)のみをテストすることができます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./run\-test.sh \-n test_text_otoj .ft P .fi .UNINDENT .UNINDENT .SS 特定のテストファイルのみテストする .sp 特定のテストファイル(Cutterではテストケースと呼ぶ)のみテストすることができます。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % ./run\-test.sh \-t test_string .ft P .fi .UNINDENT .UNINDENT .SS 不正メモリアクセス・メモリリーク検出 .sp 環境変数CUTTER_CHECK_LEAKをyesと設定すると、valgrindを用いて不正メモリアクセスやメモリリークを検出しつつ、テストを動作させることができます。 .sp run\-test.shのみならず、make checkでも利用可能です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % CUTTER_CHECK_LEAK=yes make check .ft P .fi .UNINDENT .UNINDENT .SS デバッガ上でのテスト実行 .sp 環境変数CUTTER_DEBUGをyesと設定すると、テストが実行できる環境が整ったgdbが実行されます。gdb上でrunを行うと、テストの実行が開始されます。 .sp run\-test.shのみならず、make checkでも利用可能です。 .sp 実行例: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % CUTTER_DEBUG=yes make check .ft P .fi .UNINDENT .UNINDENT .SS 静的解析 .sp scan\-buildを用いて、ソースコードの静的解析を行うことができます。scan_buildというディレクトリに解析結果のhtmlが出力されます。: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C % scan\-build ./configure \-\-prefix=/usr % make clean % scan\-build \-o ./scan_build make \-j4 .ft P .fi .UNINDENT .UNINDENT .sp configureは1度のみ実行する必要があります。 .INDENT 0.0 .IP \(bu 2 genindex .IP \(bu 2 modindex .IP \(bu 2 search .UNINDENT .SH AUTHOR Groonga Project .SH COPYRIGHT 2009-2015, Brazil, Inc .\" Generated by docutils manpage writer. .