目录
对于一个电商项目来说,商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的,底层原理是B+树索引,存在很多问题。
首先,查询效率较低。由于数据库模糊查询不走索引,在数据量较大的时候,查询性能很差。需要注意的是,数据库模糊查询随着表数据量的增多,查询性能的下降会非常明显,而搜索引擎的性能则不会随着数据增多而下降太多。
其次,功能单一。数据库的模糊搜索功能单一,匹配条件非常苛刻,必须恰好包含用户搜索的关键字。而在搜索引擎中,用户输入出现个别错字,或者用拼音搜索、同义词搜索都能正确匹配到数据。综上,在面临海量数据的搜索,或者有一些复杂搜索需求的时候,推荐使用专门的搜索引擎来实现搜索功能。
目前在行业内elasticsearch最为流行。elasticsearch是一款非常强大的开源搜索引擎,支持的功能非常多。day08-Elasticsearch - 飞书云文档
1.初识elasticsearch
Elasticsearch是由elastic公司开发的一套搜索引擎技术,它是elastic技术栈中的一部分。完整的技术栈包括:
- Elasticsearch:用于数据存储、计算和搜索
- Logstash/Beats:用于数据收集
- Kibana:用于数据可视化
整套技术栈被称为ELK
安装:Elasticsearch01-02.初识ES-认识和安装ES_哔哩哔哩_bilibili
2.RESTful风格
在后端开发中,RESTful 风格(Representational State Transfer)是一种常用于设计网络应用程序的架构风格。它基于 HTTP 协议,使用 HTTP 方法(如 GET、POST、PUT、DELETE 等)来操作资源,以实现客户端与服务器之间的通信。
RESTful 风格的关键概念:
资源(Resources):在 RESTful 架构中,"资源" 是指可以通过 URI 来标识的对象或数据实体。例如,/users
代表用户资源,/products
代表产品资源;每个资源都有一个唯一的 URI,客户端通过访问这些 URI 来获取、修改或删除资源
HTTP 方法:RESTful 风格依赖于 HTTP 方法来定义对资源的操作:
- GET:用于获取资源。请求时不应有副作用
- POST:用于创建新的资源。一般用于提交表单或上传数据
- PUT:用于更新现有资源。将一个完整的资源替换成新的版本
- UPDATE:用于部分更新现有资源,仅更新部分数据
- DELETE:用于删除资源
每个 HTTP 方法与相应的操作(如获取、创建、修改、删除)对应
无状态性(Stateless):每个请求都包含了足够的信息,使得服务器能够理解并响应请求。服务器不需要保存客户端的状态。每个请求都是独立的,且服务器不保存关于客户端的信息(例如,用户认证信息),这些信息通常会包含在每个请求的头部或请求体中
统一接口(Uniform Interface):RESTful 风格要求有统一的接口规范,保证了不同客户端可以使用相同的接口与服务器通信。这种统一性使得系统的扩展和维护变得更加容易。例如,资源的 URI 格式应保持一致,HTTP 动词的使用应具有一致性。
表现层(Representation):在 REST 中,资源的状态通过某种形式的表现(如 JSON、XML 等)返回给客户端。客户端通过与这些表现层交互来操作资源。例如,获取某个用户的信息,返回的可能是该用户的 JSON 数据。
3.倒排索引——根据分词建立索引
文档和词条:每一条数据就是一个文档,对文档中的内容分词,得到的词语就是词条
正向索引:基于文档id创建索引,查询词条时必须先找到文档,而后判断是否包含词条
倒排索引:对文档内容分词,对词条创建索引,并记录词条所在文档的id。查询时先根据词条查询到文档id,而后根据文档id查询文档
4.IK分词器
中文分词往往需要根据语义分析,比较复杂,这就需要用到中文分词器,例如IK分词器。IK分词器是林良益在2006年开源发布的,其采用的正向迭代最细粒度切分算法一直沿用至今。其安装的方式也比较简单,只要将资料提供好的分词器放入elasticsearch的插件目录即可: