[groonga-dev,03340] Re: インデックスの情報を詳細出力する方法

Back to archive index

Kouhei Sutou kou****@clear*****
2015年 7月 3日 (金) 21:41:01 JST


須藤です。

In <CA+Tq****@mail*****>
  "[groonga-dev,03339] インデックスの情報を詳細出力する方法" on Fri, 3 Jul 2015 11:44:18 +0900,
  Hiroyuki Sato <hiroy****@gmail*****> wrote:

> おかげさまでGroongaの仕組みを詳しく理解することができました。

よかったです!

> https://gist.github.com/hiroyuki-sato/27142229622c74803069

> Groongaの場合、TokenBigramを指定しても2文字ずつに分解を行うのは非ASCII文字の場合のみである。

が少し説明不足で、正規化処理が行われたときだけ↑の挙動になり
ます。正規化処理をしない場合はASCIIの文字も2文字ずつに分解し
ます。

> * 文字がASCIIの場合: 単語単位に分割??(ここ怪しい)

補足すると、連続するアルファベットを1トークンにする(1文字の
トークンにもなりえるし、3文字以上のトークンにもなりえる)、
が実際の挙動です。同様に連続する数字も1トークン、連続する記
号も1トークンにします。

> selectコマンド等で、POSITIONの情報や全てのRecordの_idを出力する方法は
> ありますでしょうか?

selectコマンドではできないんです。
Rroongaにgroonga-index-dumpという実行ファイル(コマンドなん
ですが、Groongaのコマンドと紛らわしいのでここでは実行ファイ
ルと書きます)があって、それを使うと出力できます。

  % groonga-index-dump --output-directory /tmp/index-dump DB_PATH

というように使います。そうすると、/tmp/index-dump/ディレクト
リー以下にモリモリとファイルができます。1トークン1ファイルに
なっていて、その中にそのトークンのPOSITION情報やレコードのキー
(_idではないです)が出力されます。

例えば、るりまサーチというやつのデータベースだとこんな感じの
ファイルができます。(トークンはURLのように%エンコードされて
ファイル名になります。)

/tmp/index-dump/Bigram.Entries_description/%21%2A%22%29.dump:
--
index: Bigram.Entries_description       term: <!*")>    domain: Bigram  range: Entries  have_section: false     have_weight: false      have_position: true
  weight        position        term_frequency  record
  0     360     2       Entries[1.9.3:DL::Importer#bind:bind(signature, *opts) { ... } -> DL::Function].description
  0     389     2       Entries[1.9.3:DL::Importer#bind:bind(signature, *opts) { ... } -> DL::Function].description
  0     360     2       Entries[2.0.0:DL::Importer#bind:bind(signature, *opts) { ... } -> DL::Function].description
  0     389     2       Entries[2.0.0:DL::Importer#bind:bind(signature, *opts) { ... } -> DL::Function].description
  0     360     2       Entries[2.0.0:Fiddle::Importer#bind:bind(signature, *opts) { ... } -> Fiddle::Function].description
  0     389     2       Entries[2.0.0:Fiddle::Importer#bind:bind(signature, *opts) { ... } -> Fiddle::Function].description
  0     360     2       Entries[2.1.0:DL::Importer#bind:bind(signature, *opts) { ... } -> DL::Function].description
  0     389     2       Entries[2.1.0:DL::Importer#bind:bind(signature, *opts) { ... } -> DL::Function].description
  0     360     2       Entries[2.1.0:Fiddle::Importer#bind:bind(signature, *opts) { ... } -> Fiddle::Function].description
  0     389     2       Entries[2.1.0:Fiddle::Importer#bind:bind(signature, *opts) { ... } -> Fiddle::Function].description
--

> 下記のTermsテーブル・カラムにはインデックスのキーワードがマッチする、
> Bookテーブルの_idと、レコード内の単語の位置が格納されると思います。
> 
> 例えば、Groongaという単語は、ISBN2の0文字目、ISBN6の8文字目にあるので、
> [ISBN2,0], [ISBN6,8]という情報を保持していることになると思います。
> 
> select文等を使ってその内容を確認したいのですが可能でしょうか?

ということで、selectではできないのですが、groonga-index-dump
を使うと可能です。

> 下記のクエリだとgroongaは[3,"groonga",4]となっており1件の情報のみしか表示されておりません。

実は、selectでインデックスカラムを出力すると、そのトークンで
検索したときに何件くらいレコードがヒットしそうかという推定値
が返ります。この挙動は今後変わるかもしれないんですが、今は
(というかもうずっと)この挙動になっています。

--
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/




groonga-dev メーリングリストの案内
Back to archive index