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

时间:2009-03-10 18:45:48

标签: mysql search sphinx

我正在使用Sphinx并希望实现字符串排序。我知道这可以使用属性和String Ordinals来完成,但是,我也希望实现Live Index Updates并且字符串序数不适用于多个索引。

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

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

允许我将字符串'test'的前三个字符添加到整数属性中(假设它将作为整数添加到sphinx,即使它是MySQL中的字符串)。这会给我近似排序,这可能已经足够了。

3 个答案:

答案 0 :(得分: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个多月。

答案 1 :(得分:1)

jonstjohn的回答帮了我很多忙!我使用他的代码,但没有把它变成UDF。我还将所有字符串转换为大写,因此按字母顺序排序时不会有任何奇怪之处:<​​/ p>

所以事实证明是这样的:

(..)

sql_query =

SELECT \

id \

名称\

((ORD(SUBSTRING(UPPER(name),1,1))* 16777216)\

  • (ORD(SUBSTRING(UPPER(name),2,1))* 65536)\

  • (ORD(SUBSTRING(UPPER(姓名),3,1))* 256)\

  • (ORD(SUBSTRING(UPPER(name),4,1))))as name_ord \

FROM \

mytable

sql_attr_uint = name_ord

(..)

主要和delta索引。

答案 2 :(得分:0)

请注意,例如ord('&amp;')是38而ord('a')是97所以如果你的单词是[az] [AZ]那没关系,但是如果你有类似h&amp; b的东西它会例如在集线器之前

曼弗雷德