CodeZine(コードジン)

特集ページ一覧

Zend Framework入門(19):
PHPによるテキスト検索エンジンの活用 - Zend_Search_Lucene -

Zend Frameworkによる実践的なPHPアプリケーション開発 19

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/05/15 14:00
目次

検索の行い方

 次に検索の行い方について説明します。検索はZend_Search_Luceneのfindメソッドで行いますが、ここではどのような形で検索クエリを渡し、得られた結果の中身をどのように見るのかについて説明します。

クエリの作成

 リスト1ではクエリは文字列で渡していましたが、実はこれは多少省略した形になっています。Zend_Search_Luceneのfindメソッドは、文字列を与えられたら内部でZend_Search_Lucene_Search_QueryParserの静的メソッドparseを呼び出して、そこで得られるクエリを実行しています。省略していない形をリスト7に示します。

[リスト7]クエリを実行する
//リスト1での書き方
$hits = $index->find('Test');

//上は、実は下の処理と同じ
$query = Zend_Search_Lucene_Search_QueryParser::parse('Test');
$hits = $index->find($query);

 このように、Zend_Search_Luceneのfindメソッドは、文字列以外にZend_Search_Lucene_Search_Queryのインスタンスも受け付けます。プログラム的にクエリを作成する場合には文字列ではなく、このZend_Search_Lucene_Search_QueryParserのインスタンスの形でクエリを作成するのが良いでしょうが、今回はとりあえず文字列としてクエリを作成する際の基本的な書き方について説明します。

(1)単語を探す

 単語を探す場合には、単純にその単語をクエリとして渡します。例えば「CodeZine」という単語を含む文書を探したい場合には次のようにします。

$index->find('CodeZine');

(2)フィールドを指定

 フィールドを指定して探す場合には、「フィールド名:」という修飾をします。例えばフィールド「location」に「Here」という単語を含む文書を探したい場合には次のようにします。

$index->find('location:Here');

(3)複数の条件

 複数の条件を列挙して演算子でつなげることができます。使える演算子は「AND」「OR」「NOT」です。例えば「Here」と「CodeZine」を含む文章を探したい場合には次のようにします。

$index->find('Here AND CodeZine');

(4)ワイルドカード

 「?」や「*」のようなワイルドカードも利用できます。「?」は任意の一文字に「*」は任意の文字列に対応します。次の例は、例えば「CodeZine」「Cider」「Cade0000」などに合致します。

$index->find('C?de*');

(5)範囲

 範囲を表現したい場合には「[(ここから) TO (ここまで)]」 や「{(ここより上) TO (ここ未満)}」のように表現します(「[]」は端を含みますが「{}」は端を含みません)。この比較は辞書順に行われるので注意してください。例えば 2009-01-01 から 2009-12-31の間の文字列を含む文書を調べたい場合には次のようにします:

$index->find('[2009-01-01 TO 2009-12-31]');

 これらを合わせることもできます。

$index->find('date:([2009-01-01 TO 2009-12-31]) AND location:Here OR Code*');

検索の結果の取得

 検索を実行すると、結果はZend_Search_Lucene_Search_QueryHitの配列として返ってきます。それぞれのZend_Search_Lucene_Seach_QueryHitには検索に合致した文書のスコアや索引内でのIDなどが返されます。

Zend_Search_Lucene_Search_QueryHitクラスのメンバ
 分類 メンバ名 引数 説明
プロパティ $id (なし) 索引内でのID。
$score (なし) 検索のスコア。
インスタンスメソッド __get $offset $(QueryHitのインスタンス)->(フィールド名)という形式で合致した文書のフィールドにアクセスできる。
getDocument (なし) 合致した文書を返す。
getIndex (なし) 索引内でのIDを返す。

おわりに

 今回はテキスト検索エンジンのZend_Search_Luceneモジュールの基本的な紹介をしました。索引の作成も検索の実行も手軽にできることが理解いただければ嬉しいです。

 次回は、Zend_Search_Luceneについて、もう少し詳細に紹介します。具体的には細かいクエリの作成方法やZend_Search_Luceneの内部でどのようにテキストを解析しているのか、などについて扱う予定です。

 また、Apache Luceneとの連携についても説明する予定です。Apache LuceneではOffice 2003以前のファイルや、日本語を含むファイルから索引を作成することができるため、Apache Luceneで索引を作成し、Zend_Search_Luceneから検索を行うといった利用方法も考えられます。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Zend Framework入門

もっと読む

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

  • WINGSプロジェクト 風田 伸之(カゼタ ノブユキ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5