Apache Solrをインストールしてみる

Apache Solrを入れてみます。

ちょっと前までは、Apache Solrで日本語を扱う時は

SenとかGosenとかの日本語形態素解析ライブラリを一緒に入れる必要がありました。

Apache Solr 3.6からは、Kuromojiという日本語形態素解析ライブラリがApache Solrに同梱されるようになりました。

これにより、日本語を扱う時、Apache Solrだけをインストールすれば良くなりました。

ということで、Apache Solrのインストールをしてみます。

まず、Apache Solrのサイトから3.6をダウンロードします。

ダウンロードした物を適当に展開します。
[shell]tar xvfz apache-solr-3.6.0-src.tgz[/shell]
続いて、schema.xmlを編集します。

今回はtext_jaいうフィールドを日本語解析にかけようと思うので
[xml]<fieldType name="text_ja" positionIncrementGap="100" autoGeneratePhraseQueries="false">
</fieldType>[/xml]
というfieldTypeタグを使います。

※Apache Solrのexampleに入っているschema.xmlでは、すでにtext_jaのフィールドタイプが宣言されています。

この中にを追加し、さらにその中に以下を定義します。
[xml]<tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>[/xml]
これだけで、基本中の基本は完成しました。

続いて、フィルタですが
[xml]<filter class="solr.JapaneseBaseFormFilterFactory"/>[/xml]
を追加。

これは、動詞などを基本形でインデックスに登録する事を指定します。

たとえば、「入れられる」は
JapaneseTokenizerFactoryで
=>入れ/られる
と変換されます。
これに対して、JapaneseBaseFormFilterFactoryでは
=>入れる/られる

という変換をしてくれます。
[xml]<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_ja.txt" enablePositionIncrements="true"/>[/xml]
は、「の・を・が」などの語句をフィルタリングします。
[xml]<filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="stoptags_ja.txt" enablePositionIncrements="true" />[/xml]
は、品詞などをフィルタリングします。
[xml]<filter class="solr.LowerCaseFilterFactory"/>[/xml]
ローマ字を小文字にします。
[xml]<filter class="solr.CJKWidthFilterFactory"/>[/xml]
全角のローマ字を半角、半角カナを全角にします。
[xml]<filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>[/xml]
片仮名の表記揺れを補正します。

コンピューター => コンピュータ
のような感じ。

これらのフィルタを全部入れたfieldTypeは以下のようになります。
[xml]<fieldType name="text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
<analyzer>
<tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>
<filter class="solr.JapaneseBaseFormFilterFactory"/>
<filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="stoptags_ja.txt" enablePositionIncrements="true" />
<filter class="solr.CJKWidthFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_ja.txt" enablePositionIncrements="true"/>
<filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>[/xml]
となります。

早速、試してみます。

cd solr
java -jar start.jar

で起動します。

続いて、管理画面を表示

http://localhost:8983/solr/admin

analysisというリンクをクリック

Field Analysis

の中のFieldをtypeに設定して、テキストエリアにtext_jaを入力

Field value (Index)に適当な文章を入れてみます。

Index Analyzerという所に、解析結果が表示されるはずです。

先ほど設定したフィルタを順に適用していった結果が表示されています。

crontabのマクロ

今まで0 0 1 1 *とか必死に書いていたのですが、マクロがあるようです。

Entry Description Equivalent To
@yearly (or @annually) Run once a year 0 0 1 1 *
@monthly Run once a month 0 0 1 * *
@weekly Run once a week 0 0 * * 0
@daily (or @midnight) Run once a day 0 0 * * *
@hourly Run once an hour 0 * * * *
@reboot Run at startup

[Ruby on Rails 3]SolrをRuby on Rails 3から使う

Ruby on RailsからSolrを使うには、このプラグインを使うと良さそうだ

sunspot_rails

ホームページは

https://github.com/outoftime/sunspot

sunspotプロジェクトの一部になっています。

インストールは

Ruby on Rails 3の場合

gemfileに

を追加

あとは

を実行

Ruby on Rails 2の場合は

#config/environment.rb

を追加

#config/development.rb
#config/test.rb

を追加

を実行

config/sunspot.ymlを作成

[Scala]Play framework 2.0 のwithSessionを使うと今まで入れてたセッションが消える

APIDOCとか、Documentをみたら、分かる事ではあるが、はまりやすいので書いておく

とした場合に

action1を叩いてからaction2を叩くと
セッションの情報がtest2 -> value2だけになる。

test1とtest2のセッションを保持したいなら

とする

たぶん

[Scala]Play framework で使用するJVMのヒープサイズを環境変数で指定する

Scalaの開発をVMで行っているわけでありますが

素のPlay frameworkだと、色々やってるうちにメモリを浪費してしまうようです。

メモリリークでは無いけど、必要なメモリをどんどん確保してしまうみたい。

なので、ヒープの上限という意味で割り当てを指定してみます。

毎回Play起動時に指定するのは面倒なので、環境変数で。

#~/.bashrc を開いて、一番下あたりに

と書き込んでターミナルを再起動します。

以上です。

playを起動すると

Picked up _JAVA_OPTIONS: -Xms256M -Xmx256M
という行がコンソールに出てきたと思います。

[Scala]Play framework2.0.1でMySQLに繋いだ時に、コネクションがタイムアウトする

MySQLに接続するように設定したPlay frameworkのアプリケーションで

というようなエラーが出る事がある。

これは、MySQLのコネクションがタイムアウトで切断された時に、接続が無いよ!というエラーメッセージです。

MySQLでは、タイムアウトの時間を長くする、というような対処方法がありますがタイムアウトを無効にするという設定がありません。

なので、アプリケーションで接続をキープする設定をしてみます。

#play.api.db.DBApi.scala
のソースを読んでみますと、

データソースに対して「setConnectionTestStatement」を実行しています。

この「setConnectionTestStatement」接続をテストするために使用するコマンドを指定するのですが

Play frameworkで新規プロジェクトで作った場合にはapplication.confには設定項目がありません。

なので、以下のように指定します。

これはMySQLで一番負荷が小さくて発行できるコマンドとしてselect 1;を使っています。

これで、決まった時間で定期的に「select 1;」をMySQLに発行してくれるようになります。