kentana20 技忘録

技術ネタを中心に、セミナー、勉強会、書籍、会社での出来事を綴っていきます。不定期更新。

第13回Solr勉強会に行ってきました

1/29(水) に渋谷のVoyage Groupさんで開催された「Solr勉強会」に参加してきました。

イベントの詳細はこちら。
http://solr.doorkeeper.jp/events/7260

f:id:kentana20:20140130114205j:plain

Apache Solr入門の改訂新版が出版されたので、その宣伝も兼ねて?の開催でした。

新版はこちら

[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン (Software Design plus)

[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン (Software Design plus)

タイムテーブルはこんな感じ。

  • 株式会社NTTデータCCS 鈴木 教嗣さん
  • 株式会社ロンウイット 関口 宏司さん
    • 「Solr SearchComponent 再訪」
  • 株式会社 ロンウイット 大須賀 稔さん
    • 「自動補完(Autocomplete)ともしかして?(Did You Mean?)」
  • 楽天株式会社 平賀 一昭さん
    • Lucene Revolution 2013 Dublin振り返り」

全文検索エンジンの基礎的な部分から、solrのコンポーネント、4.xで実装された機能の紹介、Solr/Luceneのイベントといった幅広い内容で「浅く、広く」といった感じの内容でした。どうでもよい話ですが、Voyage Groupさんの会議室はスタイリッシュでカッコいいですね〜。Ajitoでは備え付けのドリンクがフリーでいただけるそうです。

ちなみに、一休.comでも詳しくは語れませんが、サービスの一部でSolrを使っています。新しい発見やアイデアが浮かぶと良いな〜、と漠然と考えながら上司とともに参戦してきました。

はじめての検索エンジン&Solr

スライド:公開されたら更新します

検索エンジンと検索方式

検索エンジンは柔軟かつ高速なフリーワード検索を行うための仕組みです。文書(ドキュメント)に対して索引(インデックス)を作ることで文書内の検索を高速に行うことができます。文書はRDBのレコードに相当します。検索の仕方にはデータの先頭から探していく「順次検索」と索引(インデックス)から探していく「索引検索」があり、索引検索を行う場合は事前にインデックスを作っておく必要があります。インデックスは文書を特定の単位(意味のある単語)で区切り、インデックスのキーとして、それに紐づく文書番号を保持したものです。

Solrの話

JettyとかTomcatとかで動作するミドルウェアLuceneのサブプロジェクトとして活発に活動が行われているそうです。Solrの特徴としては以下のようなものがあり、スコア(順位)のソートもできるし、ファセットやグルーピング(後述)もできます。Solrに対して検索をリクエストする場合はSolr用の検索クエリ(Lucene互換)を使用します。

  • Solr特徴
    • すべてJavaで書かれているオープンソースプログラム
    • 比較的容易に検索サーバを構築できる
    • スケールできる
    • キャッシュもできる

導入する目的・効果としては「DBサーバの負荷軽減」でしょうか、RDBでは重いクエリをSolrにまかせてしまおう、ということですね。納得です。スライドがまだ公開されていない?ようなので、メモがとりきれなかった部分は公開されたら更新したいと思います。

Solr SearchComponent 再訪

スライド:公開されたら更新します

精度と再現率

検索エンジンの精度(正確性)は「精度(Precision)」と「再現率(Recall)」によって表されます。「精度(Precision)」とは検索結果全体に対して、要求している検索結果がどれくらいあるかを割合で表したもので、高いほど検索結果として優秀になります。100件の検索結果の内、90件が検索したい内容に合致している場合は90/100→0.9といった具合です。一方、「再現率(Recall)」とは文書全体に含まれている検索したい内容の内、検索結果としてヒットした文書の割合を表します。先ほどの例でいくと、文書全体では検索したい内容は95件だったとすると90/95→0.94といった具合です。精度と再現率にはトレードオフの関係があり、精度を上げると再現率が下がり、再現率を上げると精度が下がります。通常はこの2つの指標が両方高くなるように検索エンジンの調整を行っていく、という訳ですね。

サーチコンポーネント(Component)

前述した検索結果を調整するためにサーチコンポーネントと呼ばれる様々な機能があります。

  • Facet Component
    • 検索結果を絞り込んでいくことで精度を100%に近づける機能
  • Highlight Component
    • 強調表示をするための機能
  • QueryElevationComponent
    • リスティング広告のようなイメージで、事前に登録しておいた結果を検索のスコアとは別に検索結果に含める機能
  • Clustering Component
    • Culster Labelを検索結果に貼っておき、ラベル指定をすることで絞り込みを行う。Carrot2というフレームワークをベースにしているそうです。
  • More Like This Component
    • 検索ワードに関連する「おすすめ」を表示する機能
  • Terms Component/SpellCheck Component
    • サジェストとスペルチェックに使用する機能。4.xからはSuggesterという機能が追加されており、文書入力中(未確定状態)でもサジェストを表示できるようになっています。

その他

Ngram Tokenizer、Synonym Filter、パーソナライズ検索などについての説明がありましたが、勉強不足でわからなかった部分が多いので、本を読んで理解したいと思います。
また、ロンウィットさんではSolrのトレーニングやMahoutを使った機械学習のトレーニングなどを開催しているそうで、Solrのトレーニングは受けてみたいと思いました。まずは入門から。。

自動補完(Autocomplete)ともしかして?(Did You Mean?)

デモ:https://github.com/mosuka/solr-suggester-demo-ui

関口さんがサーチコンポーネントの中で紹介されていた「Terms Component/SpellCheck Component/Suggester」を使ったデモを行ってくださいました。山手線の駅名をインデックスしておき、「し」と入力したら「品川」「新宿」「新橋」などが表示される感じですね。使えそうでした。日本語はIMEで入力途中の文字列(未確定の文字列)に対してサジェストをするのが難しかったようなのですが、Suggesterの機能を使えばそれができるよ、というお話でした。

Lucene Revolution 2013 Dublin振り返り

スライド:公開されたら更新します

毎年開催されているLucene/Solrのカンファレンスの紹介でした。昨年11月にアイルランドのダブリンで開催された様子を写真とスライドでご紹介いただきました。

イベントの詳細はこちら:
http://www.lucenerevolution.org/2013/Lucene-Solr-Revolution-2013-Dublin-Presentations
http://dublin.lucenerevolution.org/LSRDUB/#!/sessions/39864/

2010年から1年に1度開催されているようです。海外のカンファレンスも行ってみたいですね〜。まずはその準備として今年は英語を勉強します!目標はTOEICスコア700。頑張らねば。

総括

新版のイベントということで、著者の方が色々な切り口でSolrについてお話されていて面白かったです。技術ゴリゴリじゃなくても、楽しめるもんですね。会社ではまだそこまでSolrを使い込んでいないので、サジェストやパーソナライズ検索などは実務に組み込んでいけそうだと感じました。社内に遊んで捨てられるSolrサーバがあれば、色々試せそうなので検討してみたいと思います。
企画いただいた大谷さん(@johtani)はじめ、Voyage Groupさん、スピーカーの皆さん、楽しいイベントをありがとうございました。また、ぜひ参加させていただきたいと思います。