全文搜索按相关性分数排序

时间:2016-09-19 10:56:09

标签: mysql sql full-text-search query-optimization

表格 usersfull text search列上的username索引。

查询:

SELECT 
    MATCH (username) AGAINST ('shaharyar' IN NATURAL LANGUAGE MODE) AS `score`, 
    uid, 
    first_name, 
    username, 
    `status`, 
    created
FROM users
WHERE 
    MATCH (username) AGAINST ('shaharyar' IN NATURAL LANGUAGE MODE) AND 
    uid <> 164125 -- to prevent self profile search
ORDER BY 
    score DESC, 
    created DESC

问题: Match子句会执行2次吗?

我知道MySQL默认按score 降序排序,但在这里我需要双重排序条件,这就是我选择列的原因。

解释扩展:

+----+-------------+-------+----------+------------------+----------+---------+-----+------+----------+-----------------------------+
| id | select_type | table |   type   |  possible_keys   |   key    | key_len | ref | rows | filtered |            Extra            |
+----+-------------+-------+----------+------------------+----------+---------+-----+------+----------+-----------------------------+
|  1 | SIMPLE      | users | fulltext | PRIMARY,username | username |       0 |     |    1 |      100 | Using where; Using filesort |
+----+-------------+-------+----------+------------------+----------+---------+-----+------+----------+-----------------------------+

表中约有150K +记录。

2 个答案:

答案 0 :(得分:0)

这样。这通常使用self.mapView.currentPositionView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"picture"]]; 子句编写:

having

答案 1 :(得分:0)

是和否。

WHERE MATCH...将被执行若干次,从而“过滤”不匹配的行。只剩下的行需要第二次执行MATCH

另一方面,

HAVING必须为所有行执行MATCH(除了具有该uid的行),构建包含所有这些行的临时表。只有这样HAVING才能进行过滤。

因此,即使在MATCH版本中执行HAVING次数较少,查询也可能运行得更快。

FULLTEXT(username),不是吗?

为什么,为什么,对一个单词使用全文查询?