目录
为什么使用Elasticsearch
Elasticsearch不仅仅可以实现搜索,还能进行分析,还能有mysql不具备的【相关性匹配】。
比如我想搜索【笔记本电脑】,输入时变成【笔记电脑】,这时候Elasticsearch就智能的帮我优化为【笔记本电脑】
Elasticsearch使用场景
- 淘宝,京东等电商网站,输入关键词,系统就会给我们提供一些搜索建议
- Github使用Elasticsearch检索
- ...
windows安装Elasticsearch
windows安装Kibana
Elasticsearch配置修改
在Es的config的目录下,找到elasticsearch.yml文件,添加
//服务名
node.name: node-1
cluster.initial_master_nodes: ["node-1"]
xpack.ml.enabled: false
//开启跨域
http.cors.enabled: true
http.cors.allow-origin: /.*/
Kibana配置修改
在kibana的config的目录下,找到kibana.yml文件,添加
//修改为中文
i18n.locale: "zh-CN"
//如果有多个Es,可以配置(32行)
//elasticsearch.hosts: ["http://localhost:9200","http://localhost:9205"]
Elasticsearch 的字段
_index
含义:属于哪个索引
原则:类似数据库表的定义规则。例如图书放在book索引,用户放在user索引中,每个索引存储和搜索互不影响
定义规则:小写英文,尽量不使用特殊字符
_type
含义:类别
需要注意的是在es9将彻底删除此字段,所以现在对于此字段在不断弱化,基本都为_doc
_id
含义:唯一标识,类似数据表的主键id
可以自动生成或者手动添加
Elasticsearch 的CRUD操作
手动添加id
新增
语法:PUT /{_index}/{_type}/{_id}
PUT /{_index}/{_type}/{_id}/_create(强制创建,连续执行此命令,数据不会被覆盖)
PUT /book/_doc/1
{
"name": "vue",
"description": "前端开发框架",
"timestamp": "2021-11-24 17:08:00",
"price": 30.5
}
结果
查询
语法:GET /{_index}/{_type}/{_id}
GET /book/_doc/1
结果
修改
替换(全局替换,相当于删除之后再创建)
语法:PUT /{_index}/{_type}/{_id}
PUT /book/_doc/1
{
"name": "vue.js",
"description": "WEB前端开发框架",
"timestamp": "2021-11-24 18:08:00",
"price": 31
}
结果
更新(局部替换)
语法:POST /{_index}/_update/{_id}
POST /book/_update/1
{
"doc":{
"price": 80
}
}
//"doc"为固定语法
结果
删除
删除操作为懒删除,会在一定时机后再统一删除
语法:DELETE /{_index}/{_type}/{_id}
DELETE /book/_doc/1
结果
批量操作
语法
POST /_bulk
{"action":{"metadata"}}
{"data"}
POST /_bulk
{"create":{"_index":"book","_id":"6"}}
{"name":"html","description": "WEB前端开发框架","timestamp": "2021-11-24 18:08:00","price": 31}
{"update":{"_index":"book","_id":"1"}}
{"doc":{"price": 900}}
结果
自动生成id
新增
语法:POST /{_index}/{_type}
POST /book/_doc
{
"name": "jq",
"description": "前端",
"timestamp": "2021-11-25 17:08:00",
"price": 80
}
结果
Elasticsearch 悲观锁和乐观锁
悲观锁
有一个进程在访问时,就会对数据上锁,当对数据操作进行完毕时,才释放锁,所以无法多线程同时操作
乐观锁
通过 _version 字段对数据进行操作,可以多线程操作,但是当其中有线程阻塞,就会对之后的线程造成影响,使得其发送重复的请求
本人刚开始学习后端知识,欢迎各位大神指教