SQL反模式学习笔记17 全文搜索
目标:全文搜索
使用SQL搜索关键字,同时保证快速和精确,依旧是相当地困难。
SQL的一个基本原理(以及SQL所继承的关系原理)就是一列中的单个数据是原子性的。
反模式:模式匹配
使用Like 或者正则表达式。
缺点:(1)无法使用索引,进行全表遍历,非常耗时,性能极低。
(2)有时候会返回医疗之外的结果。select * from bugs where description like '%one%',
返回结果可能是money、prone、lonely。
正则表达式可能会为单词边界提供一个模式来解决单词的匹配问题。
如何识别反模式:当出现以下情况时,可能是反模式
1、如何在like表达式的2个通配符之间插入一个变量?
2、如何写一个正则表达式来检查一个字符串是否包含多个单词、不包含一个特定的单词,或者包含给定单词的任意形式?
3、网站的搜索功能在增加了很多文档进去之后慢的不可理喻。
合理使用反模式:
1、性能总是最重要的,如果一些查询过程很少执行,就不必要花很多功夫去对它进行优化
2、使用模式匹配操作进行很复杂的查询是很困难的,但是如果你为了一些简单的需求设计这样的模式匹配,它们能帮助你用
最少的工作量获得正确的结果。
解决方案:使用工具
最好的方案就是使用特殊的搜索引擎技术,而不是SQL。
另一个方案是将结果保存起来从而减少重复的搜索开销。
1、MySQL中的全文索引:可以再一个类型为Char、varchar或者Text的列上定义一个全文索引。然后使用Match函数来搜索。
2、Oracle中的文本索引:Context、Ctxcat、Ctxxpath、Ctxule。
3、SQL Server中的全文搜索:使用Contains()操作符来使用全文索引。使用之前需要通过复杂的步骤来配置。
4、PostgreSQL的文本搜索:提供一个复杂大可大量配置的方式来将文本转换为可搜索的词汇集合,并且让这些文档能够进行
模式匹配搜索。
5、SQLite的全文搜索:使用SQLite的扩展组件来实现。
6、第三方搜索引擎:
(1)Sphinx Search:开源的搜索引擎,用于MySQL以及PostgreSQL来配套使用。
(2)Apache Lucene:是一个针对Java程序的成熟搜索引擎。
7、实现自己的搜索引擎:
使用反向索引方案:反向索引就是一个所有可能被搜索的单词列表。
(1)定义一个KeyWords表来记录所有用户搜索的关键字,然后定义一个交叉表来建立多对多的关系。
(2)将每个关键字和匹配的内容添加到交叉表中。
当有新的搜索单词,就使用like查询结果,并将结果保存到交叉表里,这样下次就不必like了。
当有新的文档入库,就需要用触发器(或者定时)去填充交叉表。
结论:不必使用SQL来解决所有问题。
SQL反模式,系列学习汇总
18、SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
2、jQuery、Vue.js、Bootstrap、ElementUI
3、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM
4、架构:DDD、ABP、SpringBoot、jFinal
5、环境:跨平台、Windows、Linux、Nginx
6、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch。
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!