CodeIgniterのCMSで全文検索を行う方法

最近、人気が高まっているCodeIgniterフレームワーク専用のHabréに、より多くの投稿が掲載されています。 これは、通常のPHPアプリケーションの作成をすぐに開始できる、非常にシンプルで便利なフレームワークです。 猫の下には、CodeIgniterのCMSでFULLTEXT検索を実装する例があります。



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検索を使用する場合、留意すべきいくつかの制限があります。





5. CodeIgniterとMVCパターン。



フレームワークに戻りましょう。 CodeIgniterは、一般的なモデルビューコントローラー(MVCモデルビューコントローラー)デザインパターンを提供します。

基本的なルールを思い出させてください:



これらのルールのいずれかに違反した場合は、戻ってプロジェクトの構造について考え直す必要があります。

モデルファイルで検索開発を始めましょう。 検索を実行するメソッドは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 .






その結果、テスト結果を含むフォームは次のようになります。

画像







All Articles