DjangoでMySQLなサイトでのSolr環境構築メモ

Solrとは

なんかすごいOSSの検索エンジンであるLuceneを元にしたREST風になんか楽ができる検索サーバー。サーバーはJavaでできているが、クライアントはいろいろなスクリプトで取り出せるらしい

構築環境

Ubuntu 11.10
MySQL

インストール

とりあえずhomeにwgetしただけ。好きなところから落としましょう
http://www.apache.org/dyn/closer.cgi/lucene/solr/

wget http://ftp.jaist.ac.jp/pub/apache//lucene/solr/3.5.0/apache-solr-3.5.0.tgz
tar xzvf apache-solr-3.5.0.tgz

インストールはこれだけでできる。ここではapache-solr-3.5.0を解凍したディレクトリを$SOLRとする。
実行にはJDKが必要らしいのでこれもいれる。

sudo apt-get install openjdk-6-jdk

起動する場合以下

cd $SOLR/example/
java -jar start.jar

起動したサーバーをウェブで確認する

http://localhost:8983/solr/admin/

参考::検索エンジンの常識をApache Solrで身につける (1/4) - @IT

追記

aptだとパッケージがあったよ……

sudo apt-get install solr-common
sudo apt-get insatll solr-jetty
sudo apt-get install solr-tomcat

どれをつかえばいいかはわからない

日本語検索のためにLucene-gosenの導入

デフォルトだと日本語検索に難があるので形態素解析のために辞書なりなんかすごいやつをいれる
http://code.google.com/p/lucene-gosen/downloads/list

wget http://lucene-gosen.googlecode.com/files/lucene-gosen-1.2.1-ipadic.jar

このままだとpathが通らないので $SOLR/exsample/solr/lib/ にlucene_gosenを入れる。
初期状態だと存在しないから作ること!(ここではまった)

cd $SOLR/example/solr
mkdir lib
cp lucene-gosen-1.2.1-ipadic.jar $SOLR/example/solr/lib/

で、$SOLR/example/solr/conf/schema.xml に以下を追記

    
      
        
      
    

これで導入はできたので試しに形態素解析してみることができる。adminからanalysisってやつをクリック
http://localhost:8983/solr/admin/analysis.jsp

Field type : text_ja
Field value : いままではてブを完全に作業用ツールにしていたのは、なんていうかはてブがどうしても評価システムになってしまう、自分の行為がサイトへの影響を少なからず与えてしまうのがなんかいやだったというのがある。純粋にただ取り上げてフローしてしまいたいからこうしてはてブをつかわなかった。
verbose output にチェックを入れる

参考::Apache Solr 3.3.0 で日本語検索できるようになるまでにしたこと - 働かないプログラマのメモ帳
参考::Debian に Tomcat 7 + Apache Solr 3.5.0 + 日本語検索対応環境を構築(lucene-gosen使用) - Symfoware

MySQLのデータをSolrにインデックスする

Webアプリなのでダミーデータはすでにはいっているものとする。

JDBCドライバのインストール

SolrサーバーとMySQLをつなぐためにJDBCドライバなるものが必要なのだそうだ

sudo apt-get install libmysql-java

で、これをpathを通してあげないといけないのだが、よくわからないので無理やりコピーした

cp /usr/share/java/mysql-connector-java-5.1.10 $SOLR/dist/

で、$SOLR/example/solr/conf/solrconf.xml に以下を追加

 

参考::java - Solr can't find JDBC driver - Stack Overflow
参考::【Ubuntu】JDBCドライバをインストールする - Stay hungry. Stay foolish.

DataImportHandlerの追加

$SOLR/example/solr/conf/solrconfig.xml に追記


 
  data-config.xml
 

同じ階層に data-config.xmlを生成する

touch data-config.xml
schema.xmlの修正

オリジナルをバックアップしてからいじろう

cp schema.xml schema.xml.orig

今回Djangoを使っているのだがMySQLはこんな感じ

mysql> desc Url;
                                                                                                                                • +
Field Type Null Key Default Extra
                                                                                                                                • +
id int(11) NO PRI NULL auto_increment
url varchar(2048) NO NULL
title varchar(2048) NO NULL
user varchar(255) NO NULL
count int(11) NO NULL
ctime datetime NO NULL
                                                                                                                                • +
6 rows in set (0.00 sec)

schema.xmlの編集は本当に意味がわからないのでてきとうにやった。これから修正するかも。

    
    
    
    
    
    

あと一応ここも修正した

 id
 title
 

あとtext が残っているとまたなんかエラーがでるので CopyField周りも消した

data-config.xmlを編集


    
        
            
            
            
            
            
            
        
    

サンプルのDBはhsqldbとかいうやつだったのでwhereの部分を current_timestamp に変更した。
adminのページから正常にアクセスできることを確認しよう。
またコマンドラインから全部入れ替えるときDIHを使う場合は以下

curl http://localhost:8983/solr/dataimport -d command=full-import -d clean -d qt=/dataimport

差分だったらこれでいいかも

curl http://localhost:8983/solr/dataimport -d command=delta-import -d qt=/dataimport

http://localhost:8983/solr/admin/dataimport.jsp?handler=/dataimport
参考::MySQL のデータを Solr にぶちこむ: おちエンのブログ
参考::SolrのDataImportHandlerを使用して、DB2のデータを取り込む - Symfoware

検索結果を抽出する

solrpyのインストール

Pythonの環境設定は Pythonの環境構築メモ - AtAsAtAmAtArA にて。virtualenv環境で

pip install solrpy
つかう

ドキュメントのまんま

import solr

# create a connection to a solr server
s = solr.SolrConnection('http://example.org:8083/solr')

# do a search
response = s.query('title:lucene')
for hit in response.results:
    print hit['title']

参考::solrpy - Python Solr Module - Google Project Hosting

Djangoでつかう

あとはこれをどーにかDjangoに展開するviews.pyに

def search(request):
    s = solr.SolrConnection("http://localhost:8983/solr")
    res = s.query(u"title:Google")
    return direct_to_template(request,"search.html", {"res":res})

こんな感じでいれてやる。テンプレートには

{res.numFound}}件みつかりました
 {% for obj in res %}
  <li>{{ obj.title }}</li>
  <li>{{ obj.url|urlize }}</li>
  <li> <a href="{{ DOMAIN }}/user/{{ obj.user }}">{{ obj.user }}</a>が読んだかも</li>
  <li> <a href="{{ DOMAIN }}/feed/{{ obj.pk }}">{{ obj.ctime }}</a></li>
  <hr />
{% endfor %}

こんな感じでresで渡したものをforで取り出してそれぞれプロパティを列挙してやればいい。
solrpyのresをdir(res)してやるといろいろとプロパティがあるのでそれらをさがしていろいろみるといいと思う。numFoundとかドキュメントないから自力で見つけたし。

簡易的だけど

いちおうできたよ!わーい

書籍

Webだと断片的なのでいちおう書籍もかった。

Apache Solr入門 ―オープンソース全文検索エンジン

Apache Solr入門 ―オープンソース全文検索エンジン