分析型数据库MySQL版支持通过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表中authortitlebody三列分别创建全文索引,建表语句如下。

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('浙江省杭州市');

titlebody两列中检索春天

select * from articles_test where match(title, body) against('春天');

注意事项

  • 定义了全文检索的列,仅支持match() against()操作,不支持=!=、范围查询、is nullis not null以及like等操作符。
  • 可以在检索语法中使用特殊字符+、-、&、|、!、( )、{ }、[ ]、^、"、~、*、?、:、\、/,但需要对特殊字符进行转义处理。

    例如,需要检索包含春天/美景的数据,错误写法为match(title) against('春天 / 美景' ),正确写法为match(title) against('春天 \\/ 美景')

  • 带有全文检索条件的表,不能作为left join的右表。建议将left join改为left join或者将右表改为左表。
  • 全文检索条件match() against()不能放在子查询外作为子查询后的过滤条件,示例如下:
    SELECT * FROM (
         SELECT id, substr(text, 4) AS text
          FROM tbl
      ) A
      WHERE match(A.text) against('浙江省杭州市');