31
DeNA Co, Ltd. 渋川よしき 10/26/2014 SphinxCon

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

DeNA Co, Ltd. 渋川よしき

10/26/2014 SphinxCon

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

!  渋川よしき !  DeNAで仕事してます !  @shibu_jp (twitter) !  yoshiki.shibukawa (Facebook) !  [email protected] (mail)

!  主に使う言語 !  C/C++, Python, JavaScript

!  sphinx-users.jpのファウンダー

!  サンフランシスコから帰ってきました

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

! 検索エンジンの基礎 ! Oktaviaの構造 ! OktaviaのAPIの使い方 ! Oktavia組み込んでみてどうよ?

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

! 転置インデックス方式は東アジアの言語では辛ぽよ

! FM-indexっていう、まったく違う方式があるよ

! Oktaviaは先月のPyConの前日にアップロードしたよ。

! Sphinxに組み込んでみたよ←NEW ! 昨日は遅かったけどだいぶ改善したよ

Page 5: Oktavia全文検索エンジン - SphinxCon JP 2014
Page 6: Oktavia全文検索エンジン - SphinxCon JP 2014
Page 7: Oktavia全文検索エンジン - SphinxCon JP 2014

AM.txt (0)

• Good morning

• Hi

PM.txt (1)

• Good afternoon

• Good evening

• Hi

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

AM.txt (0)

• Good morning

• Hi

PM.txt (1)

• Good afternoon

• Good evening

• Hi

Page 9: Oktavia全文検索エンジン - SphinxCon JP 2014
Page 10: Oktavia全文検索エンジン - SphinxCon JP 2014
Page 11: Oktavia全文検索エンジン - SphinxCon JP 2014

! Sphinxは組み込みの検索エンジンを提供 ! 転置インデックス方式 ! 転置インデックスはインデックス作成時(ビルド時)と検索時に単語分割が必要

! 日本語だと単語分割に巨大な辞書が必要 ! 最初のバージョンは日本語非対応

! パッチをいくつか送ったりもしてみた ! でもまだ十分じゃない

Page 12: Oktavia全文検索エンジン - SphinxCon JP 2014
Page 13: Oktavia全文検索エンジン - SphinxCon JP 2014

!  イタリアの大学教授が考案したアルゴリズム !  Paolo Ferragina !  Giovanni Manzini

!  FM-indexは海外ではあまり有名ではない !  既存のアルゴリズムと大きく違う !  既存のアルゴリズムでも西洋の言語では十分 !  ゲノムの解析分野ではポピュラー

!  このアルゴリズムを使った検索エンジンを実装しました。

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

Estimated Time: 15min

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

! ウェブブラウザで動く検索エンジ ! PythonとJSX (DeNAが作ったaltJS http://jsx.github.io/)で書かれている

! FM-indexを検索のアルゴリズムとして 利用

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

! Action Script 3っぽいaltJS ! クラス構文がある ! 型に超厳格 !  thisで悩むことが大幅に減る ! パフォーマンスの最適化が凄い

Page 17: Oktavia全文検索エンジン - SphinxCon JP 2014
Page 18: Oktavia全文検索エンジン - SphinxCon JP 2014

! FM-indexは圧縮インデックスを使った検索アルゴリズムでは最速 ! メモリに余裕がなく、インデックス配信が必要なブラウザ上の検索に有利

! FM-indexは単語分割を必要としない ! 日本語の検索で辞書がいらない

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

!  Oktaviaは追加のメタデータを持つ !  巨大な1つの文字列に統合されたテキストに、場所の情報を与える

!  いくらでもメタデータを自由に追加できる。 ! セクション: ドキュメント区切り。名前付き。 ! ブロック: コードブロックなど。名前付き。空白箇所あり。 ! スプリッタ: 単語区切り。名前なし。大量に持てる。 ! テーブル: 行と列。RDBっぽい検索に対応。

Ep4.txt

Use the Force, Luke. No, I am your father. Ep5.txt

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

ソース 読み込み

インデックスファイル作成

インデックス読み込み

検索結果 表示

CLI tool Browser search program

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

ソース 読み込み

インデックスファイル作成

インデックス読み込み

検索結果 表示

CLI tool Browser search program

! 1ヶ月前に完成 ! Python 2.6, 2.7, 3.3, 3.4をサポート

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

ソース 読み込み

インデックスファイル作成

インデックス読み込み

検索結果 表示

CLI tool Browser search program

! 1ヶ月前に完成 ! Python 2.6, 2.7, 3.3, 3.4をサポート

JSX版 検索ツール

PyPy

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

Estimated Time: 23min

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

! Bitbucketにアップロード !  https://bitbucket.org/shibu/sphinx/branch/feature/oktavia

! やったこと !  html_search_engineオプション追加 ! 既存実装をsearch/invertindex.pyに ! Oktavia用コード追加

! テキストをOktaviaに流し込んでビルド

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

! O(n) ! 文書量に線形で処理時間がかかる

!  JSX版 (node.js) ! Pythonドキュメント(10MB)で1分半ぐらい

! Python版 ! Sphinxのドキュメント(850KB)で30分

! PyPyだと95秒!JIT偉い! ! Pythonドキュメントだと6時間?

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

!  傾向が違いすぎる・・・ !  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]

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

!  str = str + substr ! pypy: 19.19 [s], python: 2.44 [s]

!  str += substr ! pypy: 0.0137 [s] python: 0.0023 [s]

strって書いてあるけど文字列じゃなくて数値の配列です

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

!  _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]

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

! ビット演算が重い ! はじめてのC拡張を作り始めたよ(cpython) (今日の昼から)

! 帰りの電車で動いたよ ! Pure Python実装

! pypy: 7.06 [s], python: 22.93 [s] ! C拡張(CPythonのみ)

! pypy: 6.98 [s], python: 1.52 [s]

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

!  速度はかなり改善! !  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]

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

! 転置インデックス方式は東アジアの言語では辛ぽよ

! FM-indexっていう、まったく違う方式があるよ

! Oktaviaは先月のPyConの前日にアップロードしたよ。

! Sphinxに組み込んでみたよ←NEW ! 昨日は遅かったけどだいぶ改善したよ