MySQL模糊查询再也不用like+%了,2024年最新java基础与案例开发详解课后

复制代码

使用全文索引

MySQL 数据库支持全文检索的查询,全文索引只能在 InnoDB 或 MyISAM 的表上使用,并且只能用于创建 char,varchar,text 类型的列。

其语法如下:

MATCH(col1,col2,…) AGAINST(expr[search_modifier])

search_modifier:

{

IN NATURAL LANGUAGE MODE

| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION

| IN BOOLEAN MODE

| WITH QUERY EXPANSION

}

复制代码

全文搜索使用 MATCH() AGAINST() AGAINST()")语法进行,其中,MATCH() 采用逗号分隔的列表,命名要搜索的列。AGAINST()接收一个要搜索的字符串,以及一个要执行的搜索类型的可选修饰符。全文检索分为三种类型:自然语言搜索、布尔搜索、查询扩展搜索,下面将对各种查询模式进行介绍。

Natural Language

自然语言搜索将搜索字符串解释为自然人类语言中的短语,MATCH()默认采用 Natural Language 模式,其表示查询带有指定关键字的文档。

接下来结合demo来更好的理解Natural Language

SELECT

count(*) AS count

FROM

fts_articles

WHERE

MATCH ( title, body ) AGAINST ( ‘MySQL’ );

复制代码

image.png

上述语句,查询 title,body 列中包含 ‘MySQL’ 关键字的行数量。上述语句还可以这样写:

SELECT

count(IF(MATCH ( title, body )

against ( ‘MySQL’ ), 1, NULL )) AS count

FROM

fts_articles;

复制代码

上述两种语句虽然得到的结果是一样的,但从内部运行来看,第二句SQL的执行速度更快些,因为第一句SQL(基于where索引查询的方式)还需要进行相关性的排序统计,而第二种方式是不需要的。

还可以通过SQL语句查询相关性:

SELECT

*,

MATCH ( title, body ) against ( ‘MySQL’ ) AS Relevance

FROM

fts_articles;

复制代码

image.png

相关性的计算依据以下四个条件:

  • word 是否在文档中出现

  • word 在文档中出现的次数

  • word 在索引列中的数量

  • 多少个文档包含该 word

对于 InnoDB 存储引擎的全文检索,还需要考虑以下的因素:

  • 查询的 word 在 stopword 列中,忽略该字符串的查询

  • 查询的 word 的字符长度是否在区间 [innodb_ft_min_token_size,innodb_ft_max_token_size] 内

如果词在 stopword 中,则不对该词进行查询,如对 ‘for’ 这个词进行查询,结果如下所示:

SELECT

*,

MATCH ( title, body ) against ( ‘for’ ) AS Relevance

FROM

fts_articles;

复制代码

image.png

可以看到,'for’虽然在文档 2,4中出现,但由于其是 stopword ,故其相关性为0

参数 innodb_ft_min_token_size 和 innodb_ft_max_token_size 控制 InnoDB 引擎查询字符的长度,当长度小于 innodb_ft_min_token_size 或者长度大于 innodb_ft_max_token_size 时,会忽略该词的搜索。在 InnoDB 引擎中,参数 innodb_ft_min_token_size 的默认值是3,innodb_ft_max_token_size的默认值是84

Boolean

布尔搜索使用特殊查询语言的规则来解释搜索字符串,该字符串包含要搜索的词,它还可以包含指定要求的运算符,例如匹配行中必须存在或不存在某个词,或者它的权重应高于或低于通常情况。例如,下面的语句要求查询有字符串"Pease"但没有"hot"的文档,其中+和-分别表示单词必须存在,或者一定不存在。

select * from fts_test where MATCH(content) AGAINST(‘+Pease -hot’ IN BOOLEAN MODE);

复制代码

Boolean 全文检索支持的类型包括:

  • +:表示该 word 必须存在

  • -:表示该 word 必须不存在

  • (no operator)表示该 word 是可选的,但是如果出现,其相关性会更高

  • @distance表示查询的多个单词之间的距离是否在 distance 之内,distance 的单位是字节,这种全文检索的查询也称为 Proximity Search,如 MATCH(context) AGAINST('"Pease hot"@30' IN BOOLEAN MODE)语句表示字符串 Pease 和 hot 之间的距离需在30字节内

  • >:表示出现该单词时增加相关性

  • <:表示出现该单词时降低相关性

  • ~:表示允许出现该单词,但出现时相关性为负

  • * :表示以该单词开头的单词,如 lik*,表示可以是 liklikelikes

  • " :表示短语

下面是一些demo,看看 Boolean Mode 是如何使用的。

demo1:+ -

SELECT

FROM

fts_articles

WHERE

MATCH ( title, body ) AGAINST ( ‘+MySQL -YourSQL’ IN BOOLEAN MODE );

复制代码

上述语句,查询的是包含 ‘MySQL’ 但不包含 ‘YourSQL’ 的信息

image.png

demo2: no operator

SELECT

FROM

fts_articles

WHERE

MATCH ( title, body ) AGAINST ( ‘MySQL IBM’ IN BOOLEAN MODE );

复制代码

上述语句,查询的 ‘MySQL IBM’ 没有 ‘+’,'-'的标识,代表 word 是可选的,如果出现,其相关性会更高

image.png

demo3:@

SELECT

FROM

fts_articles

WHERE

MATCH ( title, body ) AGAINST ( ‘“DB2 IBM”@3’ IN BOOLEAN MODE );

复制代码

上述语句,代表 “DB2” ,"IBM"两个词之间的距离在3字节之内

image.png

demo4:> <

SELECT

FROM

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了

image

1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB,Cassandra,设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。

image

2、Redis学习笔记及学习思维脑图

image

3、数据面试必备20题+数据库性能优化的21个最佳实践

image

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。

[外链图片转存中…(img-FsQn5FjC-1712659432703)]

2、Redis学习笔记及学习思维脑图

[外链图片转存中…(img-o0QG0Vhm-1712659432703)]

3、数据面试必备20题+数据库性能优化的21个最佳实践

[外链图片转存中…(img-baK9Xgzw-1712659432703)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-jQ3x3Vsz-1712659432704)]

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Swing Java MySQL 模糊查询代码示例: ```java import java.awt.*; import java.awt.event.*; import java.sql.*; import javax.swing.*; public class FuzzySearch extends JFrame { private JLabel label; private JTextField textField; private JButton button; private JTextArea textArea; private String url = "jdbc:mysql://localhost:3306/mydatabase"; private String username = "root"; private String password = "password"; private Connection conn; public FuzzySearch() { setTitle("Fuzzy Search"); setSize(400, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); label = new JLabel("Enter name:"); textField = new JTextField(20); button = new JButton("Search"); textArea = new JTextArea(10, 30); panel.add(label); panel.add(textField); panel.add(button); add(panel, BorderLayout.NORTH); add(new JScrollPane(textArea), BorderLayout.CENTER); try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String name = textField.getText(); String query = "SELECT * FROM mytable WHERE name LIKE '%" + name + "%'"; try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); textArea.setText(""); while (rs.next()) { String result = rs.getString("name") + " - " + rs.getString("age") + "\n"; textArea.append(result); } } catch (SQLException ex) { ex.printStackTrace(); } } }); } public static void main(String[] args) { FuzzySearch fs = new FuzzySearch(); fs.setVisible(true); } } ``` 在这个示例中,我们创建了一个简单的 Swing 窗口,其中包含一个标签、一个文本框、一个按钮和一个文本区域。我们使用 JDBC 驱动程序连接到 MySQL 数据库,并在按钮单击事件中执行模糊查询。查询语句使用 LIKE 运算符来匹配数据库中包含用户输入的任何字符序列的名称。查询结果将显示在文本区域中。 请注意,这只是一个简单的示例,你可能需要根据你的实际需求进行修改。另外,由于这个示例使用了简单的语句连接到数据库,因此可能存在 SQL 注入攻击的风险。在生产环境中,请使用 PreparedStatement 或其他安全的方法来避免这种情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值