Sphinx의 악센트를 구분하지 않는 순서
-
06-07-2019 - |
문제
내 데이터를 검색하기 위해 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