全部产品
云市场

全文检索

更新时间:2019-07-10 09:24:59

分析型数据库MySQL版支持通过以下语法进行全文检索,在已经创建全文索引的col_name列中,检索words关键词。

  1. SELECT
  2. [ [ ALL | DISTINCT ] | select_expr [ AS output_name ] [, ...] ]
  3. [ FROM table_reference [, ...] ]
  4. [ 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三列分别创建全文索引,建表语句如下

  1. CREATE TABLE articles_test (
  2. id bigint COMMENT '',
  3. author varchar COMMENT '',
  4. title varchar COMMENT '',
  5. body varchar COMMENT '',
  6. comment varchar COMMENT '',
  7. create_time timestamp COMMENT '',
  8. FULLTEXT INDEX author_fulltext (author),
  9. FULLTEXT INDEX body_fulltext (body),
  10. FULLTEXT INDEX title_fulltext (title),
  11. PRIMARY KEY (id)
  12. )
  13. PARTITION BY HASH KEY(id)
  14. TABLEGROUP test_group
  15. COMMENT '';

ARTICLES_TEST表中插入如下数据

  1. insert into articles_test (id, author, title, body, comment, create_time) values(0, '张三', '浙江省杭州市春天美景推荐', '浙江省杭州市拥有美丽的西湖,是全国有名的风景胜地,春天的景色尤其迷人', '好地方', '2018-02-01 10:10:13');
  2. insert into articles_test (id, author, title, body, comment, create_time) values(1, '张三', '江西九江夏天美丽景色', '庐山风景区坐落于江西九江,北濒长江,南傍鄱阳湖,素有“匡庐奇秀甲天下山”之美称。', '好地方', '2018-09-13 10:10:13');
  3. insert into articles_test (id, author, title, body, comment, create_time) values(2, '李四', 'x省秋天美丽景色', '那山,那水,那满眼的绿,那不同于红砖白墙的色彩在华山烨烨生辉', '好地方', '2018-09-30 10:10:13');
  4. insert into articles_test (id, author, title, body, comment, create_time) values(3, '王五', '《建国大业》简介', '中华人民共和国位于亚洲东部,太平洋西岸,是工人阶级领导的、以工农联盟为基础的人民民主专政的社会主义国家,成立于1949年(己丑年)10月1日', '国富民强', '2018-10-18 10:10:13');
  5. insert into articles_test (id, author, title, body, comment, create_time) values(4, '王五', '地理信息大全', '共和国山地、高原和丘陵约占陆地面积的67%,盆地和平原约占陆地面积的33%。山脉多呈东西和东北一西南走向', '国富民强', '2018-09-30 23:10:13');
  6. insert into articles_test (id, author, title, body, comment, create_time) values(5, '李四', '浙江杭州秋天哪里风景最美', '杭州一年中最美的季节不是春天吗?这个我不辩驳,也承认杭州的春天确实很美,我也很喜欢春天这个季节的杭州城。但是,和火红般的秋季比起来,我还是更喜欢秋天的杭州城。', '好地方', '2018-02-01 10:10:13');
  7. insert into articles_test (id, author, title, body, comment, create_time) values(9, '李四', '浙江杭州千岛湖', '梅峰岛是千岛湖风景区登高观湖揽胜的最佳处,素有“不上梅峰观群岛,不识千岛真面目”', '好地方', '2018-02-01 10:10:13');

在BODY中检索浙江省杭州市

  1. select * from articles_test where match(body) against('浙江省杭州市');

在TITLE、BODY两列中检索春天

  1. 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改为join或者将右表改为左表。

  • 全文检索条件match() against()不能放在子查询外作为子查询后的过滤条件,如:

    1. select * from (
    2. select id, substr(text, 4) as text
    3. from tbl
    4. ) A
    5. where match(A.text) against('浙江省杭州市');