第4回Solr勉強会
第2回から3回目の参加。
http://atnd.org/events/9458
1.Lucene Revolution 参加報告
Basis Technology 平賀一昭 (日本支社)さま, 黒坂輝彦(サンフランシスコ支社)さま
- Lucene Revolutionとは
- Lucid Imagination社主催によるLucene/Solrに関するユーザ会議
- Lucid Imagination社
- LuceneとSolrの商用利用促進のために設立
- コミッタが多数参加
- エンジニア向けトレーニング
- BASISさん主催
- Solrアプリケーション開発3日間コース
- 「Solr勉強会で聞いた」で10% Off !
- 本年度中に申し込みで20% Off!
- Lucene & Solr User Conferenceについて
- ハイアットハーバーサイド(ボストン空港のすぐそば)
- ダウンタウンは遠い。カンファレンスに集中しろって?
- 会場の様子
- 4箇所くらいでセッション
- ホールでは朝食、コーヒー、クッキー
- http://www.lucidimagination.com/events/revolution2010
- Lucene/Solrロードマップ
- 各々のコミッタがやりたいことを主張しているだけ?
- Solr Cloud、大規模処理、リアルタイムが大筋の方向性っぽい
- TwitterでのLuceneの活用
- A Billion Queries Per Day1日10億クエリー
- MySQLからLuceneへ以降
- Luceneの索引周りを改変している模様
- かなりマニアックな内容
- 1000 tps (tweets/sec) => 80M tweets/day
- 12,000 qps => 1G queries/day
- tweetから10秒latency( tweet後検索できるようになるまでの時間)
- tweetから1秒いないにindexing
- 最新のつぶやきを最初に表示したい 索引項目中のdoc listの後ろからスキャン
- 全部検索しないで途中でうちきり
- LUCENE-2329前 postingListはクラスオブジェクトを指していた。オブジェクトの生成が必要で効率が悪い->三つのArrayに分割して効率があがった。Lucene4.0で出てくる?
- docIdとpositionを別々に持っていた。Twitterは文字数が少ないのでpositionは1バイトでよい。docIDを24bit、positionを8bitで表現 > ひとつのintに押しこむ
- Lock-freeアルゴリズム(スレッド間の同期でロックを使わない)
- volatile変数ひとつを使って、スレッド間の同期をとる話
- Java言語規約を深読み。volatile変数の処理順?が決められている
- 実際はJVM内でロックしている気もする
- Solr 3.1とその後
- LuceneとSolrサブプロジェクトの合併
- 次期リリースはSolr 3.1 (Solr 1.5ではなく)
- 現在trunkにあるのは、Solr 4.0になる?
- Solr 3.1新機能
- 拡張DisMaxパーサー。Luceneパーサの構文をサポート。例外をおこらなくするのが目的だった。それを教科。Boostは加算のみだったのが積算で出来るようになる
- 空間・地理検索。緯度経度情報をもとに検索
- 結果のグループ化/フィールドたたみ込み(collapsing)。グーグルの同じサイト内の検索結果をまとめるやつ。任意のフィールドでまとめることができる
- ファセット機能改善。ピボットとして指定されたフィールドによってさらに再分割できる。数値の範囲も指定できる
- Solr Cloud。シェーディングするときにホスト名を羅列しないでよくなる
- 柔軟な索引(?)
- LucidWorks Enterprise
2.SI向けパッケージ製品でのSolr利用と事例紹介
(株)NTTデータ イントラマート 清彰宏さま [twitter:@seikun]さん
- ちょっとだけ会社紹介
- intra-martという開発基盤パッケージ製品を開発
- 以上!
- 謝辞
- 素敵なTシャツとか配れません
- パンフレット用意してません>社長すいません
- Solrを利用した製品の話( IM-ContentsSearch )
- intra-martの機能
- IM-ContentsSearch
- Solrの利用について
- 専用スキーマを設定
- 事例紹介
- 社内の共有ファイル3TBを社内システム(intra-mart)から全文検索したい
- 頑張って上司を口説いた>「やりましょう」
- Solrでの開発は楽しかった・・・・が苦しい道のりの始まりだった
- 基本的な設定など
- 形態素解析
- 定期的にipadicのユーザ辞書を更新(品番・品名・特殊な略称などへの対応)
- ActiveDirecotyとの権限情報の連携
- jcifsで接続して権限情報を取得
- intra-martのグループに専用ツリーを作成
- ADの権限をバッチで同期
- 検索クエリに反映される
- 独自でクローラを開発
- 索引化対象の詳細な設定が可能
- クロール時の苦労話
- データセンタに共有ディスクはない>ファイルは拠点ごとにある
- データセンタの外向き帯域は??>15Mbps
- 対象ファイルは3TB
- 全部クロールするのに20日の計算(帯域全部使ったとして)
- 100M以上のファイルは文書数の2%なので対象外(データの40%を削減)
- お客様の現地でのクローリング1.2T/1.8Tできた
- のこり4日でクロールできる。>初期移行可能に
- これから
- 本番運用開始から5ヶ月経過
- しめ(SIでの)
- Q&A
3.Field Collapsing/Result Groupingについて
(株)シーマーク 大谷純さま
- Field Collapsing / Result Groupingの概要
- SQLでいうdistinctやgroup byのような機能
- SOLR-236としてJIRAに登録
- Solr 1.4.1時点で正式にサポートされていない
- Field Collapsing(SOLR-236)について
- Solr1.4.1にSOLR-236-1_4_1.patchを適用
- QueryComponentの代わりにCollapseComponentを利用
- 動作
- 検索にヒットするドキュメントセットを取得
- 取得したドキュメントセットをcollapse.fieldの値をもとにHashMapを利用してグループ化
- 残念ながらtrunkに採用されず。今後メンテナンスされない可能性大
- Distributed Searchを利用できるのはいいところ。Result Groupingは対応していない
- collapse.fieldにmultiValuedのフィールドは指定できない
- Result Grouping (SOLR-1682 => trunk) について
- trunkのSolrに利用( Solr 4.0 ) Solr 3.1からいける?
- QueryComponentの機能として実装されているため設定不要
- グループ化を行うために2回の検索
- 検索にヒットするドキュメントセットの中のトップグループのドキュメントを取ってくる
- クエリーの結果が同じもの、関数の結果が同じ物など、いろいろグループ化できる
- troup.query=age[20 TO 39]などができる
- Distributed Searchは未対応
- 総グループ数が不明
- multiValuedフィールドでのグループ化は未対応
- SolrJも未対応
- 結論
- Result Groupingの実装を待てる場合は待つ
- 今すぐ使いたければField Collapsingを利用
- 利用しない手を考えるのが現状は妥当かも
4.全文検索エンジンgroongaについて
(有)未来検索ブラジル 末永 匡さま [twitter:@tasukuchan]さん
- プロローグ
- 人に歴史あり -> groongaにも歴史あり
- 全文検索エンジンSenna
- groonga
- 文書の情報も保存。単体で全文検索可能。MySQLにもMyISAMにも頼らない -> 高速な更新を活かせる
- 文書情報の保存:カラムごとに保存 key-valueストアを並列に並べたイメージ
- ベクターカラム(multi valued)
- (例)タグ
- テーブルカラム
- カラム値として、他のテーブルの行、もしくは配列を保存できる。1対Nのデータを扱える
- 単体で全文検索可能
- ネットワークサーバとして起動。HTTP GET, memcached, 独自プロトコル、MessagePackも予定
- HTTP経由では管理ツールが利用出来る(phpMyAdminみたいなもの)
- クエリ言語
- JavaScriptライクな文法(自前パース)
- 結果はJSON(P)/XML/CSV
- コマンドライン
- groongaライブラリ。C言語、Ruby
- その他の特徴
- ドリルダウン(ファセット)
- ジオサーチ(地理情報検索)
- サジェスト(検索キーワード候補)
- ドリルダウン
- ジオサーチ
- サジェスト
- ユーザの検索クエリログを収集。変換途中も含めて全て収集
- 上記ログを解析し、おすすめのクエリを提案
- 提案「全文検索」-> 「grooonga」
- 訂正「gloonga」-> 「groonga」
- 補完「gro」-> 「groonga」
- SQL経由で使いたい
- groongaストレージエンジン。MyISAMそのものを置換
- textsearch_groonga PostgreSQLのインデックス拡張
- 現在開発中
- 複数プロセスでの利用
- 複数スレッド・プロセスで共有可能
- MySQLで更新しつつ、groongaデーモン経由でHTTP検索。参照ロックフリー
- ドキュメント
- 導入事例
- groongaとSolr
- まとめ
- groongaは、Sennaの特徴である「高速な更新」を新に実現するために書かれた全文検索エンジンである
- ためしにつかってみて
- 2010/11/29に勉強会やります。次バージョンリリースします
- http://atnd.org/events/9234
- Q&A
- Q.KVSの場合シーケンシャルな扱いが苦手。range scanなどはうまくいく?
- A.KVSと固定長と可変長のものをわけている。固定長のものはシーケンシャルな扱いはうまくいく。トランザクションをサポートしていないので、range検索しているときに違うものが入ってくることはある。
- Q.大規模なデータに対するものと、拡張性はどうか
- A. 参照が大規模な場合は、MySQLエンジンをちゃんとかけば、MySQLレプリケーションが使える。更新が多い場合はシェーディングが必要。Spiderストレージエンジンなどと組み合わせて高速な更新ができる想定
- Q. Tokenize機能は?
- A. bi-gramとmecabが入っている。bi-gramで1文字検索も高速にできる
LT: Solrの重複uniqueKeyの扱い
ECナビ春山さん
- 単一のshardの場合はないが、複数shardの場合で重複する場合がある
- QueryComponent.javaで処理されている
- uniqueKeyの重複を検出したら、最初に見つかったものが結果に入る。以降は処理しない
- uniqueKeyを重複させたい場合
- 一部の文書だけ頻繁に更新したい
- 最新情報の反映(価格、在庫など)
- 更新は重たい
- 更新用のデータ数の小さいshardをつくる
- shardの名前の大小で優先順位をつける
- timestampNoフィールドで優先順位をつける
- 作ってみた
- https://github.com/haruyama/solr
- 実装はちょー適当
- 一部の文書だけ頻繁に更新したい