トップ «前の日記(2006-05-29) 最新 次の日記(2006-06-01)» 編集

2002|01|02|03|04|05|06|07|08|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|02|03|04|07|

2006-05-31 [長年日記]

_ Zend_Search_HyperEstraier設計中

PEARスタイルのラッパーがあるのは知っているんだけど、Zend Frameworkスタイルで作り直し中。単なるノードAPIのラッパーはだいたいできたんで、さらにそれにかぶせるラッパーを作成中。

現状の設計だと使い勝手は、

$client = new Zend_Search_HyperEstraier_Node_Client($nodeUrl, $userName, $password);

// シンプルな検索
$searchResult = $client->search('phrase'); 

// 複雑な検索
$condition = $client->getCondition();
$condition->clear();
$condition->setPhrase('phrase');
$condition->addAttribute('name streq value');
$condition->setOrder('@mdate');
$searchResult = $client->search(); // or $client->search($condition);

foreach ($searchResult as $item) {
  echo $item->getUri() . "\n";
  foreach ($item->getAttributes() as $name => $value) {
    echo "$name: $value\n";
  }
  echo 'Keyword: ';
  foreach ($item->getKeywords() as $keyword) {
    echo $keyword . ' ';
  }
  echo "\n";
  echo $item->Snippet() . "\n";
}

// ドキュメントリストを取得
$list = $client->getDocumentList($limit);
foreach ($list as $item) {
  echo $item['@uri'] . "\n";
  echo $item['@cdate'] . "\n";
}

// 新規ドキュメントの登録
$document = $client->createDocument([uri]);
$document->addText('text');
$document->addAttribute('name', 'value');
$document->setKeywords(array('keyword1', 'keyword2'));
$document->save();

// 既存のドキュメントの更新
$document = $client->getDocument([document id or uri]);
$document->addText('new text line');
$document->addAttribute('name', 'value');
$document->setKeywords(array('keyword1', 'keyword2'));
$document->save();

// 既存のドキュメントの削除
$document = $client->getDocument([document id or uri]);
$document->delete();

なんて感じなんだけど、なんか末端部の扱いがこなれてなさ過ぎなんで、もうちょっと練ってみよう。あと、検索条件の設定を、Hyper Estraierのマニュアルなしでできるくらい、わかりやすくできないかなー? Estraierでもそうだったけど、高機能な分、検索条件を組み立てるのが難しい(直感的じゃない)んだよな。

あと今すぐは必要ないだろうけど、estwaverみたいにインデックスへの書き込みを複数のノードに分散させる機能を持つクライアント(Zend_Search_HyperEstraier_Node_Client_Distributedとか)も考えておこう。