Thinking Sphinx — сортировка по атрибуту строки рассинхронизируется при внесении изменений

У меня есть таблица "рестораны" со столбцом "имя". Я определил следующий индекс:

indexes "REPLACE(UPPER(restaurants.name), 'THE ', '')", :as => :restaurant_name, :sortable => true

... потому что я хочу отсортировать названия ресторанов без префикса «The».

Моя проблема в том, что всякий раз, когда одна из этих записей обновляется (каким-либо образом), новая запись переходит в начало порядка сортировки. Если другая запись обновляется, она также опережает остальные. В итоге у меня есть два списка: список ресторанов, которые были обновлены с момента последней переиндексации, и список тех, которые не обновились. Каждый соответствующий список находится в алфавитном порядке, но я не понимаю, почему общий список разделяется таким образом. У меня настроен отложенный дельта-индекс, и я предполагаю, что проблема связана с этим.


person Scott Brown    schedule 23.04.2010    source источник


Ответы (2)


К сожалению, это ограничение sphinx.

Для сортировки по строкам он строит упорядоченный список значений, а затем преобразует их в целое число, представляющее место в списке. Это происходит для каждого индекса, поэтому, когда первый элемент добавляется в дельта-индекс, вы получаете 2 записи с сортировкой 1. Следующая запись означает, что у вас будет 2 записи с сортировкой 2 и т. д.

person James Healy    schedule 23.04.2010
comment
Хорошо. В этом случае, я думаю, мне лучше удалить дельта-индекс. У меня настроено задание cron, которое запускает функцию think_sphinx:index каждый час. Это звучит как правильный подход? - person Scott Brown; 24.04.2010
comment
Этот подход хорош, если вы довольны тем, что новые записи и обновления не появляются в результатах поиска в течение часа. - person James Healy; 24.04.2010

Я справился с этим, создав собственный метод сортировки. Вы можете создать целочисленное значение на основе некоторой части строки. Я выбрал дешевый подход и просто использовал значение char первого символа. Вы можете усложнить задачу, создав алгоритм, который преобразует больше символов во фразу. Когда я выполнял поиск с помощью другой поисковой системы, мы использовали 6 символов, и это редко выходило из строя, и это был весь наш метод заказа. Если вы сделаете это и сделаете его вторичным заказом к тому времени, это поможет решить ваши проблемы с дельтами.

person Bill Leeper    schedule 27.04.2010