ElasticSearch使用篇

发布时间:2024年01月16日

目录

一、 概述

二、创建索引

三、查询索引

四、删除索引

五、修改索引

六、批量操作

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" : {}}}

文章来源:https://blog.csdn.net/lmj3732018/article/details/135632270
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。