2009-06-22 6 views
4

Thinking Sphinx Plugin과 함께 스핑크스를 사용하여 데이터를 검색하고 있습니다. MySQL을 사용하고 있습니다.악센트가있는 스핑크스 주문

내 데이터에는 악센트 부호가있는 문자 ("á", "é", "â")가 포함되어 있으며 해당 악센트 부호가없는 대응 문자 ("a", "e", "a") 검색 및 주문시.

charset 테이블 (pastie.org/204316)을 사용하여 검색을 수행했으며 "AGUA"에 대한 검색이 "ÁGUA"를 반환하지만 결과의 순서가 제대로 작동하지 않습니다. 예를 들어, "AGUA"에 대한 검색에서 "ÁGUA"는 "MUITA ÁGUA"다음에 표시되지만, "Á"이 아닌 "A"로 쓰여진 것처럼 분류됩니다.

내가 생각할 수있는 유일한 해결책은 악센트 부호가있는 문자가 포함 된 새로운 열을 색인화하고 악센트 부호가있는 문자를 제거하는 REPLACE (http://dev.mysql.com/doc/refman/5.4/en/string-functions.html#function_replace) mysql 함수를 사용하여 분류기로 사용하는 것이지만 REPLACE에 대한 호출이 하나 필요합니다. 각각의 가능한 악센트 부호가있는 char (그리고 거기에 많은) 그리고 나에게는 매우 maintanable 해결 방법이 아닌 것 같습니다.

아무도이 문제를 해결할 더 좋은 방법을 알고 있습니까?

감사합니다.

답변

3

스핑크스는 모든 값을 목록에 저장하고 목록을 정렬 한 다음 각 문자열의 색인을 int 특성으로 저장하여 문자열 필드의 정렬을 처리합니다. 문서에 따르면이 목록의 정렬은 바이트 수준에서 수행되며 현재 구성 할 수 없습니다.

인코딩 및 로캘에 따라 문자열을 다르게 정렬하는 것이 가장 이상적입니다. 예를 들어 문자열이 KOI8R 인코딩에서 러시아어 텍스트 인 것으로 알려진 경우 바이트 0xE0, 0xE1 및 0xE2를 정렬하면 0xE1, 0xE2 및 0xE0이 생성됩니다. KOI8R 값 0xE0은 (눈에 띄게) 인코딩 된 문자를 인코딩하기 때문입니다. 0xE1 및 0xE2. 불행히도 스핑크스는 현재이를 지원하지 않고 문자열을 단순히 정렬합니다.

-http://www.sphinxsearch.com/docs/current.html

에서 그래서, 더 쉬운 방법은 스핑크스 내에서이를 없습니다. REPLACE() 기반 아이디어를 수정하면 별도의 열이 있고 모델의 콜백을 사용하여 채울 수 있습니다. 이것은 당신이 MySQL 대신에 루비에서 교체를 처리하게 할 것입니다, 틀림없이 더 유지하기 쉬운 솔루션입니다.

# save an unaccented copy of your title. Normalise method borrowed from 
# http://stackoverflow.com/questions/522715/removing-accents-diacritics-from-string-while-preserving-other-special-chars-tri 
class MyModel < ActiveRecord::Base 
    before_validation :update_sort_col 

    private 

    def update_sort_col 
    sort_col = self.title.to_s.mb_chars.normalize(:kd).gsub(/[^-x00-\x7F]/n, '').to_s 
    end 
end 
1

당신은 또한 당신의 대체 방법을 호출 할 수 있도록 당신이 당신의 DB에

indexes "LOWER(title)", :as => :title, :sortable => true 

원시 SQL을 새 열 필요도 해달라고을위한 특별한 인덱스를 사용할 수 있습니다.

+0

좋은 해결책은 빨리 아주 지저분한 얻을 수 있습니다. – James

0

다음 구문을 사용하여 소문자 버전으로 색인을 작성하십시오. case insensitive에 대한 매우 간단하고 우아한 솔루션은 Sphinx을 사용하여 검색합니다. 당신이 검색하고 독립적 인 컬럼의 수를 정렬 할 필요에 따라, 특히 이전에 게시 답변으로 대소 문자를 구분 문제에 대한

indexes title, as: :title, sortable: :insensitive