我正在使用Sphinx并希望实现字符串排序。我知道这可以使用属性和String Ordinals来完成,但是,我也希望实现Live Index Updates并且字符串序数不适用于多个索引。
使用多个索引来近似字符串排序的最佳方法是什么?我正在考虑从字符串的前几个字母生成一个整数,例如:
select concat(ord('t'),ord('e'),ord('s'));
允许我将字符串'test'的前三个字符添加到整数属性中(假设它将作为整数添加到sphinx,即使它是MySQL中的字符串)。这会给我近似排序,这可能已经足够了。
答案 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)
所以事实证明是这样的:
(..)
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('&')是38而ord('a')是97所以如果你的单词是[az] [AZ]那没关系,但是如果你有类似h& b的东西它会例如在集线器之前
曼弗雷德