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

Mysql Sphinx:用多个索引近似字符串排序的最佳方法是什么?,mysql,search,sphinx,Mysql,Search,Sphinx,我正在使用并希望实现字符串排序。我知道这可以通过使用属性来实现,但是,我还想实现字符串序数,而字符串序数不适用于多个索引 用多个索引近似字符串排序的最佳方法是什么?我想从字符串的前几个字母生成一个整数,例如: select concat(ord('t'),ord('e'),ord('s')); 允许我将字符串“test”的前三个字符添加到integer属性中(假设它将作为整数添加到sphinx,即使它在MySQL中是字符串)。这将给我提供大致的排序,这可能已经足够好了。请注意,例如,ord('

我正在使用并希望实现字符串排序。我知道这可以通过使用属性来实现,但是,我还想实现字符串序数,而字符串序数不适用于多个索引

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

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

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

请注意,例如,ord('&')是38,ord('a')是97,所以如果您的单词是[a-z][a-z],这没关系,但如果您有类似h&b的单词,它将位于hub之前


曼弗雷德

请注意,例如,ord('&')是38,ord('a')是97,所以如果你的单词是[a-z][a-z],那没关系,但如果你有类似h&b的单词,它将位于hub之前


Manfred

我最终创建了一个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个多月。

我最终创建了一个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个多月。

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

结果是这样的:

(……)

sql\u查询=

选择\

id\

姓名\

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

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

  • (ORD(子字符串(上(名称),3,1))*256)

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

来自

我的桌子

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

(……)


主指数和增量指数。

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

结果是这样的:

(……)

sql\u查询=

选择\

id\

姓名\

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

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

  • (ORD(子字符串(上(名称),3,1))*256)

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

来自

我的桌子

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

(……)

主索引和增量索引