我有一个拥有超过6000万条SphinxQL 2.1.1索引记录的数据库。每个记录都有一个标题和一个catid(除其他外)。当一条新记录被插入到数据库中时,我试图让sphinx根据标题中的文本猜测catid。
我设法让它适用于单词这样的话:
SELECT @groupby, catid, count(*) c FROM sphinx WHERE MATCH('*LANDLORDS*') group by catid order by c desc
然而,实际的标题可能是这样的:
Looking for Landlords - Long term lease - No fees!!!
有没有办法将整个标题字符串转储到sphinx并让它分解每个单词并执行某种模糊匹配,返回最可能的类别?
答案 0 :(得分:2)
因为这样的狮身人面像不是神奇的,并且它没有“模糊匹配”。功能。
但可以近似一个:)两个主要步骤......
从要求所有单词'变为只需要一些,
改变排名,努力做出最好的交叉点。在查询和标题之间,获得高权重,因此“泡沫”#39;到顶部。
然后可以采取最佳结果,并将其作为最佳猜测'。
(实际上有三分之一,单词谎言'''可能导致大量误报,所以可能想要排除它们,或者使用停用词索引,或者只是从查询中剥离)
此类查询的原型可能类似于
SELECT catid FROM sphinx WHERE MATCH('"Looking Landlords Long term lease No fees"/1') OPTION ranker=wordcount LIMIT 1;
使用仲裁来影响匹配,并选择不同的排名。
将此版本与分组一起使用,可能不会起作用,因为它会包含许多低质量的匹配。虽然可以尝试使用avg或sum来获得复合权重?
SELECT SUM(WEIGHT()) as w, catid FROM sphinx WHERE MATCH('"Looking Landlords Long term lease No fees"/1') GROUP BY catid ORDER BY w DESC OPTION ranker=wordcount LIMIT 1
有很多方法可以调整这个......
您可以尝试其他的游戏玩家,例如matchany。甚至一些自定义排名表达式。
或者更改法定人数,例如,需要1个字的等级,可能会导致至少少数。
或者如果可以提取短语,例如
'"看房东" | "长期租约" | "没有费用"'
可能有效吗?
也可以而不是仅仅取得最高结果,取得前5-10个结果,并将其全部显示给用户,因为结果非常接近。