0

我有一个非常具体的查询,我目前正在使用 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;

此查询对每一行执行搜索,进行全面扫描,然后将匹配项除以其出现次数。这样,我得到了所有行的平均分数,从而达到了我需要的准确性。

这非常慢(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");

我这样做对吗?

4

1 回答 1

1

大多。我发现的唯一奇怪之处是在原始 mysql 中,您按职业 ID 分组。但是在构建索引时,您使用 id 加入 - 这意味着计数将是具有相同 id 的数字,而不是示例职业 ID。

我也不确定 sum(@weight) 在 sphinx 中是否有效——理论上它应该有效,但是有一些奇怪的限制,所以如果不进行测试就无法确定。

于 2012-09-22T14:36:36.087 回答