php - 使用标题确定 SphinxQL 中可能的类别

标签 php mysql match sphinx

我有一个数据库,其中包含超过 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 并不“神奇”,它也没有“模糊匹配”功能。

但可以近似一个 :) 两个主要步骤...

  1. 从需要所有“单词”改为只需要一些,

  2. 改变排名,尝试在查询和标题之间形成最佳“交集”,获得高权重,从而“冒泡”到顶部。

然后可以只取最高的结果,并将其作为“最佳猜测”。

(实际上还有第三种,单词“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/

相关文章:

php - 当我提交表单时,它不断给我错误

php - 通过 PHP SoapClient 请求发送原始 XML

mysql - 如何将数据从可变文本文件插入到表中?

powershell - 当单词匹配时,检索其后的变化字符串

macros - 笛卡尔积匹配

javascript - 如何使用 jQuery 在每个 Ajax 请求上重新生成 session token ?

php - APC __PHP_Incomplete_Class_Name

c# - 正则表达式 - 仅匹配包含任何字母字符的字符串

mysql - codeigniter $query->result() 不工作

mysql - 去和 mysql 和 cloneTLSConfig