日記
Zend_Search_HyperEstraier設計中 その3Edit

だいたい以下のような形で固まりつつある。

  • Zend_Search_HyperEstraier - ユーティリティクラス
  • Zend_Search_HyperEstraier_Document_Abstract - ドキュメント基底
  • Zend_Search_HyperEstraier_Document - 通常のドキュメント
  • Zend_Search_HyperEstraier_Document_ListItem - ドキュメントリストのアイテムとしてのドキュメント
  • Zend_Search_HyperEstraier_Document_SearchResult - 検索結果のアイテムのとしてのドキュメント
  • Zend_Search_HyperEstraier_SearchCondition - 検索条件
  • Zend_Search_HyperEstraier_SearchResult - 検索結果
  • Zend_Search_HyperEstraier_Node_Client - クライアントAPI
  • Zend_Search_HyperEstraier_Node_Document - クライアントAPIと連携するドキュメント
  • Zend_Search_HyperEstraier_Node_NodeInformation - ノード情報
  • Zend_Search_HyperEstraier_Node_UserInformation - ユーザー情報
  • Zend_Search_HyperEstraier_Node_Api_Abstract - コアAPI基底
  • Zend_Search_HyperEstraier_Node_Api_Client - コアAPIクライアント用
  • Zend_Search_HyperEstraier_Node_Api_Master - コアAPIマスター用

分散クライアントは、URIとノードの対応をどこで管理するのが妥当か思いつかない(っつーか、毎回URI検索して既登録だったらそのノードを使い、未登録だったら空いているところに登録、とかしかない気がするんだけど、それじゃあ分散させる意味が薄くてやる気がなくなった)んでいったんキャンセル。

あと結局ほぼノードAPIそのままのコアAPI層と、アプリケーションから使うクライアントAPIを別にした。ノードAPIを直で使う場合は、

$clientApi = new Zend_Search_HyperEstraier_Node_Api_Client($url, $username, $password);
$nodeInfo = $clientApi->getInformation();
$documentDraft = $clientApi->getDocument($uriOrId);
$document = new Zend_HyperEstraier_Document(documentDraft);
$document->text .= 'added text';
$document->modified = time();
if (!$clientApi->putDocument($document)) {
die('cannot save');
}

なんて感じ。クライアントAPIを使うと、

$client = new Zend_Search_HyperEstraier_Node_Client($url, $username, $password);
$document = $client->getDocument($documentUri);
if (!$document) {
$document = $client->createDocument($documentUri);
}
$document->title = 'title';
$document->created = time();
$document->modified = time();
$document->keywords[$keyword1] = $score1;
$document->text = 'text';
$document->hiddenText = 'hidden text';
$document->foo = 'foo'; // 非システム属性
$document->setAttribute('foo', 'foo'); // 上と同じ
if (!$document->save()) {
die('cannot save');
}
$document->updateAttributes(); //属性だけ更新する場合
$document->delete(); // 削除

なんて感じ。

肝心の検索は、

$searchResult = $client->search('phrase'); // フレーズ検索
// 複雑な検索条件
$condition = $client->getSearchCondition();
$condition->phrase = 'phrase';
$condition->attributes[] = 'attribute STRINC str';
$condition->skip = 5;
$condition->max = 10;
$searchResult = $condition->search();
foreach ($searchResult->hints as $word => $count) {
// 検索ワード出現回数
}
foreach ($searchResult->links as $nodeUrl => $nodeInfo) {
// ノード情報
}
foreach ($searchResult as $document) {
$uri = $document->uri;
$title = $document->title;
$created = $document->created; // @cdateをYYYY-mm-dd HH:ii:ss形式で
$snippet = $document->snippet;
}

なんて感じ。API周りのテストまで書き終わったんだけど、検索条件周りがまだいまいちすっきりしないんで、その辺をもうちょっと練ってみよう。

Published At2006-06-02 00:00Updated At2006-06-02 00:00