1.Docker 安装elasticsearch
1.1.创建网络
docker network create elastic
1.2.创建elasticsearch
docker run -d \
--restart=always \
--name elasticsearch \
--network elastic \
-p 9388:9200 \
-p 9389:9300 \
--privileged \
-v /opt/elasticsearch/data:/usr/share/elasticsearch/data \
-v /opt/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /opt/elasticsearch/config:/usr/share/Elasticsearch/config \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms256m -Xmx512m" \
-e "xpack.security.enabled=false" \
docker.elastic.co/elasticsearch/elasticsearch:8.15.2
1.3.创建kibana
docker run -d \
--restart=always \
--name kibana \
--network elastic \
-p 5601:5601 \
--privileged \
-v /opt/kibana/data:/usr/share/kibana/data \
-v /opt/kibana/config:/usr/share/kibana/config \
-v /opt/kibana/plugins:/usr/share/kibana/plugins \
-e ELASTICSEARCH_HOSTS=http://elasticsearch:9200 \
-e "xpack.security.enabled=false" \
docker.elastic.co/kibana/kibana:8.15.2
1.4.安装分词器
docker exec -it elasticsearch /bin/bash
bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/8.15.2
1.4.1 IK分词器有几种模式?
- ik_smart:智能切分,粗粒度
- ik_max_word:最细切分,细粒度
1.4.2 IKAnalyzer.cfg.xml配置文件(注意当前文件的编码必须是 UTF-8 格式)
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典-->
<entry key="ext_dict">ext.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典 *** 添加停用词词典-->
<entry key="ext_stopwords">stopword.dic</entry>
</properties>
2. mysql与elasticsearch的概念做一下对比:
| MySQL | Elasticsearch | 说明 |
|---|---|---|
| Table | Index | 索引(index),就是文档的集合,类似数据库的表(table) |
| Row | Document | 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式 |
| Column | Field | 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column) |
| Schema | Mapping | Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema) |
| SQL | DSL | DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD |
3.es索引的基本操作
3.1 创建索引
PUT /index_name
{
# 别名
"aliases": {
"index_alias": {}
},
# 索引设置
"settings":{
"number_of_shards":1,
"number_of_replicas":1,
"analysis":{
"analyzer":{},
"filter": {}
}
},
# mappings 字段映射
"mappings":{
"properties":{
"name":{
"type":"text"
}
}
}
}
3.1.1 Mappings 映射
-
mapping是对索引库中文档的约束,常见的mapping属性包括:
-
type:字段数据类型,常见的简单类型有:
-
字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
keyword类型只能整体搜索,不支持搜索部分内容
-
数值:long、integer、short、byte、double、float、
-
布尔:boolean
-
日期:date
-
对象:object
-
-
index:是否创建索引,默认为true
-
analyzer:使用哪种分词器
-
properties:该字段的子字段
-
3.2 删除索引
DELETE /index_name
3.3 查询索引
GET /index_name
3.4 修改索引
PUT /index_name/_setting # 修改分片
PUT /index_name/_mapping # 修改字段类型
4.es文档的基本操作
4.1 创建文档
- 创建文档 PUT带id POST带id
PUT /index_name/_doc/id # 幂等性
POST /index_name/_doc/id
{
"name":"张三",
"age":18,
"sex":1
}
- POST 创建 不带id
POST /index_name/_doc # 非幂等性
{
"name":"李四",
"age":28,
"sex":0
}
- bulk 批量创建
POST _bulk
{ "create":{"_index":"test","_id":"1"}}
{"id":"2","title":"未命名","content":"blog内容","tags":["java","python"]}
{ "create":{"_index":"test","_id":"2"}}
{"id":"3","content":"blog内容","tags":["Go","C#"]}
4.2 删除文档
- 删除 by id
DELETE /index_name/_doc/id
- 批量删除
POST _bulk
{
"delete":{"_index":"test","_id":"1"}
}
- 批量查询删除
POST /index_name/_delete_by_query
{
"query":{
"match":{
"<field_name>":"query_string"
}
}
}
4.3 查询文档
- 查询
GET /index_name/_search
{
"query":{
"match_all":{} # 匹配所有
"match":{ # 匹配文本字段
"<field_name>":"<query_string>"
}
"term":{ # 精确查询
"<field_name>":{
"value":"<exact_value>"
}
}
"range":{ # 范围查找
"<field_name>":{
"gte":<lower_bound>,
"lte":<upper_bound>
}
}
}
}
- 查询 by id
GET /index_name/_doc/id
- 多个条件
GET /index_name/_mget
{
"ids":["1","2"]
}
4.4 修改文档
- 单个修改 _seq_no=1&_primary_term=1 乐观锁,高并发下更新
POST /index_name/_update/id?_seq_no=1&_primary_term=1
{
"doc":{
"<field_name>":"<value>"
}
}
- 批量修改
POST _bulk
{ "update":{"_index":"test","_id":"2"}}
{"doc",{"age":"12"}}
- 查询修改
POST /index_name/_update_by_query
{
"query":{
"term":{
"field_name":"value"
}
},
"script":{
"source":"ctx._source.field_name=ss"
}
}