Yii Framework(yii-solrエクステンション)でSolrにインデクシング

昨日はYii FrameworkからMongoDBに接続してみましたが、
今日はYii FrameworkからSolrに繋いでみます。
#なんとなく感覚的にはRDBMSとMongoDBとSolrが使えれば、それっぽいサービス作れるのかな、と。
 
YiiのページでSolrのExtensionを探してみると、以下2つがヒットします。
– solr(http://www.yiiframework.com/extension/solr)
– yii-solr(http://www.yiiframework.com/extension/yii-solr)
yii-solrの方が新しいしFollowerも多いので、今回はyii-solrを試してみます。
 
■ Solrのインストール
サンプルを動かすだけならSolrのページ(http://lucene.apache.org/solr/)から
アーカイブをダウンロードしてきて、解凍してサンプルに移動して
↓のようにjava -jar start.jarするだけです。非常に簡単。

C:>cd C:apache-solr-3.6.0example
C:apache-solr-3.6.0example>java -jar start.jar
2012-06-13 10:50:25.199:INFO::Logging to STDERR via org.mortbay.log.StdErrLog
2012-06-13 10:50:25.327:INFO::jetty-6.1-SNAPSHOT
6 13, 2012 10:50:26 午前 org.apache.solr.core.SolrResourceLoader locateSolrHome

 
 
■ yii-solrのインストール
yii-solrのGithubページ(https://github.com/phpnode/YiiSolr)のReadmeに
やり方が記載されています。
昨日もそうでしたが、peclが動いてくれないので、、
http://downloads.php.net/pierre/ から php_solr-5.3 っていうリンクの
アーカイブ落としてきて解凍してxampp/php/extに配置します。
 
続いて、プロジェクトのルートディレクトリ直下にpackagesというディレクトリを作成して、
main.phpでaliasしなさいと。

"aliases" => array(
		"packages" => dirname(__DIR__)."/packages/",
),

packages/solrにファイルを展開しろとのことなのでそうします。
とりあえずインストールは完了した予感です。
 
 
■ YiiからSolrに接続(1)
ReadmeはTDDな感じで記載されていて、testディレクトリから↓叩け、と。
「先生、テストディレクトリがありません!」って感じなんですがww

phpunit --verbose ../packages/solr/tests

ってかPHPUnitするのにPHPのエクステンションが必要って話なので↓

C:YYYxamppphp>pear install phpunit/PHPUnit-beta
WARNING: channel “pear.phpunit.de” has updated its protocols, use “channel-update pear.phpunit.de” to update
Did not download optional dependencies: phpunit/PHP_Invoker, use –alldeps to download automatically
phpunit/PHPUnit requires PEAR Installer (version >= 1.9.4), installed version is 1.7.2
phpunit/PHPUnit can optionally use package “phpunit/PHP_Invoker” (version >= 1.1.0)
~略~
Starting to download YAML-1.0.6.tgz (10,010 bytes)
…..done: 10,010 bytes
install ok: channel://pear.symfony-project.com/YAML-1.0.6

 
 
■ YiiでPHPUnitしてみる
YiiのTestingの2. Test Environment Setupを読むと、
yiicでプロジェクト作ると、Test用のディレクトリが出来るはずだって書いてある…。
↓やってみるとソレっぽいのが出来たっぽいです。

C:YYYeclipse-phpworkspaceYYY>C:YYYxamppphpphp.exe C:YYYeclipse-phpworkspaceYYYyii-1.1.10.r3566frameworkyi
ic.php webapp testdrive
Create a Web application under 'C:YYYeclipse-phpworkspaceYYYtestdrive'? [yes|no] yes
      mkdir C:/YYY/eclipse-php/workspace/YYY/testdrive
      mkdir C:/YYY/eclipse-php/workspace/YYY/testdrive/assets
      mkdir C:/YYY/eclipse-php/workspace/YYY/testdrive/css
~略~
      mkdir C:/YYY/eclipse-php/workspace/YYY/testdrive/themes/classic/views/layouts
      mkdir C:/YYY/eclipse-php/workspace/YYY/testdrive/themes/classic/views/site
      mkdir C:/YYY/eclipse-php/workspace/YYY/testdrive/themes/classic/views/system

Your application has been created successfully under C:YYYeclipse-phpworkspaceYYYtestdrive.

画面からアクセスしてみると↓

↓エクスプローラーから見た感じテストディレクトリもOKそう

 
が、テストしてみると↓Selenium RC serverが、、、って悲しい事になってますw

C:YYYeclipse-phpworkspaceYYYtestdriveprotectedtests>C:YYYxamppphpphpunit.bat functional/SiteTest.php
PHPUnit 3.5.14 by Sebastian Bergmann.

EEEEEE

Time: 13 seconds, Memory: 5.25Mb

There were 6 errors:

1) SiteTest::testIndex
PHPUnit_Framework_Exception: Could not connect to the Selenium RC server.

 
 
■ YiiSolrでPHPUnit
んま、とりあえず先進むべって事で、上記で作ったpackagesディレクトリを
testdriveの方に持ってくることにしました。main.phpも書き換えておきます。
 
ってことで、YiiSolrでPHPUnitを試みます。
↓ことごとくNo such file or directoryで落ちてる…orz

C:YYYeclipse-phpworkspaceYYYtestdriveprotectedtests>C:YYYxamppphpphpunit.bat --verbose ../packages/solr/test

PHPUnit 3.5.14 by Sebastian Bergmann.

.EEEEEEEE...EEEEEEEEEEEEEE

Time: 0 seconds, Memory: 8.25Mb

There were 22 errors:

1) ASolrConnectionTest::testIndexAndDelete
include(SolrInputDocument.php): failed to open stream: No such file or directory

C:YYYeclipse-phpworkspaceYYYyii-1.1.10.r3566frameworkYiiBase.php:418
C:YYYeclipse-phpworkspaceYYYyii-1.1.10.r3566frameworkYiiBase.php:418
C:YYYeclipse-phpworkspaceYYYtestdriveprotectedpackagessolrtestsASolrConnectionTest.php:32

2) ASolrConnectionTest::testFacetedSearch
include(SolrInputDocument.php): failed to open stream: No such file or directory

そういえばphp.iniにextension=php_solr.dll入れるの忘れてた。。
って事で、追記してもっかい走らせたら、今度はCurlがないとか…↓

 
php_curl.dllもダウンロードしてきてphp.iniに追記してもっかい。
↓久しぶりに気持ちイイ感じ。

C:YYYeclipse-phpworkspaceYYYtestdriveprotectedtests>C:YYYxamppphpphpunit.bat --verbose ../packages/solr/tests

PHPUnit 3.5.14 by Sebastian Bergmann.

..........................

Time: 8 seconds, Memory: 14.50Mb

OK (26 tests, 3119 assertions)

 
 
■ YiiからSolrに接続(2)
main.phpのcomponentsの所にに↓の定義を追加します。

	"solr" => array(
			"class" => "packages.solr.ASolrConnection",
			"clientOptions" => array(
					"hostname" => "localhost",
					"port" => 8983,
			),
	),

#最初、うっかり一番下に追記したら”CWebApplication.solr” is not defined.
#って言われて焦りました。記述するのはcomponentsの中です。
 
んま、そんなこんなで、SiteControllerのactionIndexに↓のコードを突っ込んで、

$doc = new ASolrDocument;
$doc->id = 123456789;
$doc->name = "hoge document";
$doc->save(); // adds the document to solr
$doc->getSolrConnection()->commit();

 
でもって画面から叩いたら、そんなクラスねぇみたいな事いわれて。
何かと思ったら、main.phpでpackagesを宣言するところが、
Solr関連のimportするとこより前にないとダメじゃんっていう。
↓こんな感じで。

'aliases' => array(
		'packages' => dirname(__DIR__).'/packages/',
),

// autoloading model and component classes
'import'=>array(
	'application.models.*',
	'application.components.*',
	'packages.solr.*',
),

 
最終的に画面から叩いた後にSolrの管理画面みると、、、
↓無事入っておりましたとさ。

 
めでたしめでたし。
#ってか、そもそものYiiのお勉強をもうちょいしないとなw
 
 

Apache Solr入門 ―オープンソース全文検索エンジン
関口 宏司 三部 靖夫 武田 光平 中野 猛 大谷 純
技術評論社
売り上げランキング: 38211

コメント

タイトルとURLをコピーしました