Mysql表列的文本匹配和搜索

cetgtptt  于 2023-02-28  发布在  Mysql
关注(0)|答案(1)|浏览(89)

我有一个Mysql表,有几列,其中一列包含search_text VARCHAR。该表记录数据的频率很高,包含数百万条记录。
我想搜索一组单词/文本,应该匹配所有行中的每个或所有单词。我们可以传递一个日期范围来限制范围。
我在Mysql上试过FTS,但是React很慢。
表格结构:

CREATE TABLE IF NOT EXISTS `textsearch` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `duration` bigint(20) DEFAULT NULL,
  `timer` datetime DEFAULT NULL,
  `search_text` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `title` (`search_text`)
)

要搜索文本:
["单词1"、"单词2"、"单词3"、"组合单词"]
查询:

SELECT  * FROM textsearch t WHERE MATCH (t.search_text) AGAINST ('word1' IN BOOLEAN MODE)   and t.timer BETWEEN 'date1' AND 'date2';

这将是一个单词/文本数组,需要搜索/匹配这些单词/文本,对于所有匹配项,我们必须对textsearch表中的duration列求和。

6ju8rftf

6ju8rftf1#

您可以使用HAVING MATCHAGAINST
+代表与
-代表非
[no运算符]隐含OR
“some words”,是查找包含确切短语“some words”的行

WITH cte as (
  SELECT *
  FROM textsearch t 
  WHERE t.timer BETWEEN '2022-02-01' AND '2022-02-28'
  HAVING MATCH (t.search_text) AGAINST ('+lorem +semper +"Vivamus congue"' IN BOOLEAN MODE)
)
select sum(duration)
from cte;

Demo here
Docs

相关问题