Solr

solr memo

More than 3 years have passed since last update.


基本


  1. Powered by java.

  2. ブラウザから叩ける

  3. 日付はISO 8601フォマット(2012-11-01T10:00:50Z)



パラメータ

パラメータ    
詳細

基本

q
検索クエリ(必須)

fq
サブ検索クエリ(qより高速

start
開始位置

rows
取得数

fl
取得するフィールド

wt
レスポンスの出力形式1 (xml json phps ruby phthon *) default xml

sort
ソート順(asc, desc)

indent
indent default off

version
バージョン default 2.2

defType
詳細に文書のマッチやスコアリングをコントロール(dismax OR edismax)

関連リソース

mlt
関連リソースを取得するか

mlt.count
取得する関連リソースの数

mlt.fl
ここで指定したフィールド情報をもとに関連リソースを作成

ファセット

facet
ファセット情報を取得するか

facet.field
ファセット情報を作成するフィールド

facet.limit
ファセット情報の最大取得数

facet.mincount
ファセット情報のカウント数の最小値

facet.date
ファセット情報を作成するフィールド(日付型)

facet.date.start
開始日

facet.date.end
終了日

facet.date.gap
日付間隔

*1. 各言語ごとのサンプルコードが置いてある


 http://wiki.apache.org/solr/QueryResponseWriter


こんな感じでデータが取れる


http://solr:8080/solr/Project/mlt/select/?q=id:1&version=2.1&start=0&rows=10&indent=on&mlt=true&mlt.fl=title&mlt.count=10&mlt.mindf=1&mlt.mintf=1




検索オプション

パラメータ 
詳細

*
複数文字のワイルドカード

?
一文字のワイルドカード

~
あいまい検索.「roam~」:foamやroams等がマッチ(Levenshtein DistanceやEdit Distanceといったアルゴリズムを使っている)

*:*
全てにマッチ


SQLと同じ


+,-で必ずそのワードを含む・含まないデータを取得できる


q=field:+Hoge



SQLをSolrで書くと・・

SQL    
Solr

field = "hoge"
fq=field:hoge

field LIKE "hoge%"
fq=field:hoge*

field NOT LIKE "hoge%"
fq=field:-hoge*

field IS NOT NULL
fq=field:[* TO *]

field IS NULL
fq=-field:[* TO *]

field > 2012 AND field < 2013
fq=field:[2012 TO *]&fq=field[* TO 2013]

field BETWEEN 2012 AND 2013
fq=field:[2012 TO 2013]

ORDER BY field ASC
sort=field asc


SolrClient(PHP用のライブラリ)


あまり情報が落ちていないので普通にAPIをHTTP_Request2あたりで叩いたほうがいいかもしれない


// 接続情報

$solr = new SolrClient([
'port' => 8080,
'timeout' => 360,
'hostname' => 'solr.example.com'
'path' => '/solr']);
// クエリパラメータのセット
$query = new SolrQuery();
// 検索条件
$query->setQuery("title:hoge");
// 取得するフィールド
$query->addField('id, title, created_at');

$solrResponce = $solr->query($query);
// レスポンスのBODYが配列で入っている
$responce = $solrResponce->getResponce();

// debugしたいときはgetDebugが便利
// SolrClient::getDebug();


削除

# code指定

curl http://solr:8080/solr/update -H "Content-Type: text/xml" --data-binary '<delete><query>code:hoge123</query></delete>'
# 全件
curl http://solr:8080/solr/update -H "Content-Type: text/xml" --data-binary '<delete><query>*:*</query></delete>'
# commit
curl http://solr:8080/solr/update?commit=true


全データ削除

# solr を止めてから INDEX を削除

# solr を起動
/etc/init.d/solr stop
rm -rf /path/solr/data/index
/etc/init.d/solr start


ロックされていて削除ができない場合

#Lock obtain timed out: SimpleFSLock@solr/data/index/write.lock

org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: SimpleFSLock@solr/ data/index/write.lock

rm -rf /path/solr/data/index/write.lock


optimize

定期的にoptimizeしないとindexが肥大化する

curl 'http://solr:8080/solr/update?optimize=true'


エラー


PHP Warning: SolrClient::addDocuments


Lock obtain timed out error

原因不明だけど書き込みロックがかかってしまっているのでdata/write.lockを削除する

PHPのSolrClient使っているとPHP Warning: SolrClient::addDocuments line ** しかでないので困る
SolrClient::getDebug();するとわかるけど


形態素解析用ライブラリ


lucene-gosen


  • 辞書が2つある(IPAdic, NAIST-Jdic)

  • NAIST-JdicがIPAdicの後発なので出来ればそちらを使う

  • Solrのバージョンにあったjar をいれたほうがいいかも


参照