$30 off During Our Annual Pro Sale. View Details »

検索エンジンことはじめ/First step towards full-text search engine

convto
October 02, 2019

検索エンジンことはじめ/First step towards full-text search engine

全文検索エンジンについて調べたので社内LT会で話しました

convto

October 02, 2019
Tweet

More Decks by convto

Other Decks in Programming

Transcript

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

    View Slide

  2. convto
    jisibari
    Twitter: @convto
    Github: convto
    2

    View Slide

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

    View Slide

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

    View Slide

  5. 全文検索エンジン

    View Slide

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

    View Slide

  7. たけのこ レシピ
    驚きのたけの
    こ!
    ~~~~~~~~~~~
    ~~~~~~~~~~~
    レシピはこちら
    ~~~~~~~~~~~
    自炊術
    ~~~~~~~~~~~
    ~~~~~~~~~~~
    おすすめのたけのこ
    レシピも載せておきま

    ~~~~~~~~~~~
    n-gramについ

    ~~~~~~~~~~~
    ~~~~~~~~~~~
    一定の文字長でトー
    クナイズする
    ~~~~~~~~~~~
    驚きのたけの
    こ!, 自炊術

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    ポスティング

    View Slide

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

    ポスティングリスト

    View Slide

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

    転置リスト

    View Slide

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

    転置リストの情報を木構造などで
    持たせて計算量を下げたものが
    転置インデックス

    View Slide

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

    精度計算やフレーズ一致のためにメタ
    情報を付与する場合もある

    View Slide

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

    View Slide

  19. Full text search
    engine

    View Slide

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

    View Slide

  21. 全文検索エンジン

    View Slide

  22. 全文検索エンジン

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  29. 形態素解析 メリデメ
    - メリット: n-gram に比べて実行が早い可能性が高

    - デメリット: 分けられ方によっては検索漏れが発生
    する場合がある(`たけのこ` が `たけ` `の` `こ` と
    単語分けされて転置インデックスが構築された
    ケース、など)

    View Slide

  30. どっちも大事

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  34. 検索エンジン向けの木
    - B+ tree: B tree の派生で、ノードをファイルシステ
    ムのページサイズを意識して管理するのでスト
    レージデバイスとのI/O回数が減る
    - mysql デフォのストレージエンジンInnoDBはこ

    - BKD tree: まだ概要は把握していないが、色々な
    検索エンジンで実績がある
    - ElasticSearch などはこれ

    View Slide

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

    View Slide

  36. 辞書と転置リストの関

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide