2012-02-09 2 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" 

이 스핑크스의 버그, 아니면 내가 뭔가 잘못하고있는 중이 야 : 나는 루비에서이 작업을 수행 할 때 그것을 통해 두 번째로 간다처럼, 그것은 본다?

나는 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- * 문자 집합 및 대한 문자하지만, 일인가요 합법적으로 유니 코드가 필요한 것들?

업데이트 1 :

두 번째 질문에 대한 대답은 전혀 없습니다. 터키어 이름을 검색 : ". YİĞİT하기 Ozdemir"

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] 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 Ö가 다섯 바이트 폭 것으로 보인다 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

신경 쓰지 마세요. 우리 데이터베이스의 데이터는 이중 인코딩되었습니다.