我目前正在使用MySQL进行非常具体的查询
我的表结构是:
id : INT, primary KeY, AUTO_INCREMENT
occupationID : INT
alias : VARCHAR(255)
然后,我做了
SELECT occupationID, (MATCH(alias) AGAINST ('Web Developer' IN NATURAL LANGUAGE MODE) / count(*)) as score FROM aliases group by occupationID order by score DESC LIMIT 0,2;
此查询对每个ROW执行搜索,执行完整扫描,并根据匹配次数除以匹配项。这样,我获得了所有行的平均分数,给了我所需的准确性。
速度非常慢(20秒),记录表为50k。 (我并不感到惊讶,MySQL全文很慢......)。
使用Sphinx,我正在考虑使用此查询构建索引:
select id,occupationID,alias, (SELECT count(*) from aliases AS A WHERE B.occupationID=A.occupationID) as nb from aliases AS B
然后做一个
$sphinx->setSelect("@id, sum(@weight)/nb as score");
$sphinx->setGroupBy("occupationID", GROUP_BY_ATTR, "score DESC");
和
$sphinx->query("Web Developer");
我这样做了吗?
答案 0 :(得分:1)
清除。我发现的唯一的异味是,在原始的mysql中,你通过OccupID分组。但在构建索引时,您使用id加入 - 这意味着count将是具有相同id的数字,而不是样本的占用ID。
我也不确定sum(@weight)是否适用于sphinx - 理论上它应该是,但是有一些奇怪的限制,所以不能确定没有测试。