Oktavia全文検索エンジン - SphinxCon JP 2014

15,175 views

Published on

* 検索エンジンOktaviaとは
* Sphinxに統合してみた

Published in: Technology
1 Comment
16 Likes
Statistics
Notes
No Downloads
Views
Total views
15,175
On SlideShare
0
From Embeds
0
Number of Embeds
9,047
Actions
Shares
0
Downloads
16
Comments
1
Likes
16
Embeds 0
No embeds

No notes for slide

Oktavia全文検索エンジン - SphinxCon JP 2014

  1. 1. DeNA Co, Ltd. 渋川よしき 10/26/2014 SphinxCon
  2. 2. ! 渋川よしき ! DeNAで仕事してます ! @shibu_jp (twitter) ! yoshiki.shibukawa (Facebook) ! yoshiki@shibu.jp (mail) ! 主に使う言語 ! C/C++, Python, JavaScript ! sphinx-users.jpのファウンダ ー ! サンフランシスコから帰ってき ました
  3. 3. ! 検索エンジンの基礎 ! Oktaviaの構造 ! OktaviaのAPIの使い方 ! Oktavia組み込んでみてどうよ?
  4. 4. ! 転置インデックス方式は東アジアの言語 では辛ぽよ ! FM-indexっていう、まったく違う方式が あるよ ! Oktaviaは先月のPyConの前日にアップ ロードしたよ。 ! Sphinxに組み込んでみたよ←NEW ! 昨日は遅かったけどだいぶ改善したよ
  5. 5. AM.txt (0) • Good morning • Hi PM.txt (1) • Good afternoon • Good evening • Hi
  6. 6. AM.txt (0) • Good morning • Hi PM.txt (1) • Good afternoon • Good evening • Hi
  7. 7. ! Sphinxは組み込みの検索エンジンを提供 ! 転置インデックス方式 ! 転置インデックスはインデックス作成時(ビル ド時)と検索時に単語分割が必要 ! 日本語だと単語分割に巨大な辞書が必要 ! 最初のバージョンは日本語非対応 ! パッチをいくつか送ったりもしてみた ! でもまだ十分じゃない
  8. 8. ! イタリアの大学教授が考案したアルゴリズム ! Paolo Ferragina ! Giovanni Manzini ! FM-indexは海外ではあまり有名ではない ! 既存のアルゴリズムと大きく違う ! 既存のアルゴリズムでも西洋の言語では十分 ! ゲノムの解析分野ではポピュラー ! このアルゴリズムを使った検索エンジンを実装し ました。
  9. 9. Estimated Time: 15min
  10. 10. ! ウェブブラウザで動く検索エンジ ! PythonとJSX (DeNAが作ったaltJS http://jsx.github.io/)で書かれている ! FM-indexを検索のアルゴリズムとして 利用
  11. 11. ! Action Script 3っぽいaltJS ! クラス構文がある ! 型に超厳格 ! thisで悩むことが大幅に減る ! パフォーマンスの最適化が凄い
  12. 12. ! FM-indexは圧縮インデックスを使った検 索アルゴリズムでは最速 ! メモリに余裕がなく、インデックス配信が必 要なブラウザ上の検索に有利 ! FM-indexは単語分割を必要としない ! 日本語の検索で辞書がいらない
  13. 13. ! Oktaviaは追加のメタデータを持つ ! 巨大な1つの文字列に統合されたテキストに、場所の 情報を与える Use the Force, Luke. No, I am your father. Ep4.txt Ep5.txt ! いくらでもメタデータを自由に追加できる。 ! セクション: ドキュメント区切り。名前付き。 ! ブロック: コードブロックなど。名前付き。空白箇所あり。 ! スプリッタ: 単語区切り。名前なし。大量に持てる。 ! テーブル: 行と列。RDBっぽい検索に対応。
  14. 14. ソース 読み込み インデックス ファイル作成 インデックス 読み込み 検索結果 表示 CLI tool Browser search program
  15. 15. ソース 読み込み インデックス ファイル作成 インデックス 読み込み 検索結果 表示 CLI tool Browser search program ! 1ヶ月前に完成 ! Python 2.6, 2.7, 3.3, 3.4をサポート
  16. 16. ソース 読み込み インデックス ファイル作成 インデックス 読み込み JSX版 検索ツール 検索結果 表示 CLI tool Browser search program PyPy ! 1ヶ月前に完成 ! Python 2.6, 2.7, 3.3, 3.4をサポート
  17. 17. Estimated Time: 23min
  18. 18. ! Bitbucketにアップロード ! https://bitbucket.org/shibu/sphinx/ branch/feature/oktavia ! やったこと ! html_search_engineオプション追加 ! 既存実装をsearch/invertindex.pyに ! Oktavia用コード追加 ! テキストをOktaviaに流し込んでビルド
  19. 19. ! O(n) ! 文書量に線形で処理時間がかかる ! JSX版 (node.js) ! Pythonドキュメント(10MB)で1分半ぐらい ! Python版 ! Sphinxのドキュメント(850KB)で30分 ! PyPyだと95秒!JIT偉い! ! Pythonドキュメントだと6時間?
  20. 20. Python2.7 PyPy コンテンツ結合 9.43 [s] 67.51 [s] BW変換 1640.58 [s] 1.14 [s] ウェーブレットマトリックス構築 5.37 [s] 0.84 [s] 文字ごとの事前ランク計算 0.02 [s] 0.03 [s] キャッシュ計算(2%時) 70.18 [s] 21.17 [s] 合計 1725.59 [s] 90.69 [s] ! 傾向が違いすぎる・・・ ! if “pypy” in sys.executable:みたいなの必要? ! CPythonは完結データ構造のC言語実装が必要かも
  21. 21. ! str = str + substr ! pypy: 19.19 [s], python: 2.44 [s] ! str += substr ! pypy: 0.0137 [s] python: 0.0023 [s] strって書いてあるけど文字列じゃなくて数値の配列です
  22. 22. ! _range = getattr(__builtins__, 'xrange', range) ! pypy: 0.85 [s], python: 129.38 [s] ! pythonで、子モジュールでうまく動かない 問題(xrangeではなく、rangeが使われてた) ! _range = range if sys.version_info.major == 3 else xrange ! pypy: 0.82 [s], python: 4.85 [s]
  23. 23. ! ビット演算が重い ! はじめてのC拡張を作り始めたよ (今日の昼から) ! ひととおりPythonコードを移植して、 コンパイルは通ったけどテストがまだ ! 結果は後日
  24. 24. ! 転置インデックス方式は東アジアの言語 では辛ぽよ ! FM-indexっていう、まったく違う方式が あるよ ! Oktaviaは先月のPyConの前日にアップ ロードしたよ。 ! Sphinxに組み込んでみたよ←NEW ! 昨日は遅かったけどだいぶ改善したよ

×