GemのrdocをHyperEstraierのノードに登録する

RubyからHEを使うには、P2PノードのAPIを使うようだ。
しかし、rdocをHyperEstraierで検索できるようにする - jitteの日記の手順で登録したページをノード側から参照する方法がよくわからなかった。
APIで新規登録すればいいんだろうけど・・・。


試行錯誤の結果、ノードをcasketに作るとcasket/_node/node_nameのようにサブディレクトリに配置されるので、
estcmd gatherでこのサブディレクトリを直接指定すればOKだった。

estcmd -apn -il ja -sd casket/_node/rdoc /Library/WebServer/Documents/rdoc/

こんな感じ。手順を最初からたどると以下のようになる。

P2Pノードの初期化、起動

cd /Library/WebServer/CGI-Executables
rm -rf casket
estmsater init casket
estmaster start casket

P2Pノードの設定

ブラウザから http://localhost:1978/ を開き、rdocノードを作成する。

rdocの登録

P2Pサーバが起動したままだと登録コマンドがタイムアウトしてしまうので、停止しておく。
MacPortsで入れた場合はestmaster startで起動するとフォアグラウンドのままなので、Ctrl+Cで止めるとよい。
*1

登録処理自体は、以下のようなコマンドで行う。

estcmd -apn -il ja -sd casket/_node/rdoc /Library/WebServer/Documents/rdoc/

インクリメンタル検索に使えるように、オプションに-apnをつけている。こうすると英文でも単語区切りではなく文字区切りで検索できるようになる。

登録結果をcgiから確認

スクリプトは前回書いたとおり設置しておく。estseek.conf は以下のようにする。

index casket/_node/rdoc
...
replace: ^file:///Library/Ruby/Gems/1.8/doc/{{!}}http://localhost/rdoc/

http://localhost/cgi-bin/estseek.cgi で検索できるようになっているはず。P2Pサーバが起動しているとやはりタイムアウトしてしまうので、止めておく。

ちなみに、HEのドキュメントにはインクリメンタル検索する方法が書かれているが、その通りにやるとうまくいかなかった。*.htmlをcgi-binの下に置くのがまずいらしく、ドキュメントルートに移してポスト先をcgi-bin/estseek.cgiに変えれば動いた。

登録結果をAPIから確認

MacPortsRubyのライブラリをインストールしてくれないので、手動でインストールしておく。今度は当然、P2Pサーバを起動しておく。

require 'estraierpure'
include EstraierPure

node = Node.new
node.set_url("http://localhost:1978/node/rdoc")

cond = Condition.new
cond.set_phrase("rollback")

nres = node.search(cond, 0);

rdoc = nres.get_doc(0)

rdoc.attr_names.each do |x|
  puts "#{x}\t#{rdoc.attr(x)}"
end

*1:デーモンになっている場合はestmaster stop casketとすると良いと思うが未確認