コード

検索機能を追加

2009年12月23日

検索機能はblogクラスに追加しました。blog::var_blog()メソッドの中で、次のようにしています。
		if (self::$narrowby['search'] && isset($_GET['query_text'])) {
			$search=true;
			self::sql_search_compile_query($_GET['query_text']);
		} else $search=false;
		foreach(self::$narrowby as $key=>$value) self::$narrowby[$key]=false;
		// Prepare query and array-data
		$query='SELECT '.
			(略)
			($search ? 'AND libs_blog_search(i.title,i.body,i.more) ':'').
			'ORDER by time DESC '.
			'LIMIT <%limit%> OFFSET <%offset%>';

libs_blog_search(i.title,i.body,i.more)のところ、SQLiteのユーザー定義関数をblog::sql_libs_blog_search()にわりあてて、次のようにしました。
	static private $query_regex=array('/?/');
	static private function sql_search_compile_query($query){
		$query=preg_split('/(?:\x20|\xe3\x80\x80)/',$query,-1,PREG_SPLIT_NO_EMPTY);
		self::$query_regex=array();
		foreach ($query as $word) {
			$words=explode('|',$word);
			foreach ($words as $key=>$word) $words[$key]=preg_quote($word);
			self::$query_regex[]='/(?:'.implode('|',$words).')/i';
		}
	}
	static public function sql_libs_blog_search(&$title,&$body,&$more){
		foreach(self::$query_regex as $regex){
			if (preg_match($regex,$title)) continue;
			if (preg_match($regex,$body)) continue;
			if (preg_match($regex,$more)) continue;
			return false;
		}
		return true;
	}

SQLクエリーでPHPのコードが使えるのが、SQLiteの強みです。検索速度を損ねない工夫はしてあるつもりですが、実運用で問題が出れば、見直す必要があるかもしれません。

コメント

コメントはありません

コメント送信