Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
検索エンジンことはじめ/First step towards full-text search...
Search
convto
October 02, 2019
Programming
240
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
検索エンジンことはじめ/First step towards full-text search engine
全文検索エンジンについて調べたので社内LT会で話しました
convto
October 02, 2019
Transcript
51 slides
検索エンジンことはじめ 2019/10/2 Makuake LT party #22
convto jisibari Twitter: @convto Github: convto 2
もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 -
辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ
もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 -
辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ
全文検索エンジン
全文検索エンジン を対象にした
たけのこ レシピ 驚きのたけの こ! ~~~~~~~~~~~ ~~~~~~~~~~~ レシピはこちら ~~~~~~~~~~~ 自炊術 ~~~~~~~~~~~
~~~~~~~~~~~ おすすめのたけのこ レシピも載せておきま す ~~~~~~~~~~~ n-gramについ て ~~~~~~~~~~~ ~~~~~~~~~~~ 一定の文字長でトー クナイズする ~~~~~~~~~~~ 驚きのたけの こ!, 自炊術
全文検索エンジンとは - 複数の文章の全文を対象にした検索エンジン - ElasticSearch, Groonga, Solr あたりが有名 - Lucene
系列と Groonga 系列があるっぽい
もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 -
辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索
インデックス - 素直にすべての文字を舐めて探索してもいいが、 負荷が大きい(grep型とか言われたり言われな かったりするらしい) - 事前に検索される形で表を作っておき、計算量が 下がるような形で保持することで検索を効率化す る
転置インデックス - 「ページ内で使われている単語の表」を「ある単語 が使われているページの表」に変換して作ったイ ンデックス - 表の縦と横を変換することを転置というので、日 本語では転置インデックスという - 本の索引と論理は同じ
ドキュメント内の単語リストを 単語が属するドキュメントリストに変換 Document id 単語リスト 1 おどろき, の, た けのこ,
!, …略 2 自炊, 術, ...略 単語 Doc1 Doc2 おどろき ◦ × の ◦ ◦ たけのこ ◦ ◦ ! ◦ × 変換 例
ドキュメント内の単語リストを 単語が属するドキュメントリストに変換 Document id 単語リスト 1 おどろき, の, た けのこ,
!, …略 2 自炊, 術, ...略 単語 Doc1 Doc2 おどろき ◦ × の ◦ ◦ たけのこ ◦ ◦ ! ◦ × 変換 例 ポスティング
ドキュメント内の単語リストを 単語が属するドキュメントリストに変換 Document id 単語リスト 1 おどろき, の, た けのこ,
!, …略 2 自炊, 術, ...略 単語 Doc1 Doc2 おどろき ◦ × の ◦ ◦ たけのこ ◦ ◦ ! ◦ × 変換 例 ポスティングリスト
ドキュメント内の単語リストを 単語が属するドキュメントリストに変換 Document id 単語リスト 1 おどろき, の, た けのこ,
!, …略 2 自炊, 術, ...略 単語 Doc1 Doc2 おどろき ◦ × の ◦ ◦ たけのこ ◦ ◦ ! ◦ × 変換 例 転置リスト
ドキュメント内の単語リストを 単語が属するドキュメントリストに変換 Document id 単語リスト 1 おどろき, の, た けのこ,
!, …略 2 自炊, 術, ...略 単語 Doc1 Doc2 おどろき ◦ × の ◦ ◦ たけのこ ◦ ◦ ! ◦ × 変換 例 転置リストの情報を木構造などで 持たせて計算量を下げたものが 転置インデックス
ドキュメント内の単語リストを 単語が属するドキュメントリストに変換 Document id 単語リスト 1 おどろき, の, た けのこ,
!, …略 2 自炊, 術, ...略 単語 Doc1 Doc2 おどろき ◦, 1回, 1番目 × の ◦, 2回, 2,N番目 ◦, 3回, L,M,N 番目 たけのこ ◦, 1回, 3番目 ◦, 1回, N番目 ! ◦, 1回, N番目 × 変換 例 精度計算やフレーズ一致のためにメタ 情報を付与する場合もある
もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 -
辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ
Full text search engine
Full text search engine full text search engine 句読点で分離
全文検索エンジン
全文検索エンジン
アジア圏の言語は明確な単語の区切りが少ない - アジアに共通して言えるらしい - ある程度品詞を解釈して分けたり、文字数決め打 ちで無理やり単語として分けたりするのが一般的
n-gram - 文字数を決め打ちして分けるパターン - 1,2,3文字分けをそれぞれ uni-gram, bi-gram, tri-gram というらしい -
mysql などにも n-gram の機能あって、デフォは bi-gram になっている
全文検索エンジン 全文 分検 検索 索エ n-gram で分割 エン ンジ ジン
n-gram メリデメ - メリット: 一文字ずつずらして単語わけするので、 検索もれがない - デメリット: 京都 と調べたときに
東京都 も該当す る(東京、京都の2つの単語があるとみなされるた め) - デメリット: 単語数が多くなることがおおく、形態素 解析に比べて実行が遅くなる可能性が高い
形態素解析 - 品詞などで単語分けする - 枯れた実装がそこそこある - 自作するのは無理ゲーだと思う
全文検索エンジン 全文 検索 形態素解析で 分割 エンジン
形態素解析 メリデメ - メリット: n-gram に比べて実行が早い可能性が高 い - デメリット: 分けられ方によっては検索漏れが発生
する場合がある(`たけのこ` が `たけ` `の` `こ` と 単語分けされて転置インデックスが構築された ケース、など)
どっちも大事
場合によって使い分けられるようにしとこう - 有名な検索エンジンはだいたいどちらも対応して いる - ユースケースによって適切な方を使い分けている らしい
もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 -
辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ
ここでいう辞書とは - ポスティングリストの参照を持った node でできた 木構造 - ポスティングリストはサイズが膨大な場合が多い ので、計算量以外にもストレージへの読み書き発 行回数なども考慮した木構造がよい
検索エンジン向けの木 - B+ tree: B tree の派生で、ノードをファイルシステ ムのページサイズを意識して管理するのでスト レージデバイスとのI/O回数が減る -
mysql デフォのストレージエンジンInnoDBはこ れ - BKD tree: まだ概要は把握していないが、色々な 検索エンジンで実績がある - ElasticSearch などはこれ
もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 -
辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ
辞書と転置リストの関 係
単語A 単語B 単語C 単語D ... 辞書 転置リスト 1, 1, 3,
2, 1, 2
単語A 単語B 単語C 単語D ... 辞書 転置リスト 1, 1, 3,
2, 1, 2 Doc id, 登場回数, 登場位置などの情報 が数値の列として保存される この例では 4byte * 6 = 一つのポスティ ングあたり 24byte
転置リスト実装で考慮すること - 物理的に連続した位置に配置する - ポスティングリストは数字の形式でストレージに書 き込むので、数値向けの圧縮をする
もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 -
辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ
ソートして構築する方法 - 単語とポスティングのペアをストレージに書き込 みしていく - 全部書き込んだら単語のalphabet順にソート - ソート結果を順番にみてポスティングリスト構築
マージして構築する方法 - 設定したメモリ上限に達するまでポスティングリス トを構築していく - メモリ上限に達したらファイルに書き下ろしてまた 次のポスティングリストを作る - 全件探索し終えたら部分的なポスティングリスト をマージして最終的なポスティングリストを得る
マージして構築する方法 - 設定したメモリ上限に達するまでポスティングリス トを構築していく - メモリ上限に達したらファイルに描き下ろしてまた 次のポスティングリストを作る - 全件探索し終えたら部分的なポスティングリスト をマージして最終的なポスティングリストを得る
マージのほうが読み書き回数少なくて 一般にはパフォーマンスがよい
マージして構築する方法 - 設定したメモリ上限に達するまでポスティングリス トを構築していく - メモリ上限に達したらファイルに描き下ろしてまた 次のポスティングリストを作る - 全件探索し終えたら部分的なポスティングリスト をマージして最終的なポスティングリストを得る
マージのほうが読み書き回数少なくて 一般にはパフォーマンスがよい カーネルは投機読み込みや 遅延して読み取りマージなど ブロックデバイスのI/O補助があるため、 ソートでも問題ないケースもありそう
もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 -
辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ
ブーリアン検索 - AND OR などの論理演算子で要素をつなげて検索 すること - 文字で論理操作を受け取れるようにして、実装で 配列などの操作に変換すれば対応できる
関連度計測 - 出現回数、出現位置などのメタデータを使ってを 使って関連度を図って返す、などもできる - 出現クエリが存在しなくても関連度はわかるが、 走査対象のデータが全件になるので要件によっ てトレードオフ
もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 -
辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ
まとめ - 検索エンジン用語や使われる要素技術などざっく りとした外観を学んだ - 次回はホビープロジェクトを引っさげて発表したい
- プレゼンテーションテーマは SlidesCarnival の ヨークプレゼンテーションテンプレー ト を利用しています クレジット表記
ご清聴 ありがとうございました
More Decks by convto
See All by convto
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
6
13k
Go 1.27 の標準パッケージに uuid が入った!のでいろいろ喋る / go_127_std_go_uuid
convto
3
960
monorepo の Go テストをはやくした〜い!~最小の依存解決への道のり~ / faster-testing-of-monorepos
convto
3
760
詳解!defer panic recover のしくみ / Understanding defer, panic, and recover
convto
0
500
MCPと認可まわりの話 / mcp_and_authorization
convto
2
1.8k
バクラクの認証基盤の成長と現在地 / bakuraku-authn-platform
convto
4
2.5k
gob バイナリが Go バージョンによって 出力が変わることについて調べてみた / Investigating How gob Binary Output Changes Across Go Versions
convto
0
200
Go 関連の個人的おもしろCVE 5選 / my favorite go cve
convto
3
700
バイナリを眺めてわかる gob encoding の仕様と性質、適切な使い方 / understanding gob encoding
convto
6
3.7k
Other Decks in Programming
See All in Programming
まずはコードより業務と向き合う:テーブル解体のためにPdMを呼んだ話
sakawe_ee
0
220
Web3Dライブラリを作ってVue Custom Rendererの仕組みを理解しよう / lets learn vue custom renderer by making 3d library
drumath2237
1
130
AIがコードを書いてくれる時代、我々は何を確かめるのか
yosuke_furukawa
PRO
13
5.9k
地方こそサーバーレス — 10年続けた、顔が見えるチームで確かな基盤を / Serverless Matters Most in Regional Areas — 10 Years of Building Reliable Foundations with Close-Knit Teams
seike460
PRO
1
420
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
1
310
作れるエンジニアから、価値を届けるエンジニアへ
ryunakayama
1
280
AI時代のFlutter品質設計 — アプリ品質を守るQuality Layers
omatty198
0
370
느린 네트워크와 저사양 디바이스 사용자를 위한 웹뷰 로딩 시간 개선기
kmkim
1
230
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3.2k
ビジネスロジックを堅牢に~Scala 3のドメインプリミティブ~
j5ik2o
0
130
Enforcing Your Architecture with Unit Tests in the AI Era (Swift Connection X)
steliosf
PRO
1
170
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
5
850
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.7k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
60k
Testing 201, or: Great Expectations
jmmastey
46
8.4k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
A better future with KSS
kneath
240
18k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Building AI with AI
inesmontani
PRO
1
1.4k
How to Ace a Technical Interview
jacobian
280
24k
Bash Introduction
62gerente
615
220k
Practical Orchestrator
shlominoach
192
12k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k