Zend Search Lucene で構築されたカスタム検索エンジンがあります。このプログラムは、世界中のソースから多くの言語 (現在 11) でデータのフィードを取得することになっています。すべてが UTF-8 でエンコードされていることを確認するために、見つけたすべての方法に従いました。私の Lucene インデックスには、特殊文字を含む可能性のある 4 つのフィールドがありますが、主にタイトルと説明のフィールドを扱っており、現時点ではうまく機能していません。
私のローカル マシンでは、開発とテストのために XAMPP を実行しています。コードはここで完全に機能しています。英語、スペイン語、中国語、ロシア語などのコンテンツを問題なくインデックスに登録できます。Luke を使用して、結果のインデックスを調べることができます。
同じコードを持つライブ サーバーでは (確実に削除して再アップロードしようとしました)、結果のインデックスは特殊文字で失敗します。つまり、中国語とロシア語はどの文字にも索引を付けません。スペイン語のコンテンツでは、アクセント付きの最初の文字がある場所でカットされます。おそらく最初のマルチバイト文字がストレージを殺してしまうようです。ただし、ドキュメントは引き続きインデックスに保存されます。特殊文字のないその他のフィールドは正しく保存されます。
コードは次のようになります (例として単純化)。
$index = Zend_Search_Lucene::create(CF_INDEX_LOCATION);
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive());
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Text('title', $title));
$index->addDocument($doc);
$index->commit();
$index->optimize();
繰り返しますが、このコードと Zend ライブラリは、両方の環境で同じです。ローカル インスタンスにより、異なるアナライザーを使用しなくても、これらすべての言語が同じインデックスに共存できるインデックスが正常に作成されます。
サーバー設定の比較は次のとおりです。
- ローカル
- アパッチのバージョン: 2.2.6
- PHP バージョン: 5.2.4
- Apache モジュールとして実行される PHP
- ライブ
- アパッチのバージョン: 2.2.17
- PHP バージョン: 5.3.6
- FastCGI として実行される PHP
両方のサーバーで mbstring マルチバイト サポートが有効になっています。他に何を見ればいいのかわかりません。CGI 対モジュール オプションはこれに影響しますか? 比較する必要がある他の設定はありますか?