groonga を囲む夕べ - nanapi 利用事例 - - nanapi 利用事例 -
株式会社 nanapi CTO 和田修一[email protected]
自己紹介
• サイト内検索として利用• 検索のサジェストとして利用
活用事例
困ったこと&ほしい機能
本日のアジェンダ
自己紹介
和田修一 (わだっぷ)名前
株式会社 nanapi 取締役 CTO
所属
Unix 的なアレ - http://d.hatena.ne.jp/wadap/
BLOG
nanapi ご存知ですか?
リリース月間 UU月間 PV記事数
: 2009 年 9 月: 1700 万: 5000 万: 50000 件
いままでの検索エンジンの経緯
2009 2009年年99月月 検索なんてできなかった 検索なんてできなかった
2010 2010年年33月月 Tritonn Tritonn導入導入
2012 2012年年44月月 mroonga mroonga導入導入
mroonga の wrapper mode を利用
利用方法
※innoDB の Transaction を利用したいため
主につかっている場所
サイト内検索サイト内検索
検索サジェスト検索サジェスト
主につかっている場所
サイト内検索サイト内検索
検索サジェスト検索サジェスト
実際につかっている場所 その1
サイト内検索サイト内検索
ただ全部のデータをつっこめばいいのだが ...
wiki のスタイルをとっていたため、複数バージョンを保有している
記事マスタデータ
Ver1 Ver2 Ver3
Ver1 Ver2 Ver3
記事マスタ DB 内に複数のバージョンを保有
記事記事
記事記事
テーブル構造的には
記事マスタ記事マスタ 文章文章
1記事マスタに対して、文章を複数保有1記事マスタに対して、文章を複数保有
その他にも検索条件追加したり、ソート条件などもいろいろ入れたくなる
将来的なことを考えても ...
記事マスタ (MySQL)
Pageview(TokyoTyrant)
評価情報( MySQL )
カテゴリー階層データ (MySQL)
検索用データ
検索用にテーブルを用意して、マージ
・記事保存時のコールバック・バッチ処理
サイト内検索
PVPV のような随時変わるもの以外は、のような随時変わるもの以外は、ほぼ全てコールバックメソッドで保存ほぼ全てコールバックメソッドで保存
主につかっている場所
サイト内検索サイト内検索
検索サジェスト検索サジェスト
実際につかっている場所 その2
検索サジェスト検索サジェスト
サジェストの元データとして
サジェストのデータに、階層構造データを利用
検索ワードサジェストの出し方
恋愛
恋愛したい
心構え
チャンスを逃さない
女性の見抜き方
男性の見抜き方
男性編
女性編
男心を理解する
いい女になる
女子力を高める
モテる方法
編集+ SEO 解析観点
検索ワードサジェストの出し方
id parent_id 階層名
(短い)
階層名(長い) ローマ字
1 0 恋愛のハウツー 恋愛 rennai
2 1 恋愛したい これから恋愛したい人のためのハウツー rennai
3 2 心構え 恋をしたい人の心構え kokorogamae
4 2チャンスを逃さな
い恋のチャンスを逃さない方法 tyansuwonogasanai
オーソドックスな階層構造管理オーソドックスな階層構造管理
テーブル構造
インデックスの貼り方
id parent_id 階層名
(短い)
階層名(長い) ローマ字
1 0 恋愛のハウツー 恋愛 rennai
2 1 恋愛したい これから恋愛したい人のためのハウツー rennai
3 2 心構え 恋をしたい人の心構え kokorogamae
4 2チャンスを逃さな
い恋のチャンスを逃さない方法 tyansuwonogasanai
階層名とローマ字で複合階層名とローマ字で複合 INDEXINDEX
実際の結果
良い感じの結果が返ってくる良い感じの結果が返ってくる
mroonga で困ったこと!
mroonga でこまったこと
mysql > INSERT INTO search_table (id, data) VALUES (1, "foo");mysql > INSERT INTO search_table (id, data) VALUES (1, "foo");
idid をを pkpk にしていますにしています
mroonga でこまったこと
mysql > INSERT INTO search_table (id, data) VALUES (1, "foo");mysql > SELECT mysql > INSERT INTO search_table (id, data) VALUES (1, "foo");mysql > SELECT LAST_INSERT_ID();LAST_INSERT_ID();+-------------------------+| LAST_INSERT_ID() |+-------------------------+| 0 | +-------------------------+| LAST_INSERT_ID() |+-------------------------+| 0 | +-------------------------+1 row in set (0.00 sec)+-------------------------+1 row in set (0.00 sec)
(Σ(Σ ゚゚ дд ゚゚ lll)lll) ガーンガーン
mroonga でこまったこと
.... と思ったら!
(∩´∀(∩´∀ `` )∩)∩ ワーイワーイ
mroonga でこまったこと
mroonga にあるといいな!
mysql > SELECT ....mysql > SELECT ....MATCH (txt1,txt2) AGAINST (“*W1:1, 2:3 foo”);MATCH (txt1,txt2) AGAINST (“*W1:1, 2:3 foo”);
Tritonn ではワードの重み付けができた
TritonnTritonn ではマルチセクションでではマルチセクションで重み付けができた!重み付けができた!
nanapi で利用するにあたって
nanapi での利用事例は今後FB していきたいと思います!