2012-02-09 6 views
0

私はUTF-8文書、特にアーティスト名のスフィンクスインデックスを持っています。さまざまな理由から、フィールド(indexed_name)と属性(name)の両方の名前があります。私は、ドキュメントを検索すると、私はそれを正しく見つけることが、属性が破損して返される:UTF-8文字列属性を持つスフィンクス

mysql> select name from artist where match('@indexed_name Sánchez') limit 3; 
+---------+--------+-----------------------+ 
| id  | weight | name     | 
+---------+--------+-----------------------+ 
| 7843884 | 2642 | Sarita Sánchez  | 
| 8519538 | 2642 | Cristhian Sánchez | 
| 3853986 | 2627 | Alfonso Sánchez | 
+---------+--------+-----------------------+ 
3 rows in set (0.02 sec) 

属性は元々UTF-8であったが、ISO-8859-1として扱われ、その後、バック変換されたように見えますUTF-8に変換します。

[1] pry(main)> rs = Thebes::Sphinxql::Query.run("select name from artist where match('@indexed_name Sánchez')") 
=> #<Mysql2::Result:0x000000029bebf8 (omitted...) 
[2] pry(main)> name = rs.first['name'] 
=> "Sarita SÃ\u0083¡nchez" 

これはスフィンクスのバグですか、私は何か間違ったことをやっている:私はRubyでこれを行うと、それはそれを介して第2の時間を行くように、それが見えますか?

私はISO-8859-1とUTF-8を通してそれを循環させることによって、それを逆にすることができます:

[4] pry(main)> name.encode!("ISO-8859-1") 
=> "Sarita S\xC3\x83\xC2\xA1nchez" 
[5] pry(main)> name.force_encoding("UTF-8") 
=> "Sarita Sánchez" 
[6] pry(main)> name.encode!("ISO-8859-1") 
=> "Sarita S\xC3\xA1nchez" 
[7] pry(main)> name.force_encoding("UTF-8") 
=> "Sarita Sánchez" 

は、他のISO-8859- *文字セットの文字のためにとのために、しかし、仕事に行くということです合法的にUnicodeが必要なものはありますか?

アップデート1:

2番目の質問への答えはノーです。トルコ語の名前を検索する:

mysql> select name from artist where match('@indexed_name ÖZDEMİR') limit 3; 

+---------+--------+-------------------------------+ 
| id  | weight | name       | 
+---------+--------+-------------------------------+ 
| 1753230 | 2664 | Nurullah Alper ÖZDEMİR | 
| 6973956 | 2664 | YİĞİT ÖZDEMİR | 
| 9133770 | 2664 | TAHA ÖZDEMİR   | 
+---------+--------+-------------------------------+ 
3 rows in set (0.01 sec) 

2番目の文字は「YİĞİTÖZDEMİR」です。私はしたくない

[2] pry(main)> rs = Thebes::Sphinxql::Query.run("select name from artist where match('@indexed_name ÖZDEMİR') limit 3") 
=> #<Mysql2::Result:0x000000047779b0... 
[5] pry(main)> name = rs.to_a[1]['name'].dup 
=> "YÃ\u0084°Ã\u0084žÃ\u0084°T Ã\u0083â\u0080\u0093ZDEMÃ\u0084°R" 
[6] pry(main)> name.encode!("ISO-8859-1") 
=> "Y\xC3\x84\xC2\xB0\xC3\x84\xC5\xBE\xC3\x84\xC2\xB0T \xC3\x83\xE2\x80\x93ZDEM\xC3\x84\xC2\xB0R" 
[7] pry(main)> name.force_encoding("UTF-8") 
=> "YİĞİT ÖZDEMİR" 
[8] pry(main)> name.encode!("ISO-8859-1") 
Encoding::UndefinedConversionError: U+017E from UTF-8 to ISO-8859-1 
from (pry):8:in `encode!' 

は私が...

アップデート2 Oが5バイト広いように見えるA-、とになってしまったかどうかはわかりません私のsphinx.conf全体を投稿しますが、ここではここで使用されているインデックスの設定があります。これはThinking Sphinxによって生成されたものです。

source artist_core_0 
{ 
    type = mysql 
    sql_host = (omitted) 
    sql_user = (omitted) 
    sql_pass = (omitted) 
    sql_db = (omitted) 
    sql_query_pre = SET NAMES utf8 
    sql_query_pre = SET TIME_ZONE = '+0:00' 
    sql_query = (omitted) 
    sql_query_range = SELECT IFNULL(MIN(`id`), 1), IFNULL(MAX(`id`), 1) FROM `artists` 
    sql_attr_uint = sphinx_internal_id 
    sql_attr_uint = sphinx_deleted 
    sql_attr_uint = class_crc 
    sql_attr_float = latitude 
    sql_attr_float = longitude 
    sql_attr_string = sphinx_internal_class 
    sql_attr_string = name 
    sql_attr_string = homepage 
    sql_attr_string = image 
    sql_attr_string = city 
    sql_attr_string = state 
    sql_attr_string = postal_code 
    sql_attr_string = country 
    sql_query_info = SELECT * FROM `artists` WHERE `id` = (($id - 0)/6) 
} 

index artist_core 
{ 
    source = artist_core_0 
    path = (omitted) 
    morphology = libstemmer_en, libstemmer_fr, libstemmer_tr, libstemmer_es, libstemmer_de, libstemmer_it 
    charset_type = utf-8 
    min_prefix_len = 3 
    enable_star = 1 
} 

index artist 
{ 
    type = distributed 
    local = artist_core 
} 
+0

sphinx.confを添付できますか? –

答えて

0

気にしないでください。データベースのデータは二重エンコードされています。

関連する問題