Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

マピオン様におけるLucene solrの実装

8,821 views

Published on

「Lucene/Solrが切り拓く新たな世界
~Lucene/SolrとHadoopを使った応用事例~」
での資料です。

Published in: Technology
  • Be the first to comment

マピオン様におけるLucene solrの実装

  1. 1. Lucene/Solr が切り拓く新たな世界 ~ Lucene/Solr と Hadoop を使った応用事例~ マピオン様における Lucene/Solr の実装 株式会社データ・コム・ナレッジ 坂田 敏朗 2011/8/26
  2. 2. すこしだけ会社紹介
  3. 3. <ul><li>株式会社データ・コム・ナレッジ </li></ul>ぶっちゃけ小さい会社ですが、一生懸命お客様のために頑張ってる会社です。 Lucene / Solr のコンサルティング もやってます。 2004 年からマピオン様システム開発に参画。
  4. 4. マピオン様の 検索要件
  5. 5. <ul><li>空間検索 ( 緯度経度 ) ができること </li></ul><ul><li>大量アクセスに耐えること ( パフォーマンス ) </li></ul><ul><li>ローカル検索ができること </li></ul><ul><li>  ->場所☓キーワードによる検索 </li></ul><ul><li>  例) 「渋谷」「カレー」で </li></ul><ul><li>    渋谷周辺のカレー屋を検索 </li></ul>
  6. 6. Lucene/Solr 導入の経緯
  7. 7. 2009 年 ORACLE 地図のフリースクロール化 2007 年 ~ 2004 年 フリーキーワード検索 電話帳データ投入 PV 増大 ORACLE Spatial MySQL Spatial FAST Lucene/Solr データ: 10 万件 データ:~ 100 万件 データ: 100 万件~ データ: 100 万件~ データ: 1000 万件~
  8. 8. <ul><li>FAST 、ライセンス代高すぎ </li></ul><ul><li>ライセンス代をケチると、性能を制限される -> 10 クエリー/ sec </li></ul><ul><li>RDB 、データ量が 1000 万件近くになると 空間検索のパフォーマンスが厳しい </li></ul><ul><li>CPU を積んでも、1クエリーあたり1 CPU しか使わないので限界 </li></ul>
  9. 9. さまざまな問題を解決してくれたのが 「 Lucene/Solr 」 <ul><li>オープンソースでライセンス代がかからない </li></ul><ul><li>分散検索によってスケールアウトできる </li></ul><ul><li>ソースコードが公開されているのでカスタマイズも可能 </li></ul>
  10. 10. システム構成
  11. 11. ロードバランサー Solr Solr Solr ロードバランサー Solr Solr Solr Solr Solr RDB Broker インデックスの実体はなく、 Searcher へ分散検索する。 また、ローカル検索の機能を実装している。 Searcher 分割されたインデックスを持ち、実際の検索処理を行う。 Indexer RDB からデータをインポートしインデックス化する。 DataImportHandler レプリケーション Distributed Search Lucene/Solr 3 層構成
  12. 12. カスタマイズ
  13. 13. Lucene/Solr とはいえ、全ての要件を満たしているわけではなかった。。。 オープンソースなので 自分たちで改造しよう!
  14. 14. 空間検索
  15. 15. 導入当初のバージョンは 1.3 。まだ空間検索が実装されていない。 バージョン 1.4 になっても Lucene レベルで実装されてはいたが、 Solr のコンポーネントとしての実装はまだ。 3.1 でようやく Solr のコンポーネントとして実装された。
  16. 16. Solr1.3 のときは 独自に Lucene の Filter を作成したり、インデックスファイルを操作して実装。 検索範囲に隣接する短形で絞り込む 絞り込んだデータに対して距離を計算 指定した距離以上のデータをなくす ※ 計算した距離は絞り込みだけではなく ソート用としても再利用  500m
  17. 17. Solr1.4 のときは lucene-spatial を利用。ただし問題が。。。 距離の単位がマイル ->メートルへの変換が必要 ある形範囲が検索できない ->日本の緯度経度では正しく検索できない   ->どうしたか? 経度を -200 にして、北米の緯度に近いものにして計算
  18. 18. ローカル検索
  19. 19. キーワードから 場所 を特定することはできない。 <ul><li>2つのローカル検索を実装 </li></ul><ul><li>2 BOX 検索   q= キーワード & near= 場所   -> near パラメーターで場所を特定して空間検索に    切り替える </li></ul><ul><li>1 BOX 検索   q= キーワード 場所 & geo=1   -> q パラメーターの中から場所に関するキーワードを    見つけて空間検索に切り替える </li></ul>
  20. 20. トークナイザー
  21. 21. 検索漏れ、辞書メンテナンス 負荷を考えて 基本的に N-GRAM 方式。 ただし、住所検索に関しては 検索ノイズ を軽減するためにトークナイザーを自作。 ->京都府問題  「京都府」で検索すると「東京都府中市」が  ヒットしてしまう。  ->形態素解析+ N-GRAM    形態素解析し3文字以上の場合は     N-GRAM でさらに分割
  22. 22. チューニング
  23. 23. 当初は思ったほどのパフォーマンスがでなかった。 原因を見つけながら様々な施策を施す。 <ul><li>Solr のキャッシュを無効化  緯度経度で検索する場合、キャッシュのヒット率が悪かった。  メモリを他に割り振るために思い切って無効化。 </li></ul><ul><li>Java 起動オプション   Java の FullGC が頻発することによってパフォーマンスが  でていなかった。 Java の起動オプションを調整して解決。 </li></ul><ul><li>ZFS の積極利用  メモリをある程度節約しつつ、その分を ZFS に割り当て  インデックスファイルへの I/O を軽減。 </li></ul><ul><li>ファイルオープン数   Solaris のデフォルト値が 256 だった。  明らかに足りないので 1024 に設定を変更。 </li></ul>
  24. 24. おわりに
  25. 25. Lucene/Solr を早期に導入したことによって、苦労はあった。 ( オープンソースにはつきもの ) ただし、問題を解決していく過程においてエンジニアのスキルアップ、チームワークが良くなっていった。 また、オープンソース導入によって会社の枠を超えての交流も盛んになった。

×