1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20854 -->
4 <sect1 id="zend.search.lucene.charset">
7 <sect2 id="zend.search.lucene.charset.description">
8 <title>UTF-8 およびシングルバイト文字セットのサポート</title>
11 <classname>Zend_Search_Lucene</classname> は、内部的には UTF-8 文字セットで動作します。
12 インデックスファイルには、unicode のデータが Java の
13 "modified UTF-8 encoding" で保存されます。
14 <classname>Zend_Search_Lucene</classname> はこの文字セットを完全にサポートしていますが、
18 <classname>Zend_Search_Lucene</classname> では Basic Multilingual Plane
19 (BMP) 文字 (0x0000 から 0xFFFF まで) のみをサポートしており、
20 "supplementary characters" (コードポイントが
21 0xFFFF より大きい文字) はサポートしていません。
24 Java 2 では、これらを文字 (16 ビット)
25 のペアで表します。最初の文字が上位サロゲート (0xD800-0xDBFF)、
26 2 番目の文字が下位サロゲート (0xDC00-0xDFFF) となります。
27 その後、これらが 6 バイトの UTF-8 文字にエンコードされます。
28 標準的な UTF-8 では、supplementary characters
35 実際の入力データのエンコーディングを指定するには
36 <classname>Zend_Search_Lucene</classname> の <acronym>API</acronym> を使用します。
37 データは、自動的に UTF-8 エンコーディングに変換されます。
41 <sect2 id="zend.search.lucene.charset.default_analyzer">
42 <title>デフォルトのテキスト解析器</title>
45 (クエリパーサの中でもこれが用いられます) は、
46 テキストやクエリのトークン化に ctype_alpha()
51 ctype_alpha() は UTF-8 と互換性がありません。
53 テキストをインデックス化する前に 'ASCII//TRANSLIT'
55 同じ処理がクエリのパース時にも透過的に行われます。
58 'ASCII//TRANSLIT' への変換は、現在のロケールおよび
67 デフォルトの解析器は、数字は単語の一部として扱いません。
68 数字で単語を分断されたくない場合は、'Num' 解析器を使用しましょう。
73 <sect2 id="zend.search.lucene.charset.utf_analyzer">
74 <title>UTF-8 互換のテキスト解析器</title>
77 <classname>Zend_Search_Lucene</classname> には、
78 <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8</classname>、
79 <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num</classname>、
80 <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive</classname>、
81 <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive</classname>
82 といった UTF-8 解析器も含まれています。
86 これを有効にするには、以下のようなコードを使用します。
88 <programlisting language="php"><![CDATA[
89 Zend_Search_Lucene_Analysis_Analyzer::setDefault(
90 new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
97 UTF-8 互換の解析器は Zend Framework 1.5 で改良されました。
98 以前のバージョンの解析器は非アスキーキャラクタをすべて文字とみなしていましたが、
99 新しい解析器の実装ではより正確な挙動となります。
103 データと検索クエリのトークン化方法を統一することになるでしょう。
104 そうしないと、検索エンジンの返す結果セットがおかしなものになってしまいます。
109 これらの解析器を使用するには、PCRE (Perl 互換正規表現)
110 ライブラリを UTF-8 サポート込みでコンパイルしておく必要があります。
111 <acronym>PHP</acronym> のソースコードに同梱されている PCRE ライブラリのソースでは
112 PCRE の UTF-8 サポートは有効になっているのですが、
113 バンドル版でなく共有ライブラリを使用している場合などは、
114 OS によって UTF-8 サポートの状態が異なるかもしれません。
118 PCRE が UTF-8 に対応しているかどうかを調べるには、次のコードを使用します。
120 <programlisting language="php"><![CDATA[
121 if (@preg_match('/\pL/u', 'a') == 1) {
122 echo "PCRE は unicode をサポートしています。\n";
124 echo "PCRE は unicode をサポートしていません。\n";
130 大文字小文字を区別しないバージョンの UTF-8 互換解析器を使用する場合は、さらに
131 <ulink url="http://www.php.net/manual/ja/ref.mbstring.php">mbstring</ulink>
136 「mbstring 拡張モジュールは使いたくないけれど、大文字小文字を区別しない検索はしたい」
138 まず、インデックス化の前に元データを正規化し、
139 検索の際にはクエリ文字列を小文字に変換します。
141 <programlisting language="php"><![CDATA[
143 setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
147 Zend_Search_Lucene_Analysis_Analyzer::setDefault(
148 new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
152 $doc = new Zend_Search_Lucene_Document();
154 $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
155 strtolower($contents)));
157 // 検索用の Title フィールド (インデックス化しますが保存しません)
158 $doc->addField(Zend_Search_Lucene_Field::UnStored('title',
159 strtolower($title)));
161 // 取得用の Title フィールド (インデックス化せず、保存します)
162 $doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));
165 <programlisting language="php"><![CDATA[
167 setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
171 Zend_Search_Lucene_Analysis_Analyzer::setDefault(
172 new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
176 $hits = $index->find(strtolower($query));