全文検索エンジンgroongaの紹介@Solr勉強会

41
1 全文検索エンジン groongaの紹介 (有)未来検索ブラジル・(株)wktk 末永 a.k.a. グニャラくん Twitter: @tasukuchan

description

第四回Solr勉強会にて発表した、全文検索エンジンgroongaについての講演です。

Transcript of 全文検索エンジンgroongaの紹介@Solr勉強会

Page 1: 全文検索エンジンgroongaの紹介@Solr勉強会

1

全文検索エンジンgroongaの紹介

(有)未来検索ブラジル・(株)wktk末永 匡 a.k.a. グニャラくんTwitter: @tasukuchan

Page 2: 全文検索エンジンgroongaの紹介@Solr勉強会

2

Solr勉強会なのに…• 発表の機会を与えていただいてありがとうございます。

Page 3: 全文検索エンジンgroongaの紹介@Solr勉強会

3

自己紹介• (有)未来検索ブラジルにて、「2ちゃんねる検索」や「ニコニコ大百科」の開発に従事

• 「グニャラくん」という名前で活動• (株)wktkというペーパーカンパニーの代表

Page 4: 全文検索エンジンgroongaの紹介@Solr勉強会

4

プロローグ• 人に歴史あり

• groongaにも歴史あり

Page 5: 全文検索エンジンgroongaの紹介@Solr勉強会

5

全文検索エンジンSenna

http://qwik.jp/senna/

Page 6: 全文検索エンジンgroongaの紹介@Solr勉強会

6

Sennaの特徴(1)• 高速なインデックス更新

‒ 参照ロックフリーなデータ構造を採用‒ データ更新時に検索を阻害しない

Twitterなどのリアルタイム検索をターゲット

Page 7: 全文検索エンジンgroongaの紹介@Solr勉強会

7

Sennaの特徴(2)• 全文検索「ライブラリ」

‒ 全文検索用の転置インデックスのみを更新‒ 文書の情報を持たない

•本文•タイトル•日付• etc.

文章情報を保存する場所が必要

Page 8: 全文検索エンジンgroongaの紹介@Solr勉強会

8

文書情報• 文書の情報はどこに保存するの?• 文書の情報での絞り込みやソートはどうやるの?

それMySQLにやらせればよくね?

Page 9: 全文検索エンジンgroongaの紹介@Solr勉強会

9

Tritonn• MySQL + Senna = Tritonn

‒ MySQL組み込みの全文検索演算子を乗っ取る

• MySQLが文書ファイルを管理

SQLを用いて、全文検索

Page 10: 全文検索エンジンgroongaの紹介@Solr勉強会

10

Tritonnのクエリ• SQLを用いた柔軟な問い合わせ

‒ 全文検索‒ 並び替え‒ グループ化‒ これらを複雑に組み合わせた問い合わせ

Page 11: 全文検索エンジンgroongaの紹介@Solr勉強会

11

Tritonnのクエリ例• SELECT * FROM table1WHERE MATCH(body)AGAINST(‘クエリ’)ANDlast_update > '2010/01/31';

Page 12: 全文検索エンジンgroongaの紹介@Solr勉強会

12

Tritonnのよいところ• MySQLの資産が使える

‒ 人的資産(エンジニア)‒ 物的資産(ソフトウェア)

• SQLを用いた柔軟なクエリが書ける

悪いところもあった

Page 13: 全文検索エンジンgroongaの紹介@Solr勉強会

高速• 特にチューニングしないSolrと特にチューニングしていない Tritonn にデータをつっこんでみた(100万件).

‒ Solrが10倍以上速かった.• 検索の速度については十分なデータは取っていませんが, Buzzurlの状況を見るとTritonnの同等以上のようです.

@Mashup Caravan in Tokyo by ECナビ 春山さん

Page 14: 全文検索エンジンgroongaの紹介@Solr勉強会

14

Tritonnの悪いところ• 更新が遅い!• 更新時に、検索スループットが悪い!

「高速な更新」をうたっていたのに?

Page 15: 全文検索エンジンgroongaの紹介@Solr勉強会

15

Tritonnの仕組み• MySQLはストレージエンジンというデータ保存部分を選択できる‒ MyISAM‒ InnoDB

• MySQLオリジナルの全文検索は、MyISAMのみで利用できる

TritonnはMyISAMの全文検索を置換

Page 16: 全文検索エンジンgroongaの紹介@Solr勉強会

16

MyISAMとテーブルロック• MyISAMはテーブル単位でロックを行う

‒ 更新スループットの低下‒ 更新時に、検索を阻害

• Sennaの「高速な更新」‒ ロックフリーなデータ構造‒ データ更新時に検索を阻害しない

ムジュンしている!

Page 17: 全文検索エンジンgroongaの紹介@Solr勉強会

17

めざせTritonn越え• TritonnではSennaの設計特性を活かすことが出来なかった。

設計特性を活かした検索エンジンの開発へ

Page 18: 全文検索エンジンgroongaの紹介@Solr勉強会

18

groonga

http://groonga.org/

Page 19: 全文検索エンジンgroongaの紹介@Solr勉強会

19

groongaの特徴• 文書の情報も保存

‒ MyISAMに頼らない• groonga単体で全文検索可能

‒ MySQLに頼らない

「高速な更新」を活かす

Page 20: 全文検索エンジンgroongaの紹介@Solr勉強会

20

文書情報の保存• 文書情報の保存: カラムごとに保存

‒ key-valueストアを並列に並べたイメージ

主キー id

black 1

white 2

red 3

green 4

pink 5

id 値

1 黒

2 白

3 赤

4 緑

5 ピンク

id 値

1 ¥100

2 ¥200

3 ¥150

4 ¥450

5 ¥1,000

id 値

1 2010/11/29

2 2010/10/03

3 2009/08/30

4 2008/01/15

5 2010/05/05

主キー 色名 金額 更新日

Page 21: 全文検索エンジンgroongaの紹介@Solr勉強会

21

ベクターカラム(multiValued)• カラム値として、配列を保存できる。• 例) タグ

主キー id

black 1

white 2

red 3

green 4

pink 5

id 値

1 ["漆黒", "黒鉛", "黒猫", "黒砂糖"]

2 ["美白", "白衣"]

3 []

4 ["緑化"]

5 ["桃", "桃色吐息"]

主キー タグ

Page 22: 全文検索エンジンgroongaの紹介@Solr勉強会

22

テーブルカラム• カラム値として、他のテーブルの行、もしくはその配列を保存できる。

id 値

1 ["漆黒", "黒鉛", "黒猫", "黒砂糖"]

2 ["美白", "白衣"]

3 []

4 ["緑化"]

5 ["桃", "桃色吐息"]

タグ主キー id

漆黒 1

黒猫 2

美白 3

緑化 4

主キー

Page 23: 全文検索エンジンgroongaの紹介@Solr勉強会

23

groongaの特徴• 文書の情報も保存

‒ MyISAMに頼らない• groonga単体で全文検索可能

‒ MySQLに頼らない

Page 24: 全文検索エンジンgroongaの紹介@Solr勉強会

24

groonga単体で全文検索可能• ネットワークサーバとして起動

‒ HTTP GET‒ memcached バイナリプロトコル‒ 独自プロトコル‒ MessagePack(未実装)

• HTTP経由では、管理ツールが利用できる‒ phpMyAdminみたいなもの

Page 25: 全文検索エンジンgroongaの紹介@Solr勉強会

25

クエリ言語• クエリの実行系を搭載

‒ 条件はJavaScriptライクな文法‒ 結果はJSON(P)/XML/CSV

• 例:http://server/d/select.json?table=table1&filter=body @ 'クエリ' && last_update > '2010/01/31' &offset=0&limit=5&callback=func

Page 26: 全文検索エンジンgroongaの紹介@Solr勉強会

26

その他の利用形態• groonga単体

‒ ネットワークサーバ‒ コマンドライン

• groongaライブラリ‒ C言語‒ Ruby

前者はSolr、後者はLuceneに相当

Page 27: 全文検索エンジンgroongaの紹介@Solr勉強会

27

その他の特徴• ドリルダウン(ファセット)• ジオサーチ(地理情報検索)• サジェスト(検索キーワード候補の提案)

Page 28: 全文検索エンジンgroongaの紹介@Solr勉強会

28

ドリルダウン• 検索結果を、特定のカラムでグループ化

‒ GROUP BY• ベクターカラム(multiValued)でも可能

‒ 検索結果中に、それぞれのタグが何件あるか• 転置インデックスを用いたドリルダウンは実装予定‒ 検索結果が多い場合に有利‒ Solrにはあるよ

Page 29: 全文検索エンジンgroongaの紹介@Solr勉強会

29

ジオサーチ• 地理情報の検索

‒ ある地点からの距離計算‒ ある地点を中心とした円内にあるかどうか‒ ある2点で定義される矩形内にあるかどうか‒ 楕円体としてきちんと計算してるよ!

• 日本測地系/世界測地系両対応• インデックスを用いて高速に検索可能

Page 30: 全文検索エンジンgroongaの紹介@Solr勉強会

30

サジェスト• ユーザの検索クエリログを収集

‒ 検索フォームに入力された文字を、途中経過を含めてすべてログ収集

• 上記ログを解析し、オススメのクエリを提案する‒ 提案 (「全文検索」→「groonga」)‒ 訂正 (「gloonga」→「groonga」)‒ 補完 (「gro」→「groonga」)

Page 31: 全文検索エンジンgroongaの紹介@Solr勉強会

31

SQL経由で使いたい• groongaストレージエンジン

‒ MySQL + groonga‒ MyISAMそのものを置換する

• textsearch_groonga‒ PostgreSQL + groonga‒ PostgreSQLのインデックス拡張

正式リリースをお待ちあれ!

Page 32: 全文検索エンジンgroongaの紹介@Solr勉強会

32

複数プロセスでの利用• 複数スレッド・プロセスで共有可能

‒ 更新のみシリアライズされる• MySQLで更新、groongaデーモン経由でHTTPで検索‒ 複数プロセスで利用しても参照ロックフリー

Page 33: 全文検索エンジンgroongaの紹介@Solr勉強会

33

ドキュメント• 詳細な特徴はhttp://groonga.org/docs/

• チュートリアルを一通りこなすと、だいたいの機能の使い方が分かる…はず

Page 34: 全文検索エンジンgroongaの紹介@Solr勉強会

34

導入事例• groongaデーモン

‒ 某Webサイトでのアイテム検索• groongaライブラリ(Ruby)

‒ 某番組情報サイトの検索‒ buzztter

商用・高負荷サイトでの導入実績あり

Page 35: 全文検索エンジンgroongaの紹介@Solr勉強会

35

今日はSolr勉強会

Page 36: 全文検索エンジンgroongaの紹介@Solr勉強会

36

groongaとSolr• groongaとSolrどっちを使うのがオススメ?

Page 37: 全文検索エンジンgroongaの紹介@Solr勉強会

37

1つの判断基準• 『ゾウの時間ネズミの時間』サイズの生物学 (本川達雄著 中公新書)

• 技術というものは、次の三つの点から、評価されなければならない。‒ 使い手の生活を豊かにすること‒ 使い手と相性がいいこと‒ 使い手の住んでいる環境と相性がいいこと

これを当てはめると…

Page 38: 全文検索エンジンgroongaの紹介@Solr勉強会

38

3要件のあてはめ• 使い手の生活を豊かにすること

‒ 対象となるデータセットにおいて、実運用に近い環境で所定の性能が出るかどうか

• 使い手と相性がいいこと‒ 実際に使ってみて、手になじむかどうか

• 使い手の住んでいる環境と相性がいいこと‒ Javaでアプリケーションを運用している場合、Lucene/Solrが合っている。

Page 39: 全文検索エンジンgroongaの紹介@Solr勉強会

39

まとめ• groongaは、Sennaの特徴である「高速な更新」を真に実現するために書かれた全文検索エンジンである。

• ためしに使ってみて!

• 開発者募集中!! バグ報告募集中!!• 2010/11/29にgroonga勉強会やる&次バージョンリリースします!‒ http://atnd.org/events/9234

Page 40: 全文検索エンジンgroongaの紹介@Solr勉強会

40

Solrスゲェ!

Page 41: 全文検索エンジンgroongaの紹介@Solr勉強会

41

Thank you!