说明

  • 模糊查询替代方案。引入全文检索字段进行模糊查询
  • 目前简单使用,不再封装复杂使用情况

创建全文索引

1
2
3
4
5
6
7
# 方式一
create fulltext index $index_name on $table_name($column) with parser ngram;
# create fulltext index $index_name on $table_name($column1, $column2) with parser ngram;

# 方式二
alter table $table_name add fulltext index $index_name($column) with parser ngram;
# alter table $table_name add fulltext index $index_name($column1, $column2) with parser ngram;

删除全文索引

1
2
3
4
5
# 方式一
drop index $index_name on $table_name;

# 方式二
alter table $table_name drop index $index_name;

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建全文索引
create fulltext index mock_event_index_intro on mock_event(intro) with parser ngram;

# 查找同时包含“范立果”和“黑石崖”两个词的记录
# 这种模式对短语查询的支持不如布尔模式直接
select * from mock_event where match(intro) against('范立果 黑石崖');

# 查询会返回包含“范立果”或“黑石崖”,或者两者都包含的记录
# 此模式允许更精细的控制,比如使用+(必须包含)、-(必须不包含)、>(大于某个词频)、<(小于某个词频)、(和)(用于组合条件)等操作符来构建复杂的查询条件
select * from mock_event where match(intro) against('范立果 黑石崖' IN BOOLEAN MODE);

# 从mock_event表中找出那些intro列的内容与关键词“范立果”和“黑石崖”在自然语言意义上最相关的所有记录,并返回这些记录的所有列。
# 查询扩展模式
SELECT * FROM mock_event
WHERE MATCH(intro) AGAINST('范立果 黑石崖' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION);

# 自然语言模式,与查询扩展模式类似
SELECT * FROM mock_event
WHERE MATCH(intro) AGAINST('范立果 黑石崖' IN NATURAL LANGUAGE MODE);

java 中模糊查询

1
2
3
// 事件描述字段模糊查询
queryWrapper.lambda().apply(StrUtil.isNotBlank(mockEvent.getIntro()),
"match(intro) against('"+ mockEvent.getIntro() +"')");