SlideShare a Scribd company logo
1 of 30
pixiv Solr 導入記 X
[object Object],[object Object],[object Object],[object Object]
Java が好きなんですが pixiv には Java 好きは居ません・・・
目次 ,[object Object],[object Object],[object Object],[object Object]
Solrを導入する目的 Tritonn による検索に限界があるため検索専用のアプリケーションを模索 検索だけで30台ある台数を減らせればいいなぁ モバイルで人気順ソートを実装する
Tritonn時代のマシン構成 ,[object Object],Mysql-Tritton(senna) を使用 ,[object Object],AthlonX2 4850e 2.50GHz (2 コア ) Mem 8G SSD X25(80GB) or C300(64GB)
でのTritonnの問題点
[object Object],MyISAM のため Replication で更新クエリーがくるとそこでロックがかかってしまう ,[object Object],ロックがかかるため CPU が1コア分くらいしか使い切れていない ,[object Object],たとえば6を検索したとき⑥や全角半角の6なども OR 検索し条件が増える 揺らぎ補正のため Normalize は Off にできない ,[object Object],Tritonn が組み込まれたバージョンを使用しなければならないため Mysql5.1 などにアップグレードできなかった
[object Object],[object Object],[object Object],いろいろ重い検索条件を載せたかったのですがエロワードばかりなので自主規制・・・
これはやばい! よし!Solrだ! 現在でも捌けないのに人気順ソートをモバイルに実装する必要がでてくる・・・
Solrの特徴
[object Object],[object Object],Master が持っているファイルをスレーブにコピーするだけ 内部で rsync と同じようなことをしているだけ ,[object Object],設定ファイルを書くだけで起動すれば勝手に転送される Master と同じインデックスファイルをもらうだけ ,[object Object],[object Object]
[object Object],  Solr はドキュメントを追加した後に Commit を行って初めてデータが反映される ( トランザクションに近い? )    その Commit が結構な負荷のため1件ずつリアルタイムで更新せず溜め込んだデータをバッチで一気に処理する   pixiv では更新されたイラスト情報を Mysql のトリガーでログテーブルに保存しそのログを元に Scala で差分更新処理をしている ,[object Object], 頻繁に更新するとクエリーキャッシュの意味を余り成さない ,[object Object], 他にも XML や JSON などあり
Solr3.2.0を使用 ,[object Object]
tokenizer : NGramTokenizer  指定された文字数で分割する
filter : LowerCaseFilter  大文字英字を小文字に変換
charfilter : MappingCharFilterFactory  後ほど説明
データ構造
uniqueKey: illust_id
その他検索に必要なタグ、タイトル、コメント、作品が R18 かどうかなど
illust_id 以外はインデックスのみでデータを持たない
Solr検証時の問題点
文字が長いと途中から検索できない・・・ NGramTokenizer という Solr 標準の Tokenizer を使用してたのですが コードを読んでみると最大値がなぜか 1024 文字固定になっていたため可変に修正 solr-3.2.0/lucene/contrib/analyzers/common/src/java/org/apache/lucene/analysis/ngram/NGramTokenizer.java 修正前コード char[] chars = new char[1024]; input.read(chars);​ inStr = new String(chars).trim(); 修正後コード CharArrayWriter writer = new CharArrayWriter(1024); int c; while((c = input.read()) != -1) {     writer.write(c); } inStr = new String(writer.toCharArray()).trim();
MultiValueを使うと検索結果がおかしい unigram で2文字以上の検索ワードを投げるとタグがくっついた形ヒットする 例えばタグに [ オリジナル ] [ パン ] というタグがあったとして 「ルパン」と検索すると・・・ [ オリジナ ル ] [ パン ]  という様に分かれているタグが引っかかってしまう 対処法が分からなかったため検索ワードの文字数によって unigram と bigram のインデックスを使い分けて対処した オリジナル 猫の検索例    tag_bigram: オリジナル  OR tag_unigram: 猫
半角カタカナ文字にヒットしない 半角カタカナを全角カタカナでヒットさせるには自前で設定をしなければならない (NGramTokenizer を使用する場合 ) その場合 MappingCharFilterFactory というフィルターを使って Normalize することができる 設定例 " ガ "=>" ガ " " ギ "=>" ギ " pixiv では「へ」はどちらでもヒットするように設定 " へ "=>" ヘ " " べ "=>" ベ " " ぺ "=>" ペ "
大量の件数がある場合ソートが重い 全体で1200万件の内 [ 東方 ] というタグには100万件以上ありソートだけで1 .5 秒くらいかかっている 1秒以上かかるものがある時点で検索を捌くことは不可能 データ更新は1分間隔でしていたのでキャッシュの恩威が少ない ちなみにソートをしなければ一瞬で検索できる
じゃあ高速化しましょう!
高速化1 Solr には DistributedSearch という分散インデックス検索ができるのでインデックスを分散する 4分割 ( イラスト ID%4 の余りが番号 ) して各マシンに1つずつインデックスを持てば検索速度が4倍早くなる この機能は検索時にインデックスを持っているサーバーをパラメータで渡すだけでいいのでクライアント側の修正は簡単である 例 q= 東方 &shareds=localhost:8983/solr/index0,localhost:8983/solr/index1
※ 補足 左に行くほど新しい 全体のインデックス 4分割された イラストのインデックス 1つのイラストをイメージ index1 index2 index3 index4
すべてのインデックスから10件分 ( 4分割なので40件分 ) の「東方」の結果を受け取る クライアント 「東方」を検索する その中で10件分の結果が返る 分散検索のイメージ図 4つのインデックスに投げる Solr1 index1 Solr3 index3 Solr2 index2 Solr4 index4 DistributedSearcher

More Related Content

What's hot

オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
Kota Mizushima
 

What's hot (20)

いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
 
SPAのルーティングの話
SPAのルーティングの話SPAのルーティングの話
SPAのルーティングの話
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
 
モノタロウの商品データ連携について
モノタロウの商品データ連携についてモノタロウの商品データ連携について
モノタロウの商品データ連携について
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る 
 
Firestoreでマスタ取得を
効率化するいくつかの方法
Firestoreでマスタ取得を
効率化するいくつかの方法Firestoreでマスタ取得を
効率化するいくつかの方法
Firestoreでマスタ取得を
効率化するいくつかの方法
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
モノタロウを支える Solr による商品検索システム
モノタロウを支える Solr による商品検索システムモノタロウを支える Solr による商品検索システム
モノタロウを支える Solr による商品検索システム
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
 

Viewers also liked

2011-07-15 チューニングが楽になる JavaScript 道具箱
2011-07-15 チューニングが楽になる JavaScript 道具箱2011-07-15 チューニングが楽になる JavaScript 道具箱
2011-07-15 チューニングが楽になる JavaScript 道具箱
Takuya Yokono
 
カップリング検索プレゼン2
カップリング検索プレゼン2カップリング検索プレゼン2
カップリング検索プレゼン2
sakana1123
 
Vagrant intro
Vagrant introVagrant intro
Vagrant intro
t9md
 
20110715 enterprise wiki search
20110715 enterprise wiki search20110715 enterprise wiki search
20110715 enterprise wiki search
Shigeki Yamato
 
海外向けサービスの苦労話
海外向けサービスの苦労話海外向けサービスの苦労話
海外向けサービスの苦労話
Masakazu Matsushita
 
iOS App performance tuning with Instruments
iOS App performance tuning with InstrumentsiOS App performance tuning with Instruments
iOS App performance tuning with Instruments
gc-hiramatsu
 
サーバの構築作業や運用管理を自動化する「Chef」 (CADC研究レポート発表LT)
サーバの構築作業や運用管理を自動化する「Chef」 (CADC研究レポート発表LT)サーバの構築作業や運用管理を自動化する「Chef」 (CADC研究レポート発表LT)
サーバの構築作業や運用管理を自動化する「Chef」 (CADC研究レポート発表LT)
Yuuki Namikawa
 
OpenCVによる顔認識システムの開発
OpenCVによる顔認識システムの開発OpenCVによる顔認識システムの開発
OpenCVによる顔認識システムの開発
Takahiko Teramoto
 

Viewers also liked (20)

memcachedからKyotoTycoonへ
memcachedからKyotoTycoonへmemcachedからKyotoTycoonへ
memcachedからKyotoTycoonへ
 
2011-07-15 チューニングが楽になる JavaScript 道具箱
2011-07-15 チューニングが楽になる JavaScript 道具箱2011-07-15 チューニングが楽になる JavaScript 道具箱
2011-07-15 チューニングが楽になる JavaScript 道具箱
 
カップリング検索プレゼン2
カップリング検索プレゼン2カップリング検索プレゼン2
カップリング検索プレゼン2
 
Vagrant intro
Vagrant introVagrant intro
Vagrant intro
 
20110715 enterprise wiki search
20110715 enterprise wiki search20110715 enterprise wiki search
20110715 enterprise wiki search
 
アメーバピグのサーバとクライアントはどうやって通信しているのか
アメーバピグのサーバとクライアントはどうやって通信しているのかアメーバピグのサーバとクライアントはどうやって通信しているのか
アメーバピグのサーバとクライアントはどうやって通信しているのか
 
波に乗ってUnity3Dを使ってみているんだが (Ameba x Pixiv 合同勉強会LT)
波に乗ってUnity3Dを使ってみているんだが (Ameba x Pixiv 合同勉強会LT)波に乗ってUnity3Dを使ってみているんだが (Ameba x Pixiv 合同勉強会LT)
波に乗ってUnity3Dを使ってみているんだが (Ameba x Pixiv 合同勉強会LT)
 
Matrix Factorizationを使った評価予測
Matrix Factorizationを使った評価予測Matrix Factorizationを使った評価予測
Matrix Factorizationを使った評価予測
 
松本克彦 ピグにおけるリアルタイムランキングの導入
松本克彦 ピグにおけるリアルタイムランキングの導入松本克彦 ピグにおけるリアルタイムランキングの導入
松本克彦 ピグにおけるリアルタイムランキングの導入
 
実録 WEBエンジニアが Titanium Mobileアプリを開発するまで
実録 WEBエンジニアが Titanium Mobileアプリを開発するまで実録 WEBエンジニアが Titanium Mobileアプリを開発するまで
実録 WEBエンジニアが Titanium Mobileアプリを開発するまで
 
海外向けサービスの苦労話
海外向けサービスの苦労話海外向けサービスの苦労話
海外向けサービスの苦労話
 
Ca勉強会・ldについて
Ca勉強会・ldについてCa勉強会・ldについて
Ca勉強会・ldについて
 
iOS App performance tuning with Instruments
iOS App performance tuning with InstrumentsiOS App performance tuning with Instruments
iOS App performance tuning with Instruments
 
サーバの構築作業や運用管理を自動化する「Chef」 (CADC研究レポート発表LT)
サーバの構築作業や運用管理を自動化する「Chef」 (CADC研究レポート発表LT)サーバの構築作業や運用管理を自動化する「Chef」 (CADC研究レポート発表LT)
サーバの構築作業や運用管理を自動化する「Chef」 (CADC研究レポート発表LT)
 
iPhoneで動くFlash Playerを実装した苦労話LT資料
iPhoneで動くFlash Playerを実装した苦労話LT資料iPhoneで動くFlash Playerを実装した苦労話LT資料
iPhoneで動くFlash Playerを実装した苦労話LT資料
 
OpenCVによる顔認識システムの開発
OpenCVによる顔認識システムの開発OpenCVによる顔認識システムの開発
OpenCVによる顔認識システムの開発
 
Inside png
Inside pngInside png
Inside png
 
kontagent紹介資料
kontagent紹介資料kontagent紹介資料
kontagent紹介資料
 
From MongoDB v1.8.2 To v2.0.2
From MongoDB v1.8.2 To v2.0.2From MongoDB v1.8.2 To v2.0.2
From MongoDB v1.8.2 To v2.0.2
 
松本克彦 Flash stage3dに対応した3d物理演算ライブラリの検証
松本克彦 Flash stage3dに対応した3d物理演算ライブラリの検証松本克彦 Flash stage3dに対応した3d物理演算ライブラリの検証
松本克彦 Flash stage3dに対応した3d物理演算ライブラリの検証
 

Similar to pixiv サイバーエージェント共同勉強会 solr導入記

LIFULL HOME'S「かざして検索」リリースの裏側
LIFULL HOME'S「かざして検索」リリースの裏側LIFULL HOME'S「かざして検索」リリースの裏側
LIFULL HOME'S「かざして検索」リリースの裏側
Takuro Hanawa
 
0730 bp study#35発表資料
0730 bp study#35発表資料0730 bp study#35発表資料
0730 bp study#35発表資料
Yasuhiro Horiuchi
 
Hadoop conferencejapan2011
Hadoop conferencejapan2011Hadoop conferencejapan2011
Hadoop conferencejapan2011
Ichiro Fukuda
 
事例紹介「なうまぴおん」
事例紹介「なうまぴおん」事例紹介「なうまぴおん」
事例紹介「なうまぴおん」
Eiji Iwazawa
 
GrowthForecastことはじめ
GrowthForecastことはじめGrowthForecastことはじめ
GrowthForecastことはじめ
Makoto Taniwaki
 
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
mitamex4u
 

Similar to pixiv サイバーエージェント共同勉強会 solr導入記 (20)

LIFULL HOME'S「かざして検索」リリースの裏側
LIFULL HOME'S「かざして検索」リリースの裏側LIFULL HOME'S「かざして検索」リリースの裏側
LIFULL HOME'S「かざして検索」リリースの裏側
 
マルウェア分類に用いられる特徴量 Kaggle - Malware Classification Challenge勉強会
マルウェア分類に用いられる特徴量	 Kaggle - Malware Classification Challenge勉強会マルウェア分類に用いられる特徴量	 Kaggle - Malware Classification Challenge勉強会
マルウェア分類に用いられる特徴量 Kaggle - Malware Classification Challenge勉強会
 
HTMLからの本文抽出
HTMLからの本文抽出HTMLからの本文抽出
HTMLからの本文抽出
 
0730 bp study#35発表資料
0730 bp study#35発表資料0730 bp study#35発表資料
0730 bp study#35発表資料
 
Hadoop conferencejapan2011
Hadoop conferencejapan2011Hadoop conferencejapan2011
Hadoop conferencejapan2011
 
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
SageMaker Neoの可能性について- 第3回 Amazon SageMaker 事例祭り+体験ハンズオンSageMaker Neoの可能性について- 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
 
事例紹介「なうまぴおん」
事例紹介「なうまぴおん」事例紹介「なうまぴおん」
事例紹介「なうまぴおん」
 
Haikara
HaikaraHaikara
Haikara
 
Python による 「スクレイピング & 自然言語処理」入門
Python による 「スクレイピング & 自然言語処理」入門Python による 「スクレイピング & 自然言語処理」入門
Python による 「スクレイピング & 自然言語処理」入門
 
GrowthForecastことはじめ
GrowthForecastことはじめGrowthForecastことはじめ
GrowthForecastことはじめ
 
Kaggleのテクニック
KaggleのテクニックKaggleのテクニック
Kaggleのテクニック
 
Kerasで深層学習を実践する
Kerasで深層学習を実践するKerasで深層学習を実践する
Kerasで深層学習を実践する
 
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
 
使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!
 
Drupal補完計画
Drupal補完計画Drupal補完計画
Drupal補完計画
 
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
 
Kobe.R #15 - Incanter チョットシッテル
Kobe.R #15 - Incanter チョットシッテルKobe.R #15 - Incanter チョットシッテル
Kobe.R #15 - Incanter チョットシッテル
 
Sinatra風マイクロフレームワークで始めるPython
Sinatra風マイクロフレームワークで始めるPythonSinatra風マイクロフレームワークで始めるPython
Sinatra風マイクロフレームワークで始めるPython
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
20121215 DevLOVE2012 Mahout on AWS
20121215 DevLOVE2012 Mahout on AWS20121215 DevLOVE2012 Mahout on AWS
20121215 DevLOVE2012 Mahout on AWS
 

pixiv サイバーエージェント共同勉強会 solr導入記