php - 如何优化mysql全文联合搜索?

标签 php mysql full-text-search

我正在进行 mysql 全文搜索。

我的数据库表article1~18000篇文章,article2~7000篇文章,article3 ~13000 篇文章。 FIELD cat 是一个 INDEX 字段

现在我想做联合搜索。有5组单词放入3个表中,匹配出结果。但处理时间为3.1213495136秒。 (我添加 microtime() 来查看需要花费多少时间)。有没有办法优化mysql全文联合搜索?谢谢。

(SELECT title,content,date FROM article1 WHERE 
(cat='novel' AND MATCH (title,content) AGAINST ('+Mary +Barnard' IN BOOLEAN MODE)) 
OR 
(cat='novel' AND MATCH (title,content) AGAINST ('+Patricia +Beer' IN BOOLEAN MODE)) 
OR 
(cat='novel' AND MATCH (title,content) AGAINST ('+Aphra +Behn' IN BOOLEAN MODE)) 
OR 
(cat='novel' AND MATCH (title,content) AGAINST ('+Judy +Blume' IN BOOLEAN MODE)) 
OR 
(cat='novel' AND MATCH (title,content) AGAINST ('+Elizabeth +Bowen' IN BOOLEAN MODE)))
UNION 
(SELECT title,content,date FROM article2 WHERE 
(MATCH (title,content) AGAINST ('+Mary +Barnard' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Patricia +Beer' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Aphra +Behn' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Judy +Blume' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content)AGAINST ('+Elizabeth +Bowen' IN BOOLEAN MODE)))
UNION 
(SELECT title,content,date FROM article3 WHERE 
(MATCH (title,content) AGAINST ('+Mary +Barnard' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Patricia +Beer' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Aphra +Behn' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Judy +Blume' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content)AGAINST ('+Elizabeth +Bowen' IN BOOLEAN MODE)))
Order By date DESC LIMIT 10

最佳答案

您应该做的第一件事是添加

Order By date DESC LIMIT 10 

进入每个子查询,因为最终不需要超过 10 个结果。

所有表中的“日期”字段还必须有索引。

alter table "TABLENAME" add index date_idx(date);

另外:

您可以通过将搜索词更改为“() | ()”来缩短并稍微加快查询速度

(SELECT title,content,date FROM article1 WHERE 
(cat='novel' AND MATCH (title,content) AGAINST ('(+Mary +Barnard) | (+Patricia +Beer) | (+Aphra +Behn) | (+Judy +Blume) | (+Elizabeth +Bowen)' IN BOOLEAN MODE)) 
Order By date DESC LIMIT 10)
UNION 
(SELECT title,content,date FROM article2 WHERE 
(MATCH (title,content) AGAINST ('(+Mary +Barnard) | (+Patricia +Beer) | (+Aphra +Behn) | (+Judy +Blume) | (+Elizabeth +Bowen)' IN BOOLEAN MODE)) 
Order By date DESC LIMIT 10)
UNION 
(SELECT title,content,date FROM article3 WHERE 
(MATCH (title,content) AGAINST ('(+Mary +Barnard) | (+Patricia +Beer) | (+Aphra +Behn) | (+Judy +Blume) | (+Elizabeth +Bowen)' IN BOOLEAN MODE)) 
Order By date DESC LIMIT 10)
Order By date DESC LIMIT 10

关于php - 如何优化mysql全文联合搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5721483/

相关文章:

sql - 语言依赖于行时的高效全文搜索

Postgresql:如何使全文搜索忽略某些标记?

php - 如何在模型中运行查询并在 Controller 中加载?

MySQL 5.7 Spring JPA 事务管理不起作用

mysql - 复制一个字段已更改的行并在 MySQL 中自动生成新的 id

postgresql - 在数据库中搜索(相似)字符串的可扩展方式

php - 更改 PHP 网站中每个页面的元数据

javascript - getJSON 返回 null

PHP - 将数据库日期时间与当前日期时间进行比较

php - 我需要 DROP TABLE IF EXISTS 然后 CREATE TABLE 然后 LOAD DATA LOCAL INFILE