我有一个数据库,其中包含超过 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 中,让它分解每个单词并执行某种模糊匹配,返回最有可能的类别?
最佳答案
不过这样的 sphinx 并不“神奇”,它也没有“模糊匹配”功能。
但可以近似一个 :) 两个主要步骤...
从需要所有“单词”改为只需要一些,
改变排名,尝试在查询和标题之间形成最佳“交集”,获得高权重,从而“冒泡”到顶部。
然后可以只取最高的结果,并将其作为“最佳猜测”。
(实际上还有第三种,单词“for”和“the”很可能会导致大量误报,因此可能需要排除它们,或者在索引上使用停用词,或者只是从查询中删除 then)
这种查询的原型(prototype)可能是这样的
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 个词,可能会导致至少几个。
或者如果可以提取词组,eg
'《找地主》 | “长期租赁” | “不收费”'
可能有用吗?
也可以不只取前 5-10 个结果,而是将它们全部显示给用户,以弥补结果非常近似的事实。
关于php - 使用标题确定 SphinxQL 中可能的类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24349737/