2009-03-10 4 views
1

Я работаю с Sphinx и хотел бы реализовать сортировку строк. Я понимаю, что это можно сделать с помощью атрибутов и String Ordinals, однако я также хочу реализовать Live Index Updates, а строковые ординалы не работают с несколькими индексами.Sphinx: Каков наилучший способ аппроксимировать сортировку строк с помощью нескольких индексов?

Что было бы лучшим способом приблизиться к сортировке строк с помощью нескольких индексов? Я имею в виде вдоль линий генерации целого числа от первых букв строки, например:

select concat(ord('t'),ord('e'),ord('s')); 

позволит мне добавить первые три символа строки «Test» для атрибута целого (при условии, что он будет добавлен в sphinx как целое число, даже если это строка в MySQL). Это дало бы мне приблизительную сортировку, которая, вероятно, достаточно хороша.

ответ

3

я в конечном итоге создание функции MySQL, которая преобразует строку в порядковой:

CREATE DEFINER=`root`@`localhost` 
    FUNCTION `stringToOrd`(str varchar(100)) RETURNS int(11) 
READS SQL DATA 
DETERMINISTIC 
SQL SECURITY INVOKER 
BEGIN 

    DECLARE ordinal INT; 
    SELECT ((ORD(SUBSTRING(str,1,1)) * 16777216) 
     + (ORD(SUBSTRING(str,2,1)) * 65536) 
     + (ORD(SUBSTRING(str,3,1)) * 256) + (ORD(SUBSTRING(str,4,1)))) 
     into ordinal; 
    return ordinal; 
END 

функция использует только первые четыре символа строки, таким образом, сортировка будет приблизительной. Эта функция вызывается во время запроса индексирования sphinx (в конфигурационном файле sphinx). Атрибут затем используется для сортировки во время вызова поиска sphinx.

Это уже более 6 месяцев успешно работает в производственной среде.

0

Имейте в виду, что, например, Ord («&„) является 38 и Ord (“а») 97, так что если ваши слова [AZ] [AZ], что это нормально, но если у вас есть что-то вроде ч & б он будет быть перед ступицей, например

Манфреда

1

Ответ jonstjohn очень помог мне! Я использовал его код, но не попал в UDF. Я также конвертируются все строки в верхний регистр, так что не будет никаких странностей при сортировке по алфавиту:

так получается, что-то вроде этого:

(..)

sql_query =

ВЫБОР \

идентификатор \

имя \

((ДОВ (SUBSTRING (ВЕРХНИЙ (имя), 1,1)) * 16777216) \

  • (ORD (SUBSTRING (ВЕРХНИЙ (имя), 2,1)) * 65536) \

  • (Д (SUBSTRING (ВЕРХНЯЯ (имя), 3,1)) * 256) \

  • (Д (SUBSTRING (ВЕРХНЯЯ (имя), 4,1)))), как name_ord \

ОТ \

туЬаЫе

sql_attr_uint = name_ord

(..)

как для основных, так и для дельта-индексов.