Slide 1

Slide 1 text

検索エンジンことはじめ 2019/10/2 Makuake LT party #22

Slide 2

Slide 2 text

convto jisibari Twitter: @convto Github: convto 2

Slide 3

Slide 3 text

もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 - 辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ

Slide 4

Slide 4 text

もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 - 辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ

Slide 5

Slide 5 text

全文検索エンジン

Slide 6

Slide 6 text

全文検索エンジン を対象にした

Slide 7

Slide 7 text

たけのこ レシピ 驚きのたけの こ! ~~~~~~~~~~~ ~~~~~~~~~~~ レシピはこちら ~~~~~~~~~~~ 自炊術 ~~~~~~~~~~~ ~~~~~~~~~~~ おすすめのたけのこ レシピも載せておきま す ~~~~~~~~~~~ n-gramについ て ~~~~~~~~~~~ ~~~~~~~~~~~ 一定の文字長でトー クナイズする ~~~~~~~~~~~ 驚きのたけの こ!, 自炊術

Slide 8

Slide 8 text

全文検索エンジンとは - 複数の文章の全文を対象にした検索エンジン - ElasticSearch, Groonga, Solr あたりが有名 - Lucene 系列と Groonga 系列があるっぽい

Slide 9

Slide 9 text

もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 - 辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索

Slide 10

Slide 10 text

インデックス - 素直にすべての文字を舐めて探索してもいいが、 負荷が大きい(grep型とか言われたり言われな かったりするらしい) - 事前に検索される形で表を作っておき、計算量が 下がるような形で保持することで検索を効率化す る

Slide 11

Slide 11 text

転置インデックス - 「ページ内で使われている単語の表」を「ある単語 が使われているページの表」に変換して作ったイ ンデックス - 表の縦と横を変換することを転置というので、日 本語では転置インデックスという - 本の索引と論理は同じ

Slide 12

Slide 12 text

ドキュメント内の単語リストを 単語が属するドキュメントリストに変換 Document id 単語リスト 1 おどろき, の, た けのこ, !, …略 2 自炊, 術, ...略 単語 Doc1 Doc2 おどろき ○ × の ○ ○ たけのこ ○ ○ ! ○ × 変換 例

Slide 13

Slide 13 text

ドキュメント内の単語リストを 単語が属するドキュメントリストに変換 Document id 単語リスト 1 おどろき, の, た けのこ, !, …略 2 自炊, 術, ...略 単語 Doc1 Doc2 おどろき ○ × の ○ ○ たけのこ ○ ○ ! ○ × 変換 例 ポスティング

Slide 14

Slide 14 text

ドキュメント内の単語リストを 単語が属するドキュメントリストに変換 Document id 単語リスト 1 おどろき, の, た けのこ, !, …略 2 自炊, 術, ...略 単語 Doc1 Doc2 おどろき ○ × の ○ ○ たけのこ ○ ○ ! ○ × 変換 例 ポスティングリスト

Slide 15

Slide 15 text

ドキュメント内の単語リストを 単語が属するドキュメントリストに変換 Document id 単語リスト 1 おどろき, の, た けのこ, !, …略 2 自炊, 術, ...略 単語 Doc1 Doc2 おどろき ○ × の ○ ○ たけのこ ○ ○ ! ○ × 変換 例 転置リスト

Slide 16

Slide 16 text

ドキュメント内の単語リストを 単語が属するドキュメントリストに変換 Document id 単語リスト 1 おどろき, の, た けのこ, !, …略 2 自炊, 術, ...略 単語 Doc1 Doc2 おどろき ○ × の ○ ○ たけのこ ○ ○ ! ○ × 変換 例 転置リストの情報を木構造などで 持たせて計算量を下げたものが 転置インデックス

Slide 17

Slide 17 text

ドキュメント内の単語リストを 単語が属するドキュメントリストに変換 Document id 単語リスト 1 おどろき, の, た けのこ, !, …略 2 自炊, 術, ...略 単語 Doc1 Doc2 おどろき ○, 1回, 1番目 × の ○, 2回, 2,N番目 ○, 3回, L,M,N 番目 たけのこ ○, 1回, 3番目 ○, 1回, N番目 ! ○, 1回, N番目 × 変換 例 精度計算やフレーズ一致のためにメタ 情報を付与する場合もある

Slide 18

Slide 18 text

もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 - 辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ

Slide 19

Slide 19 text

Full text search engine

Slide 20

Slide 20 text

Full text search engine full text search engine 句読点で分離

Slide 21

Slide 21 text

全文検索エンジン

Slide 22

Slide 22 text

全文検索エンジン

Slide 23

Slide 23 text

アジア圏の言語は明確な単語の区切りが少ない - アジアに共通して言えるらしい - ある程度品詞を解釈して分けたり、文字数決め打 ちで無理やり単語として分けたりするのが一般的

Slide 24

Slide 24 text

n-gram - 文字数を決め打ちして分けるパターン - 1,2,3文字分けをそれぞれ uni-gram, bi-gram, tri-gram というらしい - mysql などにも n-gram の機能あって、デフォは bi-gram になっている

Slide 25

Slide 25 text

全文検索エンジン 全文 分検 検索 索エ n-gram で分割 エン ンジ ジン

Slide 26

Slide 26 text

n-gram メリデメ - メリット: 一文字ずつずらして単語わけするので、 検索もれがない - デメリット: 京都 と調べたときに 東京都 も該当す る(東京、京都の2つの単語があるとみなされるた め) - デメリット: 単語数が多くなることがおおく、形態素 解析に比べて実行が遅くなる可能性が高い

Slide 27

Slide 27 text

形態素解析 - 品詞などで単語分けする - 枯れた実装がそこそこある - 自作するのは無理ゲーだと思う

Slide 28

Slide 28 text

全文検索エンジン 全文 検索 形態素解析で 分割 エンジン

Slide 29

Slide 29 text

形態素解析 メリデメ - メリット: n-gram に比べて実行が早い可能性が高 い - デメリット: 分けられ方によっては検索漏れが発生 する場合がある(`たけのこ` が `たけ` `の` `こ` と 単語分けされて転置インデックスが構築された ケース、など)

Slide 30

Slide 30 text

どっちも大事

Slide 31

Slide 31 text

場合によって使い分けられるようにしとこう - 有名な検索エンジンはだいたいどちらも対応して いる - ユースケースによって適切な方を使い分けている らしい

Slide 32

Slide 32 text

もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 - 辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ

Slide 33

Slide 33 text

ここでいう辞書とは - ポスティングリストの参照を持った node でできた 木構造 - ポスティングリストはサイズが膨大な場合が多い ので、計算量以外にもストレージへの読み書き発 行回数なども考慮した木構造がよい

Slide 34

Slide 34 text

検索エンジン向けの木 - B+ tree: B tree の派生で、ノードをファイルシステ ムのページサイズを意識して管理するのでスト レージデバイスとのI/O回数が減る - mysql デフォのストレージエンジンInnoDBはこ れ - BKD tree: まだ概要は把握していないが、色々な 検索エンジンで実績がある - ElasticSearch などはこれ

Slide 35

Slide 35 text

もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 - 辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ

Slide 36

Slide 36 text

辞書と転置リストの関 係

Slide 37

Slide 37 text

単語A 単語B 単語C 単語D ... 辞書 転置リスト 1, 1, 3, 2, 1, 2

Slide 38

Slide 38 text

単語A 単語B 単語C 単語D ... 辞書 転置リスト 1, 1, 3, 2, 1, 2 Doc id, 登場回数, 登場位置などの情報 が数値の列として保存される この例では 4byte * 6 = 一つのポスティ ングあたり 24byte

Slide 39

Slide 39 text

転置リスト実装で考慮すること - 物理的に連続した位置に配置する - ポスティングリストは数字の形式でストレージに書 き込むので、数値向けの圧縮をする

Slide 40

Slide 40 text

もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 - 辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ

Slide 41

Slide 41 text

ソートして構築する方法 - 単語とポスティングのペアをストレージに書き込 みしていく - 全部書き込んだら単語のalphabet順にソート - ソート結果を順番にみてポスティングリスト構築

Slide 42

Slide 42 text

マージして構築する方法 - 設定したメモリ上限に達するまでポスティングリス トを構築していく - メモリ上限に達したらファイルに書き下ろしてまた 次のポスティングリストを作る - 全件探索し終えたら部分的なポスティングリスト をマージして最終的なポスティングリストを得る

Slide 43

Slide 43 text

マージして構築する方法 - 設定したメモリ上限に達するまでポスティングリス トを構築していく - メモリ上限に達したらファイルに描き下ろしてまた 次のポスティングリストを作る - 全件探索し終えたら部分的なポスティングリスト をマージして最終的なポスティングリストを得る マージのほうが読み書き回数少なくて 一般にはパフォーマンスがよい

Slide 44

Slide 44 text

マージして構築する方法 - 設定したメモリ上限に達するまでポスティングリス トを構築していく - メモリ上限に達したらファイルに描き下ろしてまた 次のポスティングリストを作る - 全件探索し終えたら部分的なポスティングリスト をマージして最終的なポスティングリストを得る マージのほうが読み書き回数少なくて 一般にはパフォーマンスがよい カーネルは投機読み込みや 遅延して読み取りマージなど ブロックデバイスのI/O補助があるため、 ソートでも問題ないケースもありそう

Slide 45

Slide 45 text

もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 - 辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ

Slide 46

Slide 46 text

ブーリアン検索 - AND OR などの論理演算子で要素をつなげて検索 すること - 文字で論理操作を受け取れるようにして、実装で 配列などの操作に変換すれば対応できる

Slide 47

Slide 47 text

関連度計測 - 出現回数、出現位置などのメタデータを使ってを 使って関連度を図って返す、などもできる - 出現クエリが存在しなくても関連度はわかるが、 走査対象のデータが全件になるので要件によっ てトレードオフ

Slide 48

Slide 48 text

もくじ - 全文検索エンジンとは - 転置インデックス - 非英語圏への対応: n-gram, 形態素解析 - 辞書の実装で使われる木構造 - 転置リストの実装で考慮すること - インデックス構築 - 検索 - まとめ

Slide 49

Slide 49 text

まとめ - 検索エンジン用語や使われる要素技術などざっく りとした外観を学んだ - 次回はホビープロジェクトを引っさげて発表したい

Slide 50

Slide 50 text

- プレゼンテーションテーマは SlidesCarnival の ヨークプレゼンテーションテンプレー ト を利用しています クレジット表記

Slide 51

Slide 51 text

ご清聴 ありがとうございました