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