Thinking Sphinx - сортировка по строковому атрибуту не синхронизируется при внесении изменений - PullRequest
0 голосов
/ 24 апреля 2010

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

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

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

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

Ответы [ 2 ]

1 голос
/ 24 апреля 2010

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

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

0 голосов
/ 27 апреля 2010

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

...