IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Elasticsearch基础命令总结 -> 正文阅读

[开发工具]Elasticsearch基础命令总结

1. Windows下载安装elasticsearch

① 下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-4-2

② 修改elasticsearch.yml文件:

 cluster.name: my-application
 path.data: D:/install/elasticsearch-7.4.2-windows-x86_64/elasticsearch-7.4.2/data
 path.logs: D:/install/elasticsearch-7.4.2-windows-x86_64/elasticsearch-7.4.2/logs

③ 配置环境变量:D:\install\elasticsearch-7.4.2-windows-x86_64\elasticsearch-7.4.2\bin

④ 下载ik分词器:https://github.com/medcl/elasticsearch-analysis-ik/releases?after=v7.4.2

⑤ 解压ik分词器,必须解压到D:\install\elasticsearch-7.4.2-windows-x86_64\elasticsearch-7.4.2\plugins\ik目录下

⑥ 点击elasticsearch.bat启动elasticsearch服务,并访问:localhsot:9200

⑦ kibana下载地址:https://www.elastic.co/cn/downloads/past-releases/kibana-7-4-2

⑧ 修改kibana.yml文件(不必须):

 server.port: 5601
 server.host: "localhost"
 elasticsearch.hosts: ["http://localhost:9200"]
 i18n.locale: "zh-CN"

⑨ 点击kibana.bat启动kibana服务(一定要先启动es):

⑦ kibana下载地址:https://www.elastic.co/cn/downloads/past-releases/kibana-7-4-2

⑧ 修改kibana.yml文件(不必须):

 server.port: 5601
 server.host: "localhost"
 elasticsearch.hosts: ["http://localhost:9200"]
 i18n.locale: "zh-CN"

⑨ 点击kibana.bat启动kibana服务(一定要先启动es)

⑩ 访问localhost:5601

2. elasticsearc查询命令

索引—数据库、类型—表、文档—一条数据

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-search.html

2.1 _cat命令

GET /_cat/nodes: 查看所有节点
GET /_cat/health: 查看 es 健康状况
GET /_cat/master: 查看主节点
GET /_cat/indices: 查看所有索引 show databases;  

2.2 文档操作

① 添加文档

保存一个数据, 保存在哪个索引(数据库)的哪个类型(表)下, 指定用哪个唯一标识,POST可以新增可以修改。 如果不指定 id, 会自动生成 id。 指定 id 就会修改这个数据, 并新增版本号;PUT 可以新增可以修改。 PUT 必须指定 id; 由于 PUT 需要指定 id, 我们一般都用来做修改 操作 。

# 添加文档
# 在数据库book下的novel表中添加一条id=1的数据
# 在索引book下的novel类型中添加一条id=1的文档
PUT customer/external/1
{
  "name":"johe"
}

② 查询文档

# 查询文档
GET /book/novel/1

③ 修改文档

带有_update和不带有_update的语法区别:

#  修改文档
#  请求体需要加上doc
POST customer/external/1/_update
{"doc":{"name": "John Doew"}}

# 请求体带不带doc都可以
POST customer/external/1
{"name": "John Doe2"}

PUT customer/external/1
{"name": "John Doe"}

Post请求方式可以带有_update,而Put请求不可以

Post请求带有_update时,会对比源文档数据, 如果相同不会有什么操作, 文档 version 不增加 ;

PUT 操作总会将数据重新保存并增加 version 版本;

Put和Post都可以在更新时增加属性;

④ 删除文档

# 删除文档
DELETE customer/external/1  
# 删除索引
ELETE customer				

⑤ 批量处理文档

POST customer/external/_bulk 
{"index":{"_id":"1"}} 
{"name": "John Doe" } 
{"index":{"_id":"2"}} 
{"name": "Jane Doe" }

语法格式:
{ action: { metadata }} 
{ request body } 
{ action: { metadata }} 
{ request body } 

复杂实例:
POST /_bulk
{"create": { "_index": "website", "_type": "blog", "_id": "123"}}
{"title": "My first blog post" }
{"index": { "_index": "website", "_type": "blog" }}
{"title": "My second blog post" }
{"update": { "_index": "website", "_type": "blog", "_id": "123"}}
{"doc" : {"title" : "My updated blog post"} }
{"delete": { "_index": "website", "_type": "blog", "_id": "123"}}

导入测试数据:https://github.com/elastic/elasticsearch/blob/6d42e197b82aa1c98a1796d547e373f7029ee27a/docs/src/test/resources/accounts.json

2.3 es检索方式

ES 支持两种基本方式检索 :
一个是通过使用 REST request URI 发送搜索参数(uri+检索参数)
另一个是通过使用 REST request body 来发送它们(uri+请求体)

① uri+检索参数:

GET bank/_search    检索 bank 下所有信息, 包括 type 和 docs
GET bank/_search?q=*&sort=logon_id:asc  请求参数方式检索

GET bank/_search 响应结果解释: 
	took - Elasticsearch 执行搜索的时间( 毫秒) 
	time_out - 告诉我们搜索是否超时 
	_ shards - 告诉我们多少个分片被搜索了, 以及统计了成功/失败的搜索分片 
	hits - 搜索结果 
	hits.total - 搜索结果 
	hits.hits - 实际的搜索结果数组( 默认为前 10 的文档) 
	sort - 结果的排序 key( 键) ( 没有则按 score 排序) 
	score 和 max_score –相关性得分和最高得分( 全文检索用)

② uri+请求体:

GET bank/_search
{
    # 查询条件
    "query": {
        "match_all": {}
    },
	# 排序条件
    "sort": [
        {
            "account_number": {
                "order": "desc"
            }
        }
    ]
}

2.4 match_all 查询所有

#  query 定义如何查询,
#  match_all 查询类型【代表查询所有的所有】 , es 中可以在 query 中组合非常多的查询类型完成复杂查询
#  除了query参数之外, 我们也可以传递其它的参数以改变查询结果。 如 sort,size
#  from+size 限定, 完成分页功能
#  sort 排序, 多字段排序, 会在前序字段相等时后续字段内部排序, 否则以前序为准
GET bank/_search
{
    # 查询条件
    "query": {
        "match_all": {}
    },
	# 分页条件
    "from": 0,
    "size": 5,
	# 排序条件
    "sort": [
        {
            "account_number": {
                "order": "desc"
            }
        }
    ]
}

返回部分检索字段:

GET bank/_search
{
    "query": {"match_all": {}
             },
    "from": 0,
    "size": 5,
    "_source": ["age","balance"]
}

2.5 match 精确查询/模糊查询

① 基本类型( 非字符串) , 精确匹配 :

# match 返回 account_number=20GET bank/_search
{
    "query": {
        "match": {
            "account_number": "20"
        }
    }
}

② 字符串, 全文检索 :

# 最终查询出 address 中包含 mill 单词的所有记录
# match 当搜索字符串类型的时候, 会进行全文检索, 并且每条记录有相关性得分。
GET bank/_search
{
    "query": {
        "match": {
            "address": "mill"
        }
    }
}

③ 字符串, 多个单词( 分词+全文检索) :

#最终查询出 address 中包含 mill 或者 lane 或者 mill lane 的所有记录, 并给出相关性得分
GET bank/_search
{
    "query": {
        "match": {
            "address": "mill lane"
        }
    }
}

2.6 match_phrase 短语匹配,不分词

# 查询出完整包含 mill lane的记录
GET bank/_search
{
    "query": {
        "match_phrase": {
            "address": "mill lane"
        }
    }
}

2.7 mlti_match多字段匹配

# state 或者 address 包含 mill
GET bank/_search
{
    "query": {
        "multi_match": {
            "query": "mill",
            "fields": ["state","address"]
        }
    }
}

2.8 bool复合查询

bool 用来做复合查询:复合语句可以合并 任何 其它查询语句, 包括复合语句

must: 必须达到 must 列举的所有条件

GET bank/_search
{
    "query": {
        "bool": {
            "must": [
                { "match": { "address": "mill" } },
                { "match": { "gender": "M" } }
            ]
        }
    }
}

must_not: 必须不是指定的情况

should: 应该达到 should 列举的条件, 如果达到会增加相关文档的评分, 并不会改变查询的结果。 如果 query 中只有 should 且只有一种匹配规则, 那么 should 的条件就会被作为默认匹配条件而去改变查询结果

# address 包含 mill, 并且 gender 是 M, 如果 address 里面有 lane 最好不过, 但是 email 必须不包含 baluba.com
GET bank/_search
{
    "query": {
        "bool": {
            "must": [
                { "match": { "address": "mill" } },
                { "match": { "gender": "M" } }
            ],
            "should": [
                {"match": { "address": "lane" }}
            ],
            "must_not": [
                {"match": { "email": "baluba.com" }}
            ]
        }
    }
}

2.9 filter过滤

must,should,must_not都会计算相关性得分 ,分数越高,文档就越符合您的搜索条件。默认情况下,Elasticsearch返回按这些相关性分数排名的文档。但并不是所有的查询都需要产生分数, 特别是那些仅用于 “filtering”(过滤) 的文档。 为了不计算分数 Elasticsearch 会自动检查场景并且优化查询的执行 。

# 会计算分数
GET bank/_search
{
    "query": {
        "bool": {
            "must": {
                "range": {
                    "balance": {
                        "gte": 10000,
                        "lte": 20000
                    }
                }
            }
        }
    }
}
# 不会计算分数
GET bank/_search
{
    "query": {
        "bool": {
            "filter": {
                "range": {
                    "balance": {
                        "gte": 10000,
                        "lte": 20000
                    }
                }
            }
        }
    }
}

2.10 term查询

term的查询是代表完全匹配,搜索之前不会对你搜索的关键字进行分词,对你的关键字去文档分词库中去匹配内容。和 match 一样。 匹配某个属性的值。 全文检索字段用 match, 其他非 text 字段匹配用 term。

# 如果是精确值(age,balance等数字)字段,建议使用term,如果是全文检索字段,建议使用match
GET bank/_search
{
    "query": {
        "bool": {
            "must": [
                {"term": {
                    "age": {
                        "value": "28"
                    }
                }},
                {"match": {
                    "address": "990 Mill Road"
                }}
            ]
        }
    }
}

terms和term的查询机制是一样,都不会将指定的查询关键字进行分词,直接去分词库中匹配,找到相应文档内容。

terms是在针对一个字段包含多个值的时候使用。

2.11 aggregations( 执行聚合)

聚合提供了从数据中分组和提取数据的能力。 最简单的聚合方法大致等于 SQL GROUP BY 和 SQL 聚合函数。 在 Elasticsearch 中, 您有执行搜索返回 hits( 命中结果) , 并且同时返回聚合结果, 把一个响应中的所有 hits( 命中结果) 分隔开的能力。 这是非常强大且有效的,您可以执行查询和多个聚合, 并且在一次使用中得到各自的( 任何一个的) 返回结果, 使用一次简洁和简化的 API 来避免网络往返。

① 搜索 address 中包含 mill 的所有人的年龄分布以及平均年龄, 但不显示这些人的详情 :

# size: 0 不显示搜索数据
# aggs: 执行聚合。 聚合语法如下:
# "aggs": {
# 			"aggs_name 这次聚合的名字(随便起名), 方便展示在结果集中": {
# 				"AGG_TYPE 聚合的类型( avg,term,terms) ": {}
#		  }
#	}
GET bank/_search
{
    "query": {
        "match": {
            "address": "mill"
        }
    }, 
    "aggs": {
        "age_agg": {
            "terms": {
                "field": "age"
            }
        },
        "avg_age": {
            "avg": {
              "field": "age"
            }
        }
    },"size": 0
}

② 按照年龄聚合, 并且请求这些年龄段的这些人的平均薪资 :

GET bank/account/_search
{
    "query": {
        "match_all": {}
    },
    "aggs": {
        "age_agg": {
            "terms": {
                "field": "age",
                "size": 1000
            },
            "aggs": {
                "banlances_avg": {
                    "avg": {
                        "field": "balance"
                    }
                }
            }
        }
    } , 
    "size": 1000
}

③ 查出所有年龄分布, 并且这些年龄段中 M 的平均薪资和 F 的平均薪资以及这个年龄段的总体平均薪资 :

GET bank/account/_search
{
    "query": {
        "match_all": {}
    },
    "aggs": {
        "age_agg": {
            "terms": {
                "field": "age",
                "size": 100
            },
            "aggs": {
                "gender_agg": {
                    "terms": {
                        "field": "gender.keyword",
                        "size": 100
                    },
                    "aggs": {
                        "balance_avg": {
                            "avg": {
                                "field": "balance"
                            }
                        }
                    }
                },
                "balance_avg":{
                    "avg": {
                        "field": "balance"
                    }
                }
            }
        }
    } , "size": 1000
}

3. 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
        }
    }
}

③ 更新映射:

对于已经存在的映射字段, 我们不能更新。 更新必须创建新的索引进行数据迁移 ,先创建出 new_twitter 的正确映射。 然后使用如下方式进行数据迁移 :

PUT /newbank1
{
  "mappings" : {
    "properties" : {
      "account_number" : { "type" : "long"},
      "address" : {"type" : "text"},
      "age" : {"type" : "integer"},
      "balance" : { "type" : "integer"},
      "city" : {"type" : "keyword"},
      "email" : {"type" : "keyword"},
      "employer" : {"type" : "keyword"},
      "firstname" : {"type" : "keyword"},
      "gender" : {"type" : "keyword"},
      "lastname" : { "type" : "keyword"},
      "state" : {"type" : "keyword"}
    }
  }
}

POST _reindex
{
   "source": {
     "index": "bank",
     "type": "account"
  },
   "dest": {
     "index": "newbank1"
  }
}
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 00:01:48  更:2021-09-11 00:02:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 4:25:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码