代码之家  ›  专栏  ›  技术社区  ›  jonstjohn

Sphinx:用多个索引近似字符串排序的最佳方法是什么?

  •  1
  • jonstjohn  · 技术社区  · 16 年前

    Sphinx 并希望实现字符串排序。我知道这可以通过使用属性和 String Ordinals 但是,我也想实现 Live Index Updates 和字符串序号不适用于多个索引。

    用多个索引近似字符串排序的最佳方法是什么?我想从字符串的前几个字母生成一个整数,例如:

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

    允许我将字符串“test”的前三个字符添加到integer属性中(假设它将作为整数添加到sphinx,即使它在MySQL中是字符串)。这将为我提供大致的排序,这可能已经足够好了。

    3 回复  |  直到 16 年前
        1
  •  3
  •   jonstjohn    15 年前

    我最终创建了一个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搜索调用期间的排序。

        2
  •  1
  •   Kevin Dubois    13 年前

    约翰的回答对我帮助很大!我使用了他的代码,但没有将其编入UDF。我还将所有字符串转换为大写,这样在按字母顺序排序时就不会有任何奇怪之处:

    结果是这样的:

    sql\u查询=

    挑选\

    身份证\

    名字\

    ((ORD(子字符串(大写(名称),1,1))*16777216)\

    • (ORD(子字符串(上(名称),2,1))*65536)\

    • (ORD(子字符串(大写(名称),4,1)))作为名称\

    从\

    空白表

    sql\u attr\u uint=name\u ord

    (..)

        3
  •  0
  •   Manfred Dardenne    16 年前

    请注意,例如,ord(“&”)是38,ord('a')是97,因此,如果您的单词是[a-z][a-z],这是可以的,但如果您有类似h&b例如,它将在集线器之前

    曼弗雷德