1. CodeIgniterの準備。
CodeIgniterディストリビューションをダウンロードして、サーバー上のフォルダーに解凍します。 データベース、このデータベースへのアクセス権を持つユーザーを作成し、application / config / database.phpで接続設定を規定します。
application / config / config.phpを開き、base_urlフィールド設定を設定します。
2.データベースをセットアップします。
最初のステップでデータベースを作成しましたが、テーブルはありません。 単純なページテーブルを作成します。
CREATE TABLE pages (
id int (10) UNSIGNED NOT NULL AUTO_INCREMENT,
url text NOT NULL ,
title text NOT NULL ,
content text NOT NULL ,
updated datetime NOT NULL ,
PRIMARY KEY (id),
FULLTEXT KEY content (content)
) ENGINE=MyISAM
* This source code was highlighted with Source Code Highlighter .
FULLTEXTを使用する場合、検索するすべてのフィールドを指定する必要があります。 この表では、検索はコンテンツフィールドでのみ実行されます。 FULLTEXT検索はMyISAMエンジンを使用した場合にのみ機能することに注意してください。
3.テストデータ
検索エンジンをテストするには、テーブルにテストデータを追加する必要があります。 私は、ウィキペディアが私たちのデータベースの良いドナーになる可能性があると決めました。 最後のいくつかの記事を取得する小さなスクリプトを作成し、 Wikipediaエクスポートを使用して、これらの記事をデータベースに書き込みます。
4.データベースを検索する
検索するには、次の形式のSQLクエリを使用します。
SELECT *
FROM pages
WHERE MATCH (content) AGAINST ( 'test' ) > 0
* This source code was highlighted with Source Code Highlighter .
FULLTEXT検索を使用する場合、留意すべきいくつかの制限があります。
- リクエストは3文字より長くする必要があります。そうしないと、検索は空の結果を返します。
- MySQLが検索時に無視するストップワードのセットがあります(「the」、「however」、「hello」)。 これらの単語で検索しようとすると、検索結果は空になります。
- 高度な検索も利用できます。 詳細については、MySQLのドキュメントを参照してください。
5. CodeIgniterとMVCパターン。
フレームワークに戻りましょう。 CodeIgniterは、一般的なモデルビューコントローラー(MVCモデルビューコントローラー)デザインパターンを提供します。
基本的なルールを思い出させてください:
- すべての変更とデータベースの操作はモデルから行われます
- コントローラーまたはモデルからユーザーに何も表示できません。
- 省略されたPHPエントリのタグ内に含めることができる式は1つだけです)
これらのルールのいずれかに違反した場合は、戻ってプロジェクトの構造について考え直す必要があります。
モデルファイルで検索開発を始めましょう。 検索を実行するメソッドは1つだけ使用します。 CodeIgniterにはクエリの生成を簡素化するActiveRecordがありますが、ここでは「直接SQLクエリ」が使用されていることに気付くかもしれません。
以下は、application / models / page_model.phpにあるモデルのコードです
class Page_model extends Model
{
function Page_model()
{
parent::Model();
//
$ this ->load->database();
}
function search($terms)
{
//
$sql = "SELECT url, title
FROM pages
WHERE MATCH (content) AGAINST (?) > 0" ;
$query = $ this ->db->query($sql, array($terms, $terms));
return $query->result();
}
}
* This source code was highlighted with Source Code Highlighter .
次のステップは、次の形式のファイルを作成することです。
<? php $ this- > load- > helper('form'); ? >
<? php echo form_open ($ this- > uri- > uri_string); ? >
<? php echo form_label ( 'Search:' , 'search-box' ); ? >
<? php echo form_input ( array ( 'name' = > 'q', 'id' = > 'search-box', 'value' = > $search_terms)); ? >
<? php echo form_submit ( 'search' , 'Search' ); ? >
<? php echo form_close (); ? >
<? php if ( ! is_null ($ results )) : ? >
<? php if ( count ($ results )) : ? >
< ul >
<? php foreach ($ results as $ result ) : ? >
< li >< a href ="&# 60 ;? php echo $ result- > url; ? > " ><? php echo $ result- > title; ? ></ a ></ li >
<? php endforeach ? >
</ ul >
<? php else: ? >
< p >< em > There are no results for your query. </ em ></ p >
<? php endif ? >
<? php endif ? >
* This source code was highlighted with Source Code Highlighter .
次に、モデルとビューを接続するコントローラーファイルを作成します。
class Pages extends Controller {
function search($search_terms = '' )
{
// URL
// ,
// .
if ($ this ->input->post( 'q' ))
{
redirect( '/pages/search/' . $ this ->input->post( 'q' ));
}
if ($search_terms)
{
//
$ this ->load->model( 'page_model' );
$results = $ this ->page_model->search($search_terms);
}
//
$ this ->load->view( 'search_results' , array(
'search_terms' => $search_terms,
'results' => @$results
));
}
}
* This source code was highlighted with Source Code Highlighter .
このメソッドの最初に、リダイレクト関数を使用しました。 この関数はURLヘルパーに含まれています。 この関数を使用するには、$ this-> load-> helper( 'url');を使用してヘルパーの「手動」ロードを実行しました。 なぜなら このヘルパーを頻繁に使用するため、起動時にすぐに登録して、常に手動で読み込まないようにする方が簡単です。 これを行うには、ファイルapplication / config / autoload.phpを編集します。 セクションに$ autoload ['helper']を追加します。
$autoload[ 'helper' ] = array( 'url' );
* This source code was highlighted with Source Code Highlighter .
これで、実用的なプロトタイプができました。 データベースにデータが含まれている必要があることを忘れないでください(少なくとも3行)。 ブラウザに「http://localhost/index.php/pages/search」のように入力し、データベース内のテキストを検索バーに入力して、検索をクリックします。 結果は次のようになります。
6.検索に新しい機能を追加します。
開始するには、検索結果のページナビゲーションを追加します。 CodeIgniterは、ページネーションクラスを使用してページネーションを表示します。
モデルを変更して、ページネーションを表示します。 これを行うには、データベースから選択したレコードの数、選択するレコード番号を設定し、このリクエストの合計レコード数を取得する必要があります。
取得したものは次のとおりです。
class Page_model extends Model {
function search($terms, $start = 0, $results_per_page = 0)
{
//
//
if ($results_per_page > 0)
{
$limit = "LIMIT $start, $results_per_page" ;
}
else
{
$limit = '' ;
}
// SQL
$sql = "SELECT url, title, content
FROM pages
WHERE MATCH (content) AGAINST (?) > 0
$limit" ;
$query = $ this ->db->query($sql, array($terms, $terms));
return $query->result();
}
function count_search_results($terms)
{
// Run SQL to count the total number of search results
$sql = "SELECT COUNT(*) AS count
FROM pages
WHERE MATCH (content) AGAINST (?)" ;
$query = $ this ->db->query($sql, array($terms));
return $query->row()->count;
}
}
* This source code was highlighted with Source Code Highlighter .
次のステップは、ページネーションで動作するようにコントローラーを変更することです
class Pages extends Controller {
function search($search_terms = '' , $start = 0)
{
// URL
// ,
// .
if ($ this ->input->post( 'q' ))
{
redirect( '/pages/search/' . $ this ->input->post( 'q' ));
}
if ($search_terms)
{
//
//
$results_per_page = $ this ->config->item( 'results_per_page' );
// , ,
//
$ this ->load->model( 'page_model' );
$results = $ this ->page_model->search($search_terms, $start, $results_per_page);
$total_results = $ this ->page_model->count_search_results($search_terms);
//
$ this ->_setup_pagination( '/pages/search/' . $search_terms . '/' , $total_results, $results_per_page);
//
$first_result = $start + 1;
$last_result = min($start + $results_per_page, $total_results);
}
//
$ this ->load->view( 'search_results' , array(
'search_terms' => $search_terms,
'first_result' => @$first_result,
'last_result' => @$last_result,
'total_results' => @$total_results,
'results' => @$results
));
}
function _setup_pagination($url, $total_results, $results_per_page)
{
//
$ this ->load->library( 'pagination' );
$uri_segment = count(explode( '/' , $url));
//
//
$ this ->pagination->initialize(array(
'base_url' => site_url($url),
'uri_segment' => $uri_segment,
'total_rows' => $total_results,
'per_page' => $results_per_page
));
}
}
* This source code was highlighted with Source Code Highlighter .
取得したものを見てみましょう。 ページナビゲーションを追加しました。これは、新しいセグメントがURLに追加されたことを意味します。 このセグメントは、同時に検索結果のページであり、データベースからの選択の開始位置を決定するための番号です。
検索ページで結果の数を設定するために、構成ライブラリーを使用しました。 新しいファイルをapplication / configフォルダーに追加することをお勧めします。 次の行を含むファイルapplication / config / application.phpを作成します。
$config[ 'results_per_page' ] = 10;
* This source code was highlighted with Source Code Highlighter .
application / config / autoload.phpファイルを再度変更して自動ロードに追加し、「アプリケーション」を$ autoload [「config」]セクションに追加します。
また、検索結果に表示される情報を処理するメソッドも使用します(スニペットおよびスニペット内のクエリからの単語の強調表示)。 これらのメソッドは、ファイルapplication / helpers / search_helper.phpのヘルパーに含まれています。 最初の関数search_highlight($ text、$ search_terms)は、検索結果のクエリから単語を選択し、2番目のsearch_extract($ content、$ search_terms、$ number_of_snippets = 3、$ snippet_length = 60)は、コンテンツから検索で指定されたクエリを含む部分を抽出します。
これは、次の形式の変更されたファイルのようになります。
<? php $ this- > load- > helper(array('form', 'search')); ? >
<? php echo form_open ($ this- > uri- > uri_string); ? >
<? php echo form_label ( 'Search:' , 'search-box' ); ? >
<? php echo form_input ( array ( 'name' = > 'q', 'id' = > 'search-box', 'value' = > $search_terms)); ? >
<? php echo form_submit ( 'search' , 'Search' ); ? >
<? php echo form_close (); ? >
<? php if ( ! is_null ($ results )) : ? >
<? php if ( count ($ results )) : ? >
< p > Showing search results for ' <? php echo $ search_terms ; ? > ' ( <? php echo $ first_result ; ? > – <? php echo $ last_result ; ? > of <? php echo $ total_results ; ? > ): </ p >
< ul >
<? php foreach ($ results as $ result ) : ? >
< li >< a href ="&# 60 ;? php echo $ result- > url; ? > " ><? php echo search_highlight ($ result- > title, $search_terms); ? ></ a >< br /><? php echo search_extract ($ result- > content, $search_terms); ? ></ li >
<? php endforeach ? >
</ ul >
<? php echo $ this- > pagination- > create_links(); ? >
<? php else: ? >
< p >< em > There are no results for your query. </ em ></ p >
<? php endif ? >
<? php endif ? >
* This source code was highlighted with Source Code Highlighter .
そして、新しい検索結果:
7.さらにおいしいチップ。
CodeIgniterは、 テストデータとさまざまな追加情報を表示する機能を提供します 。
たとえば、モデルのテストを実行できます。
// Mark the start of search
$ this ->benchmark->mark( 'search_start' );
// Load the model, perform the search and establish the total
// number of results
$ this ->load->model( 'page_model' );
$results = $ this ->page_model->search($search_terms, $start, $results_per_page);
$total_results = $ this ->page_model->count_search_results($search_terms);
// Mark the end of search
$ this ->benchmark->mark( 'search_end' );
* This source code was highlighted with Source Code Highlighter .
その結果、テスト結果を含むフォームは次のようになります。