Rust製の全文検索エンジンライブラリ(tantivy bayard)を試してみた
- 2. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
2
目次
1. 自己紹介
2. 全文検索エンジンについて
3. Tantivy(タエンティビィ)について
4. Tantivy-CLIを試してみた(Mac)
5. Bayard(バイヤール)の特徴について
6. Bayard-RESTを試してみた(Docker)
7. Bayardの使い方・まとめ
- 3. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
3
1. 自己紹介
出身地は佐賀です。三重県から地方勤務で虎の穴ラボの通販のチーム
にいます。
(2020年12月入社、二児の父です。)
全般的にフロントエンドは得意、バックエンドの知識は古めです。
推し
・南條愛乃(FripSideのVocal)
・Node.js/Java
・Nuxt.js
- 5. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
2. 全文検索エンジンについて
クラウドだと「Amazon Elasticsearch Service」や「Azure
Cognitive Search」など、さまざまな選択肢があると思います。
今回は、虎の穴ラボの社内のWebツールに導入できそうな、
簡易的な全文検索エンジンにどのようなものがあるか調べた際に見つけ
た「Tantivy/Bayard」という2つのRust製の全文検索エンジンを試し
てみました。
5
- 6. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
3. Tantivyについて
Rustで記述された、全文検索エンジンライブラリです。
高速で軽量(起動時間が短い)のが特徴です。
日本語(中国語、韓国語も)に対応(設定が必要)していて、
Apache Lucene(Elastic Search等)と似た設計になっている
欠点:分散検索できない
(複数のDBに異なるデータを置いて、必要なDBを選択して検索的なこと)
https://github.com/tantivy-search/tantivy
6
- 7. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
3. Tantivyについて
ベンチマーク
https://tantivy-search.github.io/bench/
(Luceneの約半分ぐらいの速度で検索できる)
(一部、Luceneより遅い条件もあります)
7
- 9. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
4. Tantivy-CLIが提供されてた😆
これだと、Rust使えなくても試せそうなので、早速、試してみる。
(最初にMacにRustをインストールします)
9
$ brew install rust
$ cargo install tantivy-cli
$ echo "export PATH="$HOME/.cargo/bin:$PATH"" >> ~/.zshrc
$ source ~/.zshrc
$ mkdir wikipedia-index
$ tantivy new -i wikipedia-index
# ドキュメントのプロパティ(title, body, url)の設定を対話式で作る(後ほど、スピーカーノート参照)
$ curl -OL http://fulmicoton.com/tantivy-files/wiki-articles-1000.json
$ cat wiki-articles-1000.json | tantivy index -i ./wikipedia-index # 11MB、一瞬で解析が終わる
$ tantivy serve -i wikipedia-index # サーバの起動
listening on http://localhost:3000
- 10. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
検索結果を表示する(HTTP)
10
HTTPリクエストで検索ができる。下記のURLをブラウザで開くと、、、
http://localhost:3000/api/?q=barack+obama&nhits=20
http://localhost:3000/api/?q=%2Bbarack%20%2Bobama&nhits=20
http://localhost:3000/api/?q=-barack%20%2Bobama&nhits=20
http://localhost:3000/api/?q=%22barack%20obama%22&nhits=20
検索結果がブラウザに JSONで表示されます🎊
(JSONを返すHTTPサーバが内包されている)
- 11. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
検索結果を表示する(CLI)
11
$ tantivy search -i wikipedia-index -q "barack obama"
検索結果がコンソールに JSONで表示されます
🎉
(こちらは、サーバの立ち上げが不要!です)
- 12. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
どうやってるのか?(コマンドの解説)
$ tantivy new -i wikipedia-index
→ RDBで例えると、テーブルのカラム情報を対話式で作る
→ サンプルのwikipedia-indexテーブルにはtitle列、body列、url列があって、検索
Indexを付与するか?しないか?とか指定する感じ
$ cat wiki-articles-1000.json | tantivy index -i ./wikipedia-index
→ RDBで例えると、テーブルにデータを入れる(Insert)
→ wikipedia-indexテーブルにJSONのtitle属性、body属性、url属性のデータリストを
入れるよ😉
12
- 13. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
どうやってるのか?(コマンドの解説)
対話式でカラム情報を作るところを細かく
$ tantivy new -i wikipedia-index
New field name ? title ← カラム名
Choose Field Type (Text/u64/i64/f64/Date/Facet/Bytes) ? Text ← テキスト情報だよ
Should the field be stored (Y/N) ? Y ← フィールドを保存するか?
Should the field be indexed (Y/N) ? Y ← フィールドにインデックスを付与するか?
Should the term be tokenized? (Y/N) ? Y ← 全文検索のための解析をするか?
Should the term frequencies (per doc) be in the index (Y/N) ? Y ← ドキュメントごとの頻度をイ
ンデックスに含める必要があるか?
Should the term positions (per doc) be in the index (Y/N) ? Y ← ドキュメントごとの位置をイン
デックスに含める必要があるか?
Add another field (Y/N) ? Y ← 他のフィールドの作成も必要か?
13
- 14. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
どうやってるのか?(コマンドの解説)
登録するJSONデータについて(例:1行だけ
{
"url":"https://en.wikipedia.org/wiki?curid=48687903",
"title":"Jeon Hye-jin (actress, born 1988)",
"body":"nJeon Hye-jin (actress, born 1988)nnJeon Hye-jin (born June 17,
1988) is a South Korean actress.nPersonal life.nJeon married his "Smile, You"
co-star Lee Chun-hee on March 11, 2011. Their daughter, Lee So Yu, was born on
July 30, 2011.nn"
}
14
対話で作ったカラム名と JSONの属性名を合わ
せて、
格納するデータの形式を合わせる
(とりあえず、JSON突っ込めば良いわけではない)
- 17. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
Bayardについて
Raft Consensus Algorithm と gRPC を実装する、
Rustで記述された全文検索およびインデックス作成のサーバー
です。
前述のTantivyをベースに開発されていて
Bayardを使用すると、高可用性を備えた全文検索アプリケー
ションを簡単に開発できます。
17
- 18. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
5. Bayardの特徴について
GitHubからの引用ですが、下記のようなことができます。
• 全文検索/索引付け(日本語対応)ができる
• REST APIが利用できる
• コマンドライン・インターフェイスが利用できる
• インデックスの複製ができる
• クラスターを立ち上げる
日本語対応には「Lindera(Rust製日本語形態素解析)」が使わ
れています
18
- 19. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
6. Bayard-RESTを試してみた
1. GitHubからソースコードをクローンする
(BayardのGitHubのリポジトリをクローンして、クローンしたディレクトリに移動します。)
19
$ git clone https://github.com/bayard-search/bayard.git # クローンする
$ cd bayard
- 20. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
6. Bayard-RESTを試してみた
2. docker-compose.ymlのスキーマファイルの指定を英語から日本語に変える
→ スキーマファイルはTantivyの時に対話式で作った部分
→ デフォルトで英語のスキーマのサンプルを読み込んで起動するので、日本語のスキーマのサンプルに変え
ます(変更点は以下のオレンジ色の箇所です。)
20
version: '3'
services:
bayard:
container_name: bayard
volumes:
- ./examples/schema_ja.json:/etc/bayard/schema_ja.json # 日本語のサンプルスキーマをマウ
ント
command:
:
:
:
- '--schema-file=/etc/bayard/schema_ja.json' # マウントしたスキーマを指定
:
- 21. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
6. Bayard-RESTを試してみた
3. 起動して日本語のサンプルデータを登録し、全文検索します
→ 日本語のスキーマのサンプルに合わせたテストデータが用意されているため、そのデータを登録します。
登録した後には、必ず、commitが必要です。
21
$ docker-compose up -d # dockerコンテナ起動
$ curl -X PUT
--header 'Content-Type: application/json'
--data-binary @./examples/doc_ja.json
'http://localhost:8000/v1/documents/1' # サンプルデータ登録
$ curl -X GET 'http://localhost:8000/v1/commit' # 登録をコミット
$ curl -X POST 'http://localhost:8000/v1/search' --data-binary 'description:検索' # 「検索」で全文
検索する
{"_id":["1"],"description":["検索エンジン(けんさくエンジン、英: search engine)は、狭義にはイン
ターネットに存在する情報(ウェブページ、ウェブサイト、画像ファイル、ネットニュースなど)を検索する機能
およびそのプログラム。インターネットの普及初期には、検索としての機能のみを提供していたウェブサイト
そのものを検索エンジンと呼んだが、現在では様々なサービスが加わったポータルサイト化が進んだた
め、検索をサービスの一つとして提供するウェブサイトを単
- 22. 虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
7. Bayardの使い方・まとめ
実際に使う際には検索画面などの
フロントエンド開発に加えて、
初期データを登録するバッチプログラムや、全文検索データを更新し
たい時に差分登録するプログラムなどが必要になります。
REST APIが用意されているため、バックエンドの開発がなくても良いの
は、
お手軽に日本語の全文検索エンジンを試せるので、良い感じで
す!
22