Solrと全文検索

RDBは検索に向かない

前方一致でしかインデックスが使用できない
DBMSはフルテキストインデックスを作成できるプラグインを追加
Oracle Text
SQL Server フルテキストインデックス
MySQL フルテキストインデックス
DBメーカー意外の全文検索エンジン
eAccela Bizesearchなども出てきたが商用で、ライセンスが高かった

Lucene

Lucene -> jarでの配布だけだった
Solrの登場 -> HTTPのインターフェースを提供

Solr

1.比較的低いハードルでも動作する
2.HTTPでの要求と応募
3.レプリケーション機能
4.分散検索機能
5.DIHでRDBからデータインポート
6.ファセット検索 ※動的なタグ付け
7.トークン方式の選択 (n-gram,形態素解析)
8.フィルタ機能(シノニム)

Solrの構成

1.Solrに対してHTTPリクエストで検索、HTTPレスポンスで結果を出力
2.インデックス登録 post,jarでHTTPリクエストから定期的に登録
3.DIHを使いDBから定期的に登録

データの登録

java -jar post.jar data.xml

設定ファイルの編集

重要なのは3つ

1.$SOLRHOME/solr.xml
マルチコア設定を行う
2.$SOLRHOME//conf/solrconfig.xml
各種リクエストハンドラの設定
3.$SOLRHOME//conf/schema.xml
このCoreのスキーマ設定(テーブル定義のようなもの)を定義するファイル

スキーマの設定

スキーマはコア1つに対して1つだけ決定出来る
1.データ型の定義

2.データの定義

トークナイザー

文章をどのように切り分けてインデックス/検索するかを決定するもの
1.N-gram
1.固有名詞に強い
2.辞書のメンテナンス不要
3.ノイズが入りやすい
N=1 は uni-gram N=2 bi-gram N=3 tri-gram
2.形態素解析
1.自然言語に強い
2.固有名詞に弱い

トークナイザー
WhitepsaceTokenizerFactory

トークンフィルタ

トークナイザーで抽出されたトークンにフィルタをけkてインッデックス/検索をする
1.N-gramフィルタ
2.シノニムフィルタ

Charフィルタ

トークン化前にかけられるフィルタ
HTMLなどを取り除く

N-gramフィルタ

NgramTokenizerのバグに有効

Synonymフィルタ

トークン化されたものを指定したものに変換してしまうフィルタ

Solrの動作確認

cd \solr\example
java -jar ./start.jar

DIH

DataImportHandler
JDBC経由でインデックスを登録する
①テーブル作成
②DIH用のコンフィグを作成 data-config.xml
/var/lib/tomcat6/solr/conf
vim data-config.xml
③DIH実行
※フルインポート
http://ip:8080/solr/dataimport?command=full-import

インデックス作成時の負荷軽減

インデックス作成をMasterに行わせて
参照はSlaveにまかせる
solrはレプリケーション機能を持っている

分散検索

shards=localhost:8983/solr,localhost;7574/solr
(,で区切るだけ)