ElasticSearch使用篇

目录

一、 概述

二、创建索引

三、查询索引

四、删除索引

五、修改索引

六、批量操作

6.1 批量写入

6.2 批量创建文档create

6.3 普通创建或全量替换index

6.4 批量删除delete

 6.5 批量修改update

6.6 组合应用

6.7 批量读取


一、 概述

   es的操作是基于 Restful 风格的 API 操作,请求体则是 Json 格式。

二、创建索引

格式:   PUT   /索引名称

索引命名规范:

  • 以小写英文字母命名索引
  • 不要使用驼峰命名法则
  • 如过出现多个单词的索引名称,以全小写 + 下划线分隔的方式:如test_index。

ES 索引创建成功之后,以下属性将不可修改:

  • 索引名称
  • 主分片数量
  • 字段类型
# 简单创建索引
PUT /es_db
 
# 插入数据自动创建索引
PUT /user/_doc/1
{
 "name":"fox",
 "age":32,
 "address":"长沙麓谷"
}
 
 
# 静态映射创建索引
PUT /user
{
  "settings": {
     "number_of_shards": "1",
     "number_of_replicas": "1"
  },
  "mappings": {
     "properties": {
        "name": {
          "type": "keyword"
         },
        "age" : {
          "type" : "long"
        },
        "address" : {
          "type" : "text"
        }
     }
  }
}

备注:es的索引并不像关系型数据库一样需要提前定义。它在PUT数据的过程中会动态生成索引的映射,如果后续PUT过程中有新的字段需要保存,它同样会动态添加新字段的映射

三、查询索引

格式:   GET   /索引名称

# 查询索引
GET /es_db
 
# es_db是否存在
HEAD /es_db
 
# match 匹配查询,会对查询文本分词后匹配
GET /es_db/_search
{
  "query": {
     "match": {
        "address": "广州白云"
     }
  }
}
 
# term 词项查询,属于精确查询,不会对查询文本分词
GET /es_db/_search
 {
   "query": {
     "term": {
       "address": "广州白云"
     }
   }
 }
 
 
#通过URI搜索,使用“q”指定查询字符串,“query string syntax” KV键值对
 
#条件查询, 如要查询age等于28岁的 _search?q=*:***
GET /es_db/_doc/_search?q=age:28
 
#范围查询, 如要查询age在25至26岁之间的 _search?q=***[** TO **] 注意: TO 必须为大写
GET /es_db/_doc/_search?q=age[25 TO 26]
 
#查询年龄小于等于28岁的 :<=
GET /es_db/_doc/_search?q=age:<=28
#查询年龄大于28前的 :>
GET /es_db/_doc/_search?q=age:>28
 
#分页查询 from=*&size=*
GET /es_db/_doc/_search?q=age[25 TO 26]&from=0&size=1
 
#对查询结果只输出某些字段 _source=字段,字段
GET /es_db/_doc/_search?_source=name,age
 
#对查询结果排序 sort=字段:desc/asc
GET /es_db/_doc/_search?sort=age:desc

四、删除索引

格式:   DELETE   /索引名称

DELETE /es_db

五、修改索引

格式:  PUT  /索引名称

# 创建索引es_db,指定其主分片数量为 3,每个主分片的副本数量为 2
PUT /es_db
{
   "settings" : {
       "number_of_shards" : 3,
       "number_of_replicas" : 2
   }
}
 
# 创建索引时可以指定IK分词器作为默认分词器
PUT /es_db
{
   "settings" : {
      "index" : {
        "analysis.analyzer.default.type": "ik_max_word"
      }
   }
}
 
# 填了id则是修改,不填即是新增
POST /es_db/_doc
{
  "name": "张三",
  "sex": 1,
  "age": 25,
  "address": "广州天河公园",
  "remark": "java developer"
}
 
# 指定id新增数据,是全字段的更新,相当于删除旧文档,重新建新文档
PUT /es_db/_doc/1
{
  "name": "张三",
  "sex": 1,
  "age": 25,
  "address": "广州天河公园",
  "remark": "java developer"
}
 
# 部分更新:在原有文档上更新
# Update -文档必须已经存在,更新只会对相应字段做增量修改
POST /es_db/_update/1
{
  "doc": {
    "age": 28
  }
}
 
# 使用 _update_by_query 更新文档
POST /es_db/_update_by_query
{
  "query": {
    "match": {
      "_id": 1
    }
  },
  "script": {
    "source": "ctx._source.age = 30"
  }
}
 
# 并发场景下修改文档
# _seq_no和_primary_term是对_version的优化,7.X版本的ES默认使用这种方式控制版本,所以当在
# 高并发环境下使用乐观锁机制修改文档时,要带上当前文档的_seq_no和_primary_term进行更新:
POST /es_db/_doc/2?if_seq_no=21&if_primary_term=6
{
  "name": "李四xxx"
}
 
 
# 删除文档
DELETE /es_db/_doc/1

 注意:  POST和PUT都能起到创建/更新的作用,PUT需要对一个具体的资源进行操作也就是要确定id才能进行更新/创建,而POST是可以针对整个资源集合进行操作的,如果不写id就由ES生成一个唯一id进行创建新文档,如果填了id那就针对这个id的文档进行创建/更新

六、批量操作

批量操作可以减少网络连接所产生的开销,提升性能
  • 支持在一次API调用中,对不同的索引进行操作
  • 可以在URI中指定Index,也可以在请求的Payload中进行
  • 操作中单条操作失败,并不会影响其他操作
  • 返回结果包括了每一条操作执行的结果

6.1 批量写入

批量对文档进行写操作是通过_bulk的API来实现的
  • 请求方式:POST
  • 请求地址:_bulk
  • 请求参数:通过_bulk操作文档,一般至少有两行参数(或偶数行参数)
         第一行参数为指定操作的类型及操作的对象(index,type和id)
         第二行参数才是操作的数据
     参数类似于:
{"actionName":{"_index":"indexName", "_type":"typeName","_id":"id"}}
{"field1":"value1", "field2":"value2"}
      actionName:表示操作类型,主要有create,index,delete和update

6.2 批量创建文档create

POST _bulk
{"create":{"_index":"article", "_type":"_doc", "_id":3}}
{"id":3,"title":"标题1","content":"内容1","tags":["java", "面向对象"],"create_time":1554015482530}
{"create":{"_index":"article", "_type":"_doc", "_id":4}}
{"id":4,"title":"标题2","content":"内容2","tags":["java", "面向对象"],"create_time":1554015482530}

6.3 普通创建或全量替换index

POST _bulk
{"index":{"_index":"article", "_type":"_doc", "_id":3}}
{"id":3,"title":"标题1","content":"内容1","tags":["java", "面向对象"],"create_time":1554015482530}
{"index":{"_index":"article", "_type":"_doc", "_id":4}}
{"id":4,"title":"标题2","content":"内容2","tags":["java", "面向对象"],"create_time":1554015482530}
  • 如果原文档不存在,则是创建
  • 如果原文档存在,则是替换(全量修改原文档)

6.4 批量删除delete

POST _bulk
{"delete":{"_index":"article", "_type":"_doc", "_id":3}}
{"delete":{"_index":"article", "_type":"_doc", "_id":4}}

 6.5 批量修改update

POST _bulk
{"update":{"_index":"article", "_type":"_doc", "_id":3}}
{"doc":{"title":"ES大法必修内功"}}
{"update":{"_index":"article", "_type":"_doc", "_id":4}}
{"doc":{"create_time":1554018421008}}

6.6 组合应用

POST _bulk
{"create":{"_index":"article", "_type":"_doc", "_id":3}}
{"id":3,"title":"标题1","content":"内容1","tags":["java", "面向对
象"],"create_time":1554015482530}
{"delete":{"_index":"article", "_type":"_doc", "_id":3}}
{"update":{"_index":"article", "_type":"_doc", "_id":4}}
{"doc":{"create_time":1554018421008}}

6.7 批量读取

es的批量查询可以使用mget和msearch两种。其中mget是需要我们知道它的id,可以指定不同的
index,也可以指定返回值source。msearch可以通过字段查询来进行一个批量的查找。
_mget
GET _mget
{
  docs": [
    {
      _index": "es_db",
      _id": 1,
      "_index": "article",
      "_id": 4
    }
  ]
}

#可以通过ID批量获取es_db的数据
GET /es_db/_mget
{
  "docs": [
    {
      "_id": 1
    },
    {
      "_id": 4
    }
  ]
}
#简化后
GET /es_db/_mget
{
  "ids":["1","2"] 
}
_msearch
       在_msearch中,请求格式和bulk类似。查询一条数据需要两个对象,第一个设置index和type,第二 个设置查询语句。查询语句和search相同。如果只是查询一个index,我们可以在url中带上index,这 样,如果查该index可以直接用空对象表示。
GET /es_db/_msearch
{}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 2}
{"index" : "article"}
{"query" : {"match_all" : {}}}

你可能感兴趣的:(ELK技术栈,elasticsearch,大数据,搜索引擎)