SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

検索の行い方

 次に検索の行い方について説明します。検索は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から検索を行うといった利用方法も考えられます。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Zend Framework入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3867 2009/05/15 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング