Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
検索エンジンことはじめ/First step towards full-text search...
Search
convto
October 02, 2019
Programming
0
150
検索エンジンことはじめ/First step towards full-text search engine
全文検索エンジンについて調べたので社内LT会で話しました
convto
October 02, 2019
Tweet
Share
More Decks by convto
See All by convto
MCPと認可まわりの話 / mcp_and_authorization
convto
1
130
バクラクの認証基盤の成長と現在地 / bakuraku-authn-platform
convto
4
1.3k
gob バイナリが Go バージョンによって 出力が変わることについて調べてみた / Investigating How gob Binary Output Changes Across Go Versions
convto
0
120
Go 関連の個人的おもしろCVE 5選 / my favorite go cve
convto
3
450
バイナリを眺めてわかる gob encoding の仕様と性質、適切な使い方 / understanding gob encoding
convto
6
2.8k
みんなでたのしむ math/big / i love math big
convto
0
280
Go1.22からの疑似乱数生成器について/go-122-pseudo-random-generator
convto
2
800
Go1.20からサポートされるtree構造のerrの紹介と、treeを考慮した複数マッチができるライブラリを作った話/introduction of tree structure err added since go 1_20
convto
0
1.2k
byte列のbit表現を得るencodingライブラリ作った
convto
1
1.2k
Other Decks in Programming
See All in Programming
バイブスあるコーディングで ~PHP~ 便利ツールをつくるプラクティス
uzulla
1
260
MDN Web Docs に日本語翻訳でコントリビュートしたくなる
ohmori_yusuke
1
130
構文解析器入門
ydah
7
1.8k
NEWT Backend Evolution
xpromx
1
150
SQLアンチパターン第2版 データベースプログラミングで陥りがちな失敗とその対策 / Intro to SQL Antipatterns 2nd
twada
PRO
26
8k
Googleの新しいコーディングAIエージェントJulesを使ってみた
tonionagauzzi
0
120
はじめてのWeb API体験 ー 飲食店検索アプリを作ろうー
akinko_0915
0
160
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
0
460
抽象化という思考のツール - 理解と活用 - / Abstraction-as-a-Tool-for-Thinking
shin1x1
1
490
No Install CMS戦略 〜 5年先を見据えたフロントエンド開発を考える / no_install_cms
rdlabo
0
140
レトロゲームから学ぶ通信技術の歴史
kimkim0106
0
130
ISUCON研修おかわり会 講義スライド
arfes0e2b3c
1
480
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
184
22k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Gamification - CAS2011
davidbonilla
81
5.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Into the Great Unknown - MozCon
thekraken
40
1.9k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
109
19k
GraphQLとの向き合い方2022年版
quramy
49
14k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
138
34k
Transcript
検索エンジンことはじめ 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 の ヨークプレゼンテーションテンプレー ト を利用しています クレジット表記
ご清聴 ありがとうございました