Groongaで学ぶ全文検索 2016-03-25 - Groonga | Doorkeeperのメモ。
目的
- PDFのテキストを検索したい
- Groongaは手段
おおまかな流れ
-
- インデックスを作る
- 毎回grep(シーケンシャル検索)するのは遅い
-
- 検索する
こまかい流れ
1. インデックスを作る
- 1-1. 生データ用のテーブルを作る
- 1-2. PDFからテキスト(生データ)を抽出する
- 1-3. 生データをテーブルに入れる
- 1-4. インデックス用のテーブルを作る
- すでにデータが入っているので、テーブルを作成したタイミングでインデックスが作成される(静的インデックス構築)。
- 先にインデックス用のテーブルを作成した場合、データを入れたタイミングで都度インデックスが作成される(動的インデックス構築)。
1-1. 生データ用のテーブルを作る
- テーブル
-
TABLE_HASH_KEY
が無難 - キーにはPDFファイルのフルパスを入れる
- 重複しないならファイル名だけでも可
-
- カラム
- bodyカラム
- PDFから抽出したテキストを入れる
- 型に注意
1-2. PDFからテキスト(生データ)を抽出する
-
Popplerなどを使う
- Popplerに付属している
pdftotext
コマンドでPDFからテキストを取り出せる - Ruby/Popplerを使えばRubyらしい書き方でPopplerを使える
- 参考: Ruby で PDF と戯れるの巻 - Qiita
- Popplerに付属している
- Origamiというgemもある
1-3. 生データをテーブルに入れる
- Groongaにデータを入れるloadコマンドはJSON形式
- エスケープが必要
- 抽出してエスケープしてGroongaのコマンドを出力するスクリプトを書けばコピペしなくて済む
1-4. インデックス用のテーブルを作る
- はじめのうちはおすすめ設定のテンプレを使おう
- テーブル
-
TABLE_PAT_KEY
- パトリシアトライ
-
TokenBigram
- N-gramの一種
-
NormalizerAuto
- 全角半角や大文字小文字を正規化
-
- カラム
-
COLUMN_INDEX
- インデックスカラム
-
WITH_POSITOIN
- 位置情報(文書内のどこに出現したか)をインデックスに含めるかどうか
-
2. 検索する
-
select
コマンド -
--query
オプションでキーワードを指定 -
--output_collumn
オプションでほしいカラムを指定
まとめ
- GroongaでPDF検索を実現できる
-
HonyomiというGroongaを使ったPDFの全文検索エンジンがあるので、一から作らなくてもHonyomiを使えばいいかも
- GitHubにソースコードが公開されているのでカスタマイズも可