【问题标题】:Sphinx: What is the best way to approximate string sorting with multiple indexes?Sphinx:使用多个索引近似字符串排序的最佳方法是什么?
【发布时间】:2010-10-12 12:23:46
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: mysql search sphinx


    【解决方案1】:

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

    原来是这样的:

    (..)

    sql_query =

    选择\

    身份证\

    名称\

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

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

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

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

    来自\

    我的表

    sql_attr_uint = name_ord

    (..)

    主索引和增量索引。

    【讨论】:

      【解决方案2】:

      我最终创建了一个将字符串转换为序数的 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 个多月。

      【讨论】:

        【解决方案3】:

        请注意,例如 ord('&') 是 38,而 ord('a') 是 97,所以如果你的话是 [az][AZ] 没关系,但如果你有类似 h&b 的东西,它将在 hub 之前比如

        曼弗雷德

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-23
          • 2011-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-07
          • 2017-01-06
          相关资源
          最近更新 更多