More Related Content
Similar to pixiv サイバーエージェント共同勉強会 solr導入記
Similar to pixiv サイバーエージェント共同勉強会 solr導入記 (20)
pixiv サイバーエージェント共同勉強会 solr導入記
- 23. 文字が長いと途中から検索できない・・・ 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();
- 26. 大量の件数がある場合ソートが重い 全体で1200万件の内 [ 東方 ] というタグには100万件以上ありソートだけで1 .5 秒くらいかかっている 1秒以上かかるものがある時点で検索を捌くことは不可能 データ更新は1分間隔でしていたのでキャッシュの恩威が少ない ちなみにソートをしなければ一瞬で検索できる
- 28. 高速化1 Solr には DistributedSearch という分散インデックス検索ができるのでインデックスを分散する 4分割 ( イラスト ID%4 の余りが番号 ) して各マシンに1つずつインデックスを持てば検索速度が4倍早くなる この機能は検索時にインデックスを持っているサーバーをパラメータで渡すだけでいいのでクライアント側の修正は簡単である 例 q= 東方 &shareds=localhost:8983/solr/index0,localhost:8983/solr/index1
- 29. ※ 補足 左に行くほど新しい 全体のインデックス 4分割された イラストのインデックス 1つのイラストをイメージ index1 index2 index3 index4
- 30. すべてのインデックスから10件分 ( 4分割なので40件分 ) の「東方」の結果を受け取る クライアント 「東方」を検索する その中で10件分の結果が返る 分散検索のイメージ図 4つのインデックスに投げる Solr1 index1 Solr3 index3 Solr2 index2 Solr4 index4 DistributedSearcher