문제

내 데이터를 검색하기 위해 Thinking Sphinx 플러그인과 함께 Sphinx를 사용하고 있습니다.나는 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를 한 번 호출해야 하며 유지 관리가 쉽지 않은 해결 방법인 것 같습니다.

이 문제를 처리하는 더 좋은 방법을 아는 사람이 있나요?

감사해요!

도움이 되었습니까?

해결책

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

이상적으로는 인코딩과 로케일에 따라 문자열을 다르게 정렬해야 합니다.예를 들어 문자열이 KOI8R 인코딩에서 러시아어 텍스트로 알려진 경우 0xE0, 0xE1 및 0xE2 바이트를 정렬하면 0xE1, 0xE2 및 0xE0이 생성됩니다. 0xE1 및 0xE2.불행하게도 Sphinx는 현재 이를 지원하지 않으며 단순히 문자열을 바이트 단위로 정렬합니다.

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

따라서 Sphinx 내에서 이를 달성하는 쉬운 방법은 없습니다.REPLACE() 기반 아이디어에 대한 수정은 별도의 열을 갖고 모델의 콜백을 사용하여 채우는 것입니다.이렇게 하면 유지 관리가 더 용이한 솔루션인 MySQL 대신 Ruby에서 교체를 처리할 수 있습니다.

# 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

다른 팁

DB에 새 열이 필요하지 않은 특수 색인을 사용할 수도 있습니다.

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

원시 SQL이므로 교체 방법을 호출 할 수 있습니다.

다음 구문으로 소문자 버전에서 색인을 작성하십시오. 매우 간단하고 우아한 솔루션 case insensitive 검색 사용 Sphinx.

indexes title, as: :title, sortable: :insensitive
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top