ElasticSearch的安装与使用
docker安装
docker进行安装Elasticsearch
1.拉取镜像
docker pull elasticsearch:7.6.2
2.创建实例
mkdir -p /docker/elasticsearch/config
mkdir -p /docker/elasticsearch/data
echo "http.host: 0.0.0.0" >> /docker/elasticsearch/config/elasticsearch.yml
chmod -R 777 /docker/elasticsearch/
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms256m -Xmx512m" \
-v /docker/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /docker/elasticsearch/data:/usr/share/elasticsearch/data \
-v /docker/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.6.2
docker进行安装Kibana
1.拉取镜像
docker pull kibana:7.6.2 可视化界面
2.创建实例
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://<你的虚拟机ip>:9200 -p 5601:5601 \
-d kibana:7.4.2
Elasticsearch的简单使用
倒排索引机制
进入kibana
- 进入 <你的ip地址>:5601
基础命令
GET /_cat/nodes
# 查看所有节点
GET /_cat/health
# 查看 es 健康状况
GET /_cat/master
# 查看主节点
GET /_cat/indices
# 查看所有索引
1.增加
- 在 test 索引下的 filed 类型下保存 1 号数据
PUT test/filed/1
{
"name": "Your Name"
}
2.查询
- 去查询我们刚刚插入的数据
GET test/filed/1
- 结果:
{
"_index" : "test",
"_type" : "filed",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "Your Name"
}
}
3.更新
POST test/filed/1/_update
{
"doc":{
"name": "Your Name1"
}
}
POST test/filed/1
{
"name": "Your Name2"
}
PUT test/filed/1
{
"name": "Your Name3"
}
version有什么用?
4.删除
DELETE test/filed/1
DELETE test
5.批量操作
POST test/filed/_bulk
{"index":{"_id":"1"}}
{"name":"Your Name1"}
{"index":{"_id":"2"}}
{"name":"Your Name2"}`
Elasticsearch进阶
SearchAPI
1. 通过使用 REST request URI 发送搜索参数(uri+检索参数)
GET /test_index/_search?q=name:John
2.通过使用 REST request body 来发送它们(uri+请求体)
POST /test_index/_search
{
"query": {
"match": {
"name": "John"
}
}
}
Query DSL
1. 基本语法格式
- Elasticsearch的Query DSL使用JSON格式来构建查询。基本格式如下:
{
"QUERY_NAME": {
"ARGUMENT": "VALUE",
"ARGUMENT": "VALUE",
// ...其他参数
}
}
对于字段特定的查询,格式如下:
{
"QUERY_NAME": {
"FIELD_NAME": {
"ARGUMENT": "VALUE",
// ...其他参数
}
}
}
2. 检索信息
- 查询所有文档
GET /test_index/_search
{ "query": { "match_all": {} } }
- 返回部分字段
GET /test_index/_search
{ "query": { "match_all": {} }, "_source": ["age", "balance"] }
3. Match 查询
GET /test_index/_search
{ "query": { "match": { "account_number": "20" } } }
- Match_phrase 查询
GET /test_index/_search
{ "query": { "match_phrase": { "address": "mill road" } } }
Match_phrase 查询用于短语匹配,不会对短语进行分词。
- Multi_match 查询
GET /test_index/_search
{ "query": { "multi_match": { "query": "mill", "fields": ["state", "address"] } } }
4.Bool 查询
GET /test_index/_search
{ "query": { "bool": { "must": [{ "match": { "address": "mill" } }, { "match": { "gender": "M" } }], "should": [{"match": { "address": "lane" }}], "must_not": [{"match": { "email": "baluba.com" }}] } } }
5.Filter 查询
- Filter 查询不返回相关性分数,适用于过滤操作。
GET /test_index/_search
{ "query": { "bool": { "must": [{"match": {"address": "mill"}}], "filter": {"range": {"balance": {"gte": 10000, "lte": 20000}}} } } }
6.Term 查询
- Term 查询用于精确匹配非字符串字段。
GET /test_index/_search
{ "query": { "bool": { "must": [{"term": {"age": {"value": "28"}}}, {"match": {"address": "990 Mill Road"}}] } } }
7. 聚合(Aggregations)
- 聚合用于从数据中提取统计信息。
GET /test_index/_search
{ "query": { "match": { "address": "mill" } }, "aggs": { "group_by_state": { "terms": { "field": "age" }
Mapping
1. 字段类型
- keyword:适合精确匹配,如用于过滤、排序和聚合。
- text:用于全文搜索,索引时会进行分词。
- integer、long、float、double:用于数字类型的字段。
- date:用于日期类型的字段。
- boolean:用于布尔类型的字段。
- ip、geo_point、geo_shape:用于地理信息字段。
2. 映射
#查看映射信息
GET /my-index/_mapping
#修改映射信息
#创建索引并指定映射:
PUT /my-index
{ "mappings": { "properties": { "age": { "type": "integer" }, "email": { "type": "keyword" }, "name": { "type": "text" } } } }
#添加新的字段映射:
PUT /my-index/_mapping
{ "properties": { "employee-id": { "type": "keyword", "index": false } } }
#更新映射:
#由于Elasticsearch不允许直接更新现有字段的映射,如果需要更新映射,通常的做法是创建一个新的索引并重新索引所有数据。
3.数据迁移
1.创建具有新映射的新索引。
2.使用 _reindex API将旧索引的数据迁移到新索引。
例如:
POST _reindex
{ "source": { "index": "twitter" }, "dest": { "index": "new_twitter" } }
- 对于包含多类型的旧索引,可以指定类型进行迁移:
POST _reindex
{ "source": { "index": "twitter", "type": "tweet" }, "dest": { "index": "tweets" } }