[GENERIC] Zend_Translate:
[zend.git] / documentation / manual / ja / module_specs / Zend_Search_Lucene-Charset.xml
blobc6e03ced65271dfec7889a7cdeb8a4d7edd0b94a
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <!-- EN-Revision: 20854 -->
4 <sect1 id="zend.search.lucene.charset">
5     <title>文字セット</title>
7     <sect2 id="zend.search.lucene.charset.description">
8         <title>UTF-8 およびシングルバイト文字セットのサポート</title>
10         <para>
11             <classname>Zend_Search_Lucene</classname> は、内部的には UTF-8 文字セットで動作します。
12             インデックスファイルには、unicode のデータが Java の
13             "modified UTF-8 encoding" で保存されます。
14             <classname>Zend_Search_Lucene</classname> はこの文字セットを完全にサポートしていますが、
15             ひとつだけ例外があります。
16             <footnote>
17                <para>
18                    <classname>Zend_Search_Lucene</classname> では Basic Multilingual Plane
19                    (BMP) 文字 (0x0000 から 0xFFFF まで) のみをサポートしており、
20                    "supplementary characters" (コードポイントが
21                    0xFFFF より大きい文字) はサポートしていません。
22                </para>
23                <para>
24                    Java 2 では、これらを文字 (16 ビット)
25                    のペアで表します。最初の文字が上位サロゲート (0xD800-0xDBFF)、
26                    2 番目の文字が下位サロゲート (0xDC00-0xDFFF) となります。
27                    その後、これらが 6 バイトの UTF-8 文字にエンコードされます。
28                    標準的な UTF-8 では、supplementary characters
29                    を 4 バイトで表します。
30                </para>
31             </footnote>
32         </para>
34         <para>
35             実際の入力データのエンコーディングを指定するには
36             <classname>Zend_Search_Lucene</classname> の <acronym>API</acronym> を使用します。
37             データは、自動的に UTF-8 エンコーディングに変換されます。
38         </para>
39     </sect2>
41     <sect2 id="zend.search.lucene.charset.default_analyzer">
42         <title>デフォルトのテキスト解析器</title>
43         <para>
44             しかし、デフォルトのテキスト解析器
45             (クエリパーサの中でもこれが用いられます) は、
46             テキストやクエリのトークン化に ctype_alpha()
47             を使用しています。
48         </para>
50         <para>
51             ctype_alpha() は UTF-8 と互換性がありません。
52             したがって、この解析器は
53             テキストをインデックス化する前に 'ASCII//TRANSLIT'
54             エンコーディングに変換します。
55             同じ処理がクエリのパース時にも透過的に行われます。
56             <footnote>
57                <para>
58                    'ASCII//TRANSLIT' への変換は、現在のロケールおよび
59                    OS に依存します。
60                </para>
61             </footnote>
62         </para>
64         <note>
65             <title/>
66             <para>
67                 デフォルトの解析器は、数字は単語の一部として扱いません。
68                 数字で単語を分断されたくない場合は、'Num' 解析器を使用しましょう。
69             </para>
70         </note>
71     </sect2>
73     <sect2 id="zend.search.lucene.charset.utf_analyzer">
74         <title>UTF-8 互換のテキスト解析器</title>
76         <para>
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 解析器も含まれています。
83         </para>
85         <para>
86              これを有効にするには、以下のようなコードを使用します。
88             <programlisting language="php"><![CDATA[
89 Zend_Search_Lucene_Analysis_Analyzer::setDefault(
90     new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
91 ]]></programlisting>
92         </para>
94         <warning>
95             <title/>
96             <para>
97                 UTF-8 互換の解析器は Zend Framework 1.5 で改良されました。
98                 以前のバージョンの解析器は非アスキーキャラクタをすべて文字とみなしていましたが、
99                 新しい解析器の実装ではより正確な挙動となります。
100             </para>
101             <para>
102                 そのため、インデックスを再ビルドして
103                 データと検索クエリのトークン化方法を統一することになるでしょう。
104                 そうしないと、検索エンジンの返す結果セットがおかしなものになってしまいます。
105             </para>
106         </warning>
108         <para>
109             これらの解析器を使用するには、PCRE (Perl 互換正規表現)
110             ライブラリを UTF-8 サポート込みでコンパイルしておく必要があります。
111             <acronym>PHP</acronym> のソースコードに同梱されている PCRE ライブラリのソースでは
112             PCRE の UTF-8 サポートは有効になっているのですが、
113             バンドル版でなく共有ライブラリを使用している場合などは、
114             OS によって UTF-8 サポートの状態が異なるかもしれません。
115         </para>
117         <para>
118              PCRE が UTF-8 に対応しているかどうかを調べるには、次のコードを使用します。
120             <programlisting language="php"><![CDATA[
121 if (@preg_match('/\pL/u', 'a') == 1) {
122     echo "PCRE は unicode をサポートしています。\n";
123 } else {
124     echo "PCRE は unicode をサポートしていません。\n";
126 ]]></programlisting>
127         </para>
129         <para>
130             大文字小文字を区別しないバージョンの UTF-8 互換解析器を使用する場合は、さらに
131             <ulink url="http://www.php.net/manual/ja/ref.mbstring.php">mbstring</ulink>
132             拡張モジュールが必要です。
133         </para>
135         <para>
136             「mbstring 拡張モジュールは使いたくないけれど、大文字小文字を区別しない検索はしたい」
137             という場合は、次のようにします。
138             まず、インデックス化の前に元データを正規化し、
139             検索の際にはクエリ文字列を小文字に変換します。
141             <programlisting language="php"><![CDATA[
142 // インデックス化
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));
163 ]]></programlisting>
165             <programlisting language="php"><![CDATA[
166 // 検索
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));
177 ]]></programlisting>
178         </para>
179     </sect2>
180 </sect1>