SlideShare une entreprise Scribd logo
1  sur  23
Télécharger pour lire hors ligne
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
全文検索エンジン(Tantivy/Bayard)
を試してみた!!
虎の穴ラボ 古賀広隆
1
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
2
目次
1. 自己紹介
2. 全文検索エンジンについて
3. Tantivy(タエンティビィ)について
4. Tantivy-CLIを試してみた(Mac)
5. Bayard(バイヤール)の特徴について
6. Bayard-RESTを試してみた(Docker)
7. Bayardの使い方・まとめ
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
3
1. 自己紹介
出身地は佐賀です。三重県から地方勤務で虎の穴ラボの通販のチーム
にいます。
(2020年12月入社、二児の父です。)
全般的にフロントエンドは得意、バックエンドの知識は古めです。
推し
・南條愛乃(FripSideのVocal)
・Node.js/Java
・Nuxt.js
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
みなさま、全文検索エンジンを使っ
ていますか?
4
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
2. 全文検索エンジンについて
クラウドだと「Amazon Elasticsearch Service」や「Azure
Cognitive Search」など、さまざまな選択肢があると思います。
今回は、虎の穴ラボの社内のWebツールに導入できそうな、
簡易的な全文検索エンジンにどのようなものがあるか調べた際に見つけ
た「Tantivy/Bayard」という2つのRust製の全文検索エンジンを試し
てみました。
5
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
3. Tantivyについて
Rustで記述された、全文検索エンジンライブラリです。
高速で軽量(起動時間が短い)のが特徴です。
日本語(中国語、韓国語も)に対応(設定が必要)していて、
Apache Lucene(Elastic Search等)と似た設計になっている
欠点:分散検索できない
(複数のDBに異なるデータを置いて、必要なDBを選択して検索的なこと)
https://github.com/tantivy-search/tantivy
6
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
3. Tantivyについて
ベンチマーク
https://tantivy-search.github.io/bench/
(Luceneの約半分ぐらいの速度で検索できる)
(一部、Luceneより遅い条件もあります)
7
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
Rust!使ったことない・・😱
8
虎の穴 虎の穴 虎の穴 虎の穴
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
虎の穴 虎の穴 虎の穴 虎の穴
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サーバが内包されている)
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
検索結果を表示する(CLI)
11
$ tantivy search -i wikipedia-index -q "barack obama"
検索結果がコンソールに JSONで表示されます
🎉
(こちらは、サーバの立ち上げが不要!です)
虎の穴 虎の穴 虎の穴 虎の穴
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
虎の穴 虎の穴 虎の穴 虎の穴
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
虎の穴 虎の穴 虎の穴 虎の穴
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突っ込めば良いわけではない)
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
Rustを使ったことなくても
お試しできました😉
15
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
続いて、Bayardを試してみよ😏
(日本語のデータも全文検索したいですよね!)
16
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
Bayardについて
Raft Consensus Algorithm と gRPC を実装する、
Rustで記述された全文検索およびインデックス作成のサーバー
です。
前述のTantivyをベースに開発されていて
Bayardを使用すると、高可用性を備えた全文検索アプリケー
ションを簡単に開発できます。
17
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
5. Bayardの特徴について
GitHubからの引用ですが、下記のようなことができます。
• 全文検索/索引付け(日本語対応)ができる
• REST APIが利用できる
• コマンドライン・インターフェイスが利用できる
• インデックスの複製ができる
• クラスターを立ち上げる
日本語対応には「Lindera(Rust製日本語形態素解析)」が使わ
れています
18
虎の穴 虎の穴 虎の穴 虎の穴
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
虎の穴 虎の穴 虎の穴 虎の穴
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' # マウントしたスキーマを指定
:
虎の穴 虎の穴 虎の穴 虎の穴
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)は、狭義にはイン
ターネットに存在する情報(ウェブページ、ウェブサイト、画像ファイル、ネットニュースなど)を検索する機能
およびそのプログラム。インターネットの普及初期には、検索としての機能のみを提供していたウェブサイト
そのものを検索エンジンと呼んだが、現在では様々なサービスが加わったポータルサイト化が進んだた
め、検索をサービスの一つとして提供するウェブサイトを単
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
7. Bayardの使い方・まとめ
実際に使う際には検索画面などの
フロントエンド開発に加えて、
初期データを登録するバッチプログラムや、全文検索データを更新し
たい時に差分登録するプログラムなどが必要になります。
REST APIが用意されているため、バックエンドの開発がなくても良いの
は、
お手軽に日本語の全文検索エンジンを試せるので、良い感じで
す!
22
虎の穴 虎の穴 虎の穴 虎の穴
Copyright © 2020 Toranoana Inc. All Rights Reserved.
ありがとうございました🙏
23

Contenu connexe

Tendances

Tendances (20)

勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
 
グラフニューラルネットワーク入門
グラフニューラルネットワーク入門グラフニューラルネットワーク入門
グラフニューラルネットワーク入門
 
ゼロから始める転移学習
ゼロから始める転移学習ゼロから始める転移学習
ゼロから始める転移学習
 
インターネットの仕組みとISPの構造
インターネットの仕組みとISPの構造インターネットの仕組みとISPの構造
インターネットの仕組みとISPの構造
 
[DL輪読会]Decision Transformer: Reinforcement Learning via Sequence Modeling
[DL輪読会]Decision Transformer: Reinforcement Learning via Sequence Modeling[DL輪読会]Decision Transformer: Reinforcement Learning via Sequence Modeling
[DL輪読会]Decision Transformer: Reinforcement Learning via Sequence Modeling
 
【DL輪読会】Non-Linguistic Supervision for Contrastive Learning of Sentence Embedd...
【DL輪読会】Non-Linguistic Supervision for Contrastive Learning of Sentence Embedd...【DL輪読会】Non-Linguistic Supervision for Contrastive Learning of Sentence Embedd...
【DL輪読会】Non-Linguistic Supervision for Contrastive Learning of Sentence Embedd...
 
Word2vecの並列実行時の学習速度の改善
Word2vecの並列実行時の学習速度の改善Word2vecの並列実行時の学習速度の改善
Word2vecの並列実行時の学習速度の改善
 
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
 
BERTology のススメ
BERTology のススメBERTology のススメ
BERTology のススメ
 
BERT分類ワークショップ.pptx
BERT分類ワークショップ.pptxBERT分類ワークショップ.pptx
BERT分類ワークショップ.pptx
 
時系列予測にTransformerを使うのは有効か?
時系列予測にTransformerを使うのは有効か?時系列予測にTransformerを使うのは有効か?
時系列予測にTransformerを使うのは有効か?
 
合成変量とアンサンブル:回帰森と加法モデルの要点
合成変量とアンサンブル:回帰森と加法モデルの要点合成変量とアンサンブル:回帰森と加法モデルの要点
合成変量とアンサンブル:回帰森と加法モデルの要点
 
データサイエンティストのつくり方
データサイエンティストのつくり方データサイエンティストのつくり方
データサイエンティストのつくり方
 
Data-Centric AIの紹介
Data-Centric AIの紹介Data-Centric AIの紹介
Data-Centric AIの紹介
 
MLOpsはバズワード
MLOpsはバズワードMLOpsはバズワード
MLOpsはバズワード
 
CV分野での最近の脱○○系3選
CV分野での最近の脱○○系3選CV分野での最近の脱○○系3選
CV分野での最近の脱○○系3選
 
多目的強凸最適化のパレート集合のトポロジー
多目的強凸最適化のパレート集合のトポロジー多目的強凸最適化のパレート集合のトポロジー
多目的強凸最適化のパレート集合のトポロジー
 
機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門
 
時系列問題に対するCNNの有用性検証
時系列問題に対するCNNの有用性検証時系列問題に対するCNNの有用性検証
時系列問題に対するCNNの有用性検証
 
差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)
 

Plus de 虎の穴 開発室

Plus de 虎の穴 開発室 (20)

FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化
 
Railsのデバッグ どうやるかを改めて確認する
Railsのデバッグ どうやるかを改めて確認するRailsのデバッグ どうやるかを改めて確認する
Railsのデバッグ どうやるかを改めて確認する
 
虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf
 
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdfDeno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
 
toranoana.deno #6 アジェンダ 採用説明
toranoana.deno #6 アジェンダ 採用説明toranoana.deno #6 アジェンダ 採用説明
toranoana.deno #6 アジェンダ 採用説明
 
Deno 向け WEB 開発用のツールを作ったので 紹介します
Deno 向け WEB 開発用のツールを作ったので 紹介しますDeno 向け WEB 開発用のツールを作ったので 紹介します
Deno 向け WEB 開発用のツールを作ったので 紹介します
 
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
 
GCPの画像認識APIの紹介
GCPの画像認識APIの紹介 GCPの画像認識APIの紹介
GCPの画像認識APIの紹介
 
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
 
GitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼうGitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼう
 
通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」
 
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
 
セキュリティを強化しよう!CloudArmorの機能解説
セキュリティを強化しよう!CloudArmorの機能解説セキュリティを強化しよう!CloudArmorの機能解説
セキュリティを強化しよう!CloudArmorの機能解説
 
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
 
Amplify Studioを使ってみた
Amplify Studioを使ってみたAmplify Studioを使ってみた
Amplify Studioを使ってみた
 
いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!
 
【Saitama.js】Denoのすすめ
【Saitama.js】Denoのすすめ【Saitama.js】Denoのすすめ
【Saitama.js】Denoのすすめ
 
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
 
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント 虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
 

Dernier

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 

Dernier (20)

AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 

Rust製の全文検索エンジンライブラリ(tantivy bayard)を試してみた

  • 1. 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2020 Toranoana Inc. All Rights Reserved. 全文検索エンジン(Tantivy/Bayard) を試してみた!! 虎の穴ラボ 古賀広隆 1
  • 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
  • 4. 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2020 Toranoana Inc. All Rights Reserved. みなさま、全文検索エンジンを使っ ていますか? 4
  • 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
  • 8. 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2020 Toranoana Inc. All Rights Reserved. Rust!使ったことない・・😱 8
  • 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突っ込めば良いわけではない)
  • 15. 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2020 Toranoana Inc. All Rights Reserved. Rustを使ったことなくても お試しできました😉 15
  • 16. 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2020 Toranoana Inc. All Rights Reserved. 続いて、Bayardを試してみよ😏 (日本語のデータも全文検索したいですよね!) 16
  • 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
  • 23. 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2020 Toranoana Inc. All Rights Reserved. ありがとうございました🙏 23