Задать вопрос
  • Sphinx и натуральная сортировка

    bibendi
    @bibendi Автор вопроса
    видимо в раздел q&a профи не заглядывают =)

    предварительно решил сделать пока вот так, но уже понятно, что натуральной сортировки не видать, т.к. для этого надо полюбому сравнивать все строки с друг другом
    функция на postgresql для преобразования строки в число, может кому пригодится:
    CREATE OR REPLACE FUNCTION string_ordinal(str character varying)
      RETURNS double precision AS
    $BODY$
    DECLARE
      _norm VARCHAR;
      _ln SMALLINT;
      _max_ln SMALLINT;
      i SMALLINT;
      o DOUBLE PRECISION;
      sym CHAR;
      code SMALLINT;
      norm_code SMALLINT;
    BEGIN
      _max_ln := 100;
      _norm := regexp_replace(lower(str), '[^A-Za-z0-9а-яА-ЯЁё]', '', 'g');
      _ln = length(_norm);
      
      IF _ln < _max_ln THEN 
        _norm = rpad(_norm, _max_ln, '.');
        _ln = length(_norm);
      END IF;
      
      o := 0.0;
      FOR i IN 1.._ln LOOP
        sym := SUBSTRING(_norm FROM i FOR 1)::CHAR;
        code := ascii(sym);
        norm_code := 0;
    
        IF code = 46 THEN 
          norm_code := 1;
        END IF;
        IF code >= 48 AND code <= 57 THEN -- 0-9
          norm_code := code - 46;
        END IF;
        IF code >= 97 AND code <= 122 THEN -- a-z
          norm_code := code - (96 - 10);
        END IF;
        IF code >= 1072 AND code <= 1105 THEN -- а-я + ё
          IF code = 1105 THEN -- ё имеет код больший, чем я, это плохо
            code := 1078;
          ELSIF code > 1077 THEN
            code := code + 1;
          END IF;
          norm_code := code - (1071 - 36);
        END IF;
        
        o := o + norm_code * power(68, (_ln - i));
      END LOOP;
      
      RETURN o;
    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    
    Ответ написан
    Комментировать