System Development
 

システム開発 - 使用して、フレームワークのLuceneのフルテキスト検索をインストール先のシステム特性 - 中国語の単語を

はじめに:昨年の調査とweblucene Luceneの全文検索技術と関連する他の中のシステム。。研究では、後に継続しなかった。研究では、(それを勉強して、フルテキスト検索機能を追加するには、もう一度再Zend Frameworkの下にluceneのモジュールを検討しようとする。
次のいくつかの記事がどのようにビルドするためにZend Frameworkのシステムを使用する方法を説明しますシンプルで実用的なサイト内検索。。。Zend Frameworkには、私が)ライブラリのクラスとして使用。
それ自体が中国語の単語分割アルゴリズムを提供していませんZF社、特定のアプリケーションが独自に作成する。私は(プログラムを変更するには、適切に、他の文字セットを使用するために、UTF - 8のみ)、単純なバイナリ分割アルゴリズムを使用しています。

ZFはマニュアルに記載されていないで、私は簡単な例を与えるために、ここにいます:
<?php
$analyzer = Zend_Search_Lucene_Analysis_Analyzer::getDefault();
$value = 'this is a test!';
$analyzer->setInput($value, 'utf-8');
$position = 0;
$tokenCounter = 0;
while (($token = $analyzer->nextToken()) !== null) {
$tokenCounter++;
$tokens[] = $token;
}
print_r($tokens);
?>
ZFは、ここで、デフォルトの単語分割アルゴリズムZend_Search_Lucene_Analysis_Analyzer_Common_Textを使用して。。たとえば、次のようないくつかの単語をフィルタリング"です"、""など。
第2段階は、カスタム、独自の単語分割アルゴリズム、または、マニュアルを参照することができます、そのクラスの実現がZend_Search_Lucene_Analysis_Analyzer_Common_Textを表示する。
一つは、注意してください、このフィルタは。。。これは、()は達成リセットすることができます
例。
<?
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
class Phpbean_Lucene_Analyzer extends Zend_Search_Lucene_Analysis_Analyzer_Common {
private $_position;
private $_cnStopWords = array();
public function setCnStopWords($cnStopWords){
$this->_cnStopWords = $cnStopWords;
}
/**
* Reset token stream
*/
public function reset()
{
$this->_position = 0;
$検索=配列(",","/"、"\"、";"、""!":""、""、""、"〜"、"`"、"^"、" (",")の"、""、" - "、"トン"は、"n"、"'"、"<",">"、"r"は、"rnを"、"$"、"&" 、"%"、"#"、"@"、"+"、"="、"{""}"、"[""]"、":"")"、"(""""。。
$this->_input = str_replace($search,' ',$this->_input);
$this->_input = str_replace($this->_cnStopWords,' ',$this->_input);
}
/**
* Tokenization stream API
* Get next token
* Returns null at the end of stream
*
* @return Zend_Search_Lucene_Analysis_Token|null
*/
public function nextToken()
{
if ($this->_input === null) {
return null;
}
while ($this->_position < strlen($this->_input)) {
while ($this->_position < strlen($this->_input) &&
$this->_input[$this->_position]==' ' ) {
$this->_position++;
}
$termStartPosition = $this->_position;
$temp_char = $this->_input[$this->_position];
$isCnWord = false;
if(ord($temp_char)>127){
$i = 0;
while ($this->_position < strlen($this->_input) &&
ord( $this->_input[$this->_position] )>127) {
$this->_position = $this->_position + 3;
$i ++;
if($i==2){
$isCnWord = true;
break;
}
}
if($i==1)continue;
}else{
while ($this->_position < strlen($this->_input) &&
ctype_alnum( $this->_input[$this->_position] )) {
$this->_position++;
}
}
if ($this->_position == $termStartPosition) {
return null;
}
$token = new Zend_Search_Lucene_Analysis_Token(
substr($this->_input,
$termStartPosition,
$this->_position - $termStartPosition),
$termStartPosition,
$this->_position);
$token = $this->normalize($token);
if($isCnWord)$this->_position = $this->_position - 3;
if ($token !== null) {
return $token;
}
}
return null;
}
}
?>
分割出力テストデモ
<?
$stopWords = array('a', 'an', 'at', 'the', 'and', 'or', 'is', 'am');
$stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_StopWords($stopWords);
$analyzer = new Phpbean_Lucene_Analyzer();
$ CnStopWords =配列('');
$analyzer->setCnStopWords($cnStopWords);
$analyzer->addFilter($stopWordsFilter);




$analyzer->setInput($value, 'utf-8');
$position = 0;
$tokenCounter = 0;
while (($token = $analyzer->nextToken()) !== null) {
$tokenCounter++;
$tokens[] = $token;
}
print_r($tokens);
?>
上記の例の出力は"この""テスト""中国"、"テスト"の結果4つです。我々のニーズを満たす。[color=#FF0000][/color]