このエントリーをはてなブックマークに追加

Dipus - (主にSphinx向け) 全文検索サーバー

Sphinxの検索はデフォルトだとJavaScriptベースであまりいけてないので、dipusっていうのを作ってみました。これは、WhooshというPure pythonの全文検索エンジンを使った全文検索サーバーです。

dipusは、sphinxとの連携に重点をおいて開発しており、sphinxのbuilderが付属しています。そのため、文書の登録はsphinx-buildを実行するだけで完了します。

ちょっとした手間でsphinxの検索をいけてるものにします。というか、まだ開発途中なのでしたいです、ですが。

なお、dipusは会社など非公開の場所で動かされることを想定しており、大量のアクセスがあったりとかDoSがきたらとかはあんまり想定してません。公開の場所に置かれているドキュメントはgoogleなどを使うほうがいいと思います。

デモ

とりあえず sphinx-jpのページをコピーしたものを用意しました。sphinxjpのテーマは検索結果のハイライトがうまく動かなかったので、デフォルトのテーマにしています。

http://tdoc.info/tmp/dipus/

ただ、dipusサーバーは単にコマンドラインで動かしているだけですし、実はさくらのレン鯖(VPSじゃなくて!)で動かしてるので、しょっちゅう殺されます。動かなくても怒らないでね!

導入方法

まずはいつもどおりpipで。whooshやbottle、simplejsonなどもインストールされます。

% pip install dipus

使用方法

(2012-08-23 更新。ものぐさな人のためにデフォルト設定を強化)

  1. dipusサーバー用設定ファイルを書きます

    jsonで、indexrootへのパスを書きます。このパスの下にインデックスファイル出来ます。

    { "indexroot": "/path/to/index" }
    

    デフォルトで、 0.0.0.0:9876 で立ち上がります。

  2. dipusサーバーを立ち上げます

    % python -m dipus.websetup -c conf.json
    

これでサーバー側の準備は終わりです。

  1. sphinxドキュメントのconf.pyに以下の設定を加えます
extensions = ['dipus.dipusbuilder']

デフォルトではdipusサーバーをlocalhost:9876とみなします。また、ドキュメントの識別子としてconf.py中のprojectが使われます。

自分で設定したい場合は以下のように書いてください。

# dipus_host_url = "http://192.168.1.20:9876"   # dipusサーバー設定と合わせて下さい
# dipus_index = "test_rst"  # このドキュメントの識別子となります
  1. 設定ファイルを書き出すために、まず一回buildします。
% sphinx-build -b dipus source build

buildにより、dipusサーバーにドキュメントがどんどん送られます。注意してほしいのは、build自体はすぐに終わりますが、サーバー側でのindex作成には時間がかかりますので、すぐには検索しないでください。sphinxjpの場合、15分ほどかかりました。

  1. _templates/search_dipus.htmlをコピー

    先ほどの builder実行で _static/search_dipus.jsと_templates/search_dipus.html が出来てます。

    このうち_templatesの方をsearch.htmlにコピーします。これは_template/search.html が定義されてる場合の回避措置です。すでにsearch.htmlを定義していたら、jsの呼び出し部分だけを変えればいいです。

    このあたりうまいやりかたがあるといいんだけど…

    % cp _templates/search_dipus.html _templates/search.html
    
  2. Makefileを書き換えます

Makefileのhtml部分に一行書き足します

html:
   $(SPHINXBUILD) -b dipus $(ALLSPHINXOPTS) $(BUILDDIR)/html
   $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
  1. make htmlします

    あとは普通にmake htmlをすれば、都度ドキュメントが登録されます。一度登録されているものは「更新」となりますので重複にはなりません。

    (あ、むしろ消す方法が今のところないな…)

API

dipusはsphinxとの連携を主眼に置いて開発しましたが、APIはJSONのPOSTとGETで、中身はJSONですので他の用途にも使えます。

具体的にはこんな感じ

登録

curl -XPOST 'http://localhost:9200/spam/' -d '{
   "_index" : "spam",
   "title": "Here comes new document!"
   "path" : "dir/test1",
   "message" : "Some thing new document"
}'

検索

curl -XGET 'http://localhost:9200/spam/_search?q=Here'
  or
curl -XGET 'http://localhost:9200/spam/_search?q=Here?callback=jsonp10293'
{
    "hits":{
        "total" : 1,
        "hits" : [
            {
                "_index" : "spam",
                "_id" : "1",
                "_source" : {
                    "postDate" : "2012-08-25T14:12:12",
                    "title": "Here comes new document!",
                    "path": "dir/test1",
                    "message" : "Some thing new document"
                }
            }
        ]
    }
}

まだ開発途中なのでAPIは変わると思いますが、手軽に全文検索を使いたい、という用途にはいいかもしれません。

これから

とりあえず動いたレベルでまだまだまだ、いっぱい足りてません。ちょぼちょぼと開発していこうかと思います。次は複数のドキュメントを横断検索したりとかしたいですね。