2 elasticsearch 基本操作
内容概要
- 简单的集群管理
- 文档操作[增删改查]
- 多种查询
1.简单的集群管理
1.1 快速检查集群的健康状况
es提供了一套api,叫做cat api,可以查看es中各种各样的数据
GET /_cat/health?v
在kibana 中的dev_tool 中,操作:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1526295953 19:05:53 elasticsearch yellow 1 1 32 32 0 0 31 0 - 50.8%
Ps:cluster 是集群名称,这里只有一个节点,是kibana内置的elasticsearch,active_shards_percent是活跃shard
如何快速了解集群的健康状况?green、yellow、red?green:每个索引的primary shard和replica shard都是active状态的
yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了
为什么现在会处于一个yellow状态?
我们现在就一个笔记本电脑,就启动了一个es进程,相当于就只有一个node。现在es中有一个index,就是kibana自己内置建立的index。由于默认的配置是给每个index分配5个primary shard和5个replica shard,而且primary shard和replica shard不能在同一台机器上(为了容错)。现在kibana自己建立的index是1个primary shard和1个replica shard。当前就一个node,所以只有1个primary shard被分配了和启动了,但是一个replica shard没有第二台机器去启动。做一个小实验:此时只要启动第二个es进程,就会在es集群中有2个node,然后那1个replica shard就会自动分配过去,然后cluster status就会变成green状态。
1.2快速查看集群中有哪些索引
GET /_cat/indices?v
health | status | index | uuid | pri | rep | docs.count | docs.deleted | store.size | pri.store.size |
yellow | open | .kibana | rUm9n9wMRQCCrRDEhqneBg | 1 | 1 | 1 | 0 | 3.1kb | 3.1kb |
PS:pri 指primary shard(分片)数量,rep 是指primary replica (副本)数量
1.3 简单的索引操作
创建索引:PUT /zhang
GET /_cat/indices?v
health | status | index | uuid | pri | rep | docs.count | docs.deleted | store.size | pri.store.size |
yellow | open | zhang | mwmQWJVGS-CZ72_5iSVVvg | 1 | 1 | 1 | 0 | 650b | 650b |
yellow | open | .kibana | rUm9n9wMRQCCrRDEhqneBg | 1 | 1 | 1 | 0 | 3.1kb | 3.1kb |
删除索引:DELETE /zhang?pretty
GET /_cat/indices?v
health | status | index | uuid | pri | rep | docs.count | docs.deleted | store.size | pri.store.size |
yellow | open | .kibana | rUm9n9wMRQCCrRDEhqneBg | 1 | 1 | 1 | 0 | 3.1kb | 3.1kb |
2. 文档操作
2.1 新增文档模式:PUT /index/type/id
{
"json数据"
}
PUT /company/employee/7
{
"name":"C",
"age":25,
"department":"数据部",
"about":[
"sport",
"eat",
"sleep",
"program"
]
}
PS:这里”_shards” 中出现total 是 2,successful 为1 的情况是因为:默认正常情况下文档是要写入到primary shard和replica shard中,而我们这边replica节点不存在[replica 与 shard 不在同一个节点]。
2.2 查询文档
查询指定id的文档
模式: GET /index/type/id
GET /company/employee/1
查询该索引指定类型下的所有数据:
模式: GET /index/type/_search
GET /company/employee/_search
查询所有的数据:
GET /_search
修改更新操作
模式:POST /index/type/id
{
"name":"riche zhang",
"age":22,
"department":"业务研发一部",
"about":["write","eat","sleep","program"]
}
替换操作:
POST /company/employee/2
{
"name":"riche--this is a good name"
}
只修改字段:
POST /index/type/id/_update
{
“doc”:{
“field”:value
}
}
更新:
POST /company/employee/6/_update
{
"doc":{
"name":"zooter zhou"
}
}
删除文档
DELETE /index/type/id
DELETE /company/employee/6
3. 多种查询
3.1 querystring search
模式:GET /index/type/_search?q=filedName:value
例如,查询在employee类型中about字段包含sport单词的所有文档 : GET /company/employee/_search?q=about:sport
ps:
took:耗费了几毫秒
timed_out:是否超时,这里是没有
_shards:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或者是它的某个replica shard也可以)
hits.total:查询结果的数量,这里是2个document
hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高
hits.hits:包含了匹配搜索的document的详细数据
3.2 query DSL
DSL:Domain SpecifiedLanguage,特定领域的语言
http request body:请求体,可以用json的格式来构建查询语法,比较方便,可以构建各种复杂的语法,比query string search肯定强大多了
查询所有:
GET /company/employee/_search
{
"query": {
"match_all": {}
}
}
查看department 中包含"研发"的
GET /company/employee/_search
{
"query": {
"match": {
"department": "研发"
}
}
}
在上面的查询结果上加个按age字段 asc sort
GET /company/employee/_search
{
"query": {
"match": {
"department": "研发"
}
},
"sort": [
{
"age": {
"order": "asc"
}
}
]
}
再加个分页
GET /company/employee/_search
{
"query": {
"match": {
"department": "研发"
}
},
"sort": [
{
"age": {
"order": "asc"
}
}
],
"from":1,
"size":1
}
表示从第1页开始,取1条数据[默认索引是0]
指定要查询字段名
GET /company/employee/_search
{
"query": {
"match": {
"department": "研发"
}
},
"sort": [
{
"age": {
"order": "asc"
}
}
],
"from":1,
"size":1,
"_source": [
"name",
"age"
]
}
ps:上面的sort,_source及分页不是关联的,即大可不必一起写出来,我这样写只是为了图方便
3.3 query filter
查询department中有部并且age 大于30的文档
GET /company/employee/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"department": "部"
}
}
],
"filter": {
"range": {
"age": {
"gt":30
}
}
}
}
}
}
3.4 full-text search(全文检索)
搜索department中有部门的文档
GET /company/employee/_search
{
"query": {
"match": {
"department":"研发"
}
}
}
3.5 phrase search(短语搜索)
跟全文检索相对应,相反,全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回
phrasesearch,要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能作为结果返回
全文搜索结果
短语搜索
GET /company/employee/_search
{
"query": {
"match_phrase": {
"department": "研二"
}
}
}
3.6 highlight search
GET /company/employee/_search
{
"query": {
"match": {
"department": "研二"
}
},
"highlight": {
"fields": {
"department":{}
}
}
}
ok,elasticsearch 的简单操作就先到此为止,后面会陆续更新elasticsearch 的高级搜索及其它高级功能!!!!
有问题,可以加我v信,一起学习交流es