AnalyticDB MySQL版 2.0支持通过SQL语法进行全文检索,本文介绍如何在已经创建全文索引的col_name
列中检索关键词。
语法
SELECT
[ [ ALL | DISTINCT ] | select_expr [ AS output_name ] [, ...] ]
[ FROM table_reference [, ...] ]
[ WHERE match(column_name[, …]) against('words') ]
说明
match(column_name[, …])
已经在建表语句中创建了全文索引的列的名字,可以填写一个列名也可以填写多个列名。比如match(body)
表示只在body
这一列中进行检索,match(title, body)
表示在title
、body
两列中分别进行检索。against('words')
进行检索的关键词,比如against(’浙江省杭州市’)
表示要检索浙江省杭州市
。
示例
对articles_test
表中author
、title
和body
三列分别创建全文索引,建表语句如下。
CREATE TABLE articles_test (
id bigint COMMENT '',
author varchar COMMENT '',
title varchar COMMENT '',
body varchar COMMENT '',
comment varchar COMMENT '',
create_time timestamp COMMENT '',
FULLTEXT INDEX author_fulltext (author),
FULLTEXT INDEX body_fulltext (body),
FULLTEXT INDEX title_fulltext (title),
PRIMARY KEY (id)
)
PARTITION BY HASH KEY(id)
TABLEGROUP test_group
COMMENT '';
使用如下命令在articles_test
表中插入数据。
INSERT INTO articles_test (id, author, title, body, comment, create_time) VALUES(0, '张三', '浙江省杭州市春天美景推荐', '浙江省杭州市拥有美丽的西湖,是全国有名的风景胜地,春天的景色尤其迷人', '好地方', '2018-02-01 10:10:13');
INSERT INTO articles_test (id, author, title, body, comment, create_time) VALUES(1, '张三', '江西九江夏天美丽景色', '庐山风景区坐落于江西九江,北濒长江,南傍鄱阳湖,素有“匡庐奇秀甲天下山”之美称。', '好地方', '2018-09-13 10:10:13');
INSERT INTO articles_test (id, author, title, body, comment, create_time) VALUES(2, '李四', 'x省秋天美丽景色', '那山,那水,那满眼的绿,那不同于红砖白墙的色彩在华山烨烨生辉', '好地方', '2018-09-30 10:10:13');
INSERT INTO articles_test (id, author, title, body, comment, create_time) VALUES(3, '王五', '《建国大业》简介', '中华人民共和国位于亚洲东部,太平洋西岸,是工人阶级领导的、以工农联盟为基础的人民民主专政的社会主义国家,成立于1949年(己丑年)10月1日', '国富民强', '2018-10-18 10:10:13');
INSERT INTO articles_test (id, author, title, body, comment, create_time) VALUES(4, '王五', '地理信息大全', '共和国山地、高原和丘陵约占陆地面积的67%,盆地和平原约占陆地面积的33%。山脉多呈东西和东北一西南走向', '国富民强', '2018-09-30 23:10:13');
INSERT INTO articles_test (id, author, title, body, comment, create_time) VALUES(5, '李四', '浙江杭州秋天哪里风景最美', '杭州一年中最美的季节不是春天吗?这个我不辩驳,也承认杭州的春天确实很美,我也很喜欢春天这个季节的杭州城。但是,和火红般的秋季比起来,我还是更喜欢秋天的杭州城。', '好地方', '2018-02-01 10:10:13');
INSERT INTO articles_test (id, author, title, body, comment, create_time) VALUES(9, '李四', '浙江杭州千岛湖', '梅峰岛是千岛湖风景区登高观湖揽胜的最佳处,素有“不上梅峰观群岛,不识千岛真面目”', '好地方', '2018-02-01 10:10:13');
在body
列中检索包含浙江省杭州市
的数据,语句如下:
SELECT * FROM articles_test WHERE MATCH(body) AGAINST('浙江省杭州市');
返回结果如下:
+----+-------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+-------------------+
|id |author |title |body |comment |create_time |
+----+-------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+-------------------+
|5 |李四 |浙江杭州秋天哪里风景最美 |杭州一年中最美的季节不是春天吗?这个我不辩驳,也承认杭州的春天确实很美,我也很喜欢春天这个季节的杭州城。但是,和火红般的秋季比起来,我还是更喜欢秋天的杭州城。 |好地方 |2018-02-01 10:10:13|
|0 |张三 |浙江省杭州市春天美景推荐 |浙江省杭州市拥有美丽的西湖,是全国有名的风景胜地,春天的景色尤其迷人 |好地方 |2018-02-01 10:10:13|
在title
和body
列中检索包含春天
的数据,语句如下:
SELECT * FROM articles_test WHERE MATCH(title, body) AGAINST('春天');
返回结果如下:
+----+-------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+-------------------+
|id |author |title |body |comment |create_time |
+----+-------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+-------------------+
|5 |李四 |浙江杭州秋天哪里风景最美 |杭州一年中最美的季节不是春天吗?这个我不辩驳,也承认杭州的春天确实很美,我也很喜欢春天这个季节的杭州城。但是,和火红般的秋季比起来,我还是更喜欢秋天的杭州城。 |好地方 |2018-02-01 10:10:13|
|0 |张三 |浙江省杭州市春天美景推荐 |浙江省杭州市拥有美丽的西湖,是全国有名的风景胜地,春天的景色尤其迷人 |好地方 |2018-02-01 10:10:13|
注意事项
- 定义了全文检索的列,仅支持
match() against()
操作,不支持=
、!=
、between
、is null
、is not null
以及like
等操作符。 - 检索语法支持使用特殊字符
+、-、&、|、!、( )、{ }、[ ]、^、"、~、*、?、:、\、/
,但需要对特殊字符进行转义处理。例如,需要检索包含
春天/美景
的数据,错误写法为match(title) against('春天 / 美景' )
,正确写法为match(title) against('春天 \\/ 美景')
。 - 设置了全文索引列的表,不能作为
left join
的右表。建议将left join
改为right join
或者将右表改为左表。 - 全文检索条件
match() against()
不能放在子查询外作为子查询后的过滤条件,即如下查询是不支持的:SELECT * FROM ( SELECT id, substr(text, 4) AS text FROM tbl ) A WHERE match(A.text) against('浙江省杭州市');