Sphinx обрабатывает сортировку по строковым полям, сохраняя все значения в списке, сортируя список, а затем сохраняя индекс каждой строки как атрибут int. Согласно документации, сортировка этого списка выполняется на уровне байтов и в настоящее время не настраивается.
В идеале строки должны сортироваться по-разному, в зависимости от кодировки и локали. Например, если известно, что строки являются русским текстом в кодировке KOI8R, сортировка байтов 0xE0, 0xE1 и 0xE2 должна привести к 0xE1, 0xE2 и 0xE0, поскольку в KOI8R значение 0xE0 кодирует символ, который (заметно) после символов, закодированных 0xE1 и 0xE2. К сожалению, Sphinx на данный момент не поддерживает это и просто сортирует строки по байтам.
- от http://www.sphinxsearch.com/docs/current.html
Так что нет простого способа достичь этого в Сфинксе. Модификация вашей идеи на основе REPLACE () будет состоять в том, чтобы иметь отдельный столбец и заполнять его с помощью обратного вызова в вашей модели. Это позволило бы вам выполнять замену в Ruby вместо MySQL, что, возможно, более приемлемо для решения.
# save an unaccented copy of your title. Normalise method borrowed from
# /583372/udalenie-aktsentov-diakriticheskih-znakov-stroki-sohranenii-drugih-spetsialnyh-simvolov-proboval-mbchars-normalize
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