ElasticSearch使用篇

news/2024/7/23 8:22:40 标签: 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" : {}}}


http://www.niftyadmin.cn/n/5338300.html

相关文章

Druid监控 + 多数据源配置

application.yaml yaml配置文件的配置。 # 数据源配置 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverdruid:# ps# 主库数据源master:url: jdbc:mysql://localhost:3306/jzm?useUnicodetrue&characterEncod…

C# 程序结构

文章目录 前言一、C# 程序结构命名空间&#xff08;Namespace&#xff09;类&#xff08;Class&#xff09;方法&#xff08;Method&#xff09;语句&#xff08;Statement 二 、简单的C#程序结构示例示例代码分析第一个Hello World 程序总结 前言 C#基础学习入门系列- C# 程序…

kafka(一)——简介

简介 Kafka 是一种分布式、支持分区、多副本的消息中间件&#xff0c;支持发布-订阅模式&#xff0c;多用于实时处理大量数据缓存的场景&#xff0c;类似于一个“缓存池”。 架构 Producer&#xff1a;消息生产者&#xff1b;Consumer&#xff1a;消息消费者&#xff1b;Brok…

easydarwin 下面easywasmplayer和easyplayer

拷贝大佬们&#xff0c;起码验证能用再写文章&#xff0c;找到的各种坑 easydarwin/easywasmplayer - npm 区别 easyplayer&#xff1a;在与vue2结合的时候没有问题&#xff0c;但是用在vue3中&#xff0c;就是提示各种缺东西&#xff0c;你就是将所有文件引入到index.html都…

解决Unity WebGLInput插件全屏输入的问题

unity webgl的中文输入插件WebglInput在全屏的时候会出现无法输入中文/输入的英文会字母出现在光标后面/什么都输入不了的等无法正常使用的情况。 插件官网作者给出了unity的2017&#xff0c;2018&#xff0c;2019版本的全屏输入解决方法。 最新插件下载地址&#xff1a;http…

linux内核源码编译2.6失败

centos7环境 iso选择 https://mirrors.tuna.tsinghua.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso 自带qemu&#xff0c;未实测是否可用 选择编译版本2.6 下载地址 遇到的编译错误解决 yum list | grep curses yum install ncurses-devel.x86_64 -y yum i…

MATLAB Fundamentals>>>Fill Missing Values

MATLAB Fundamentals>Preprocessing Data>Interpolating Missing Data> (1/4) Fill Missing Values This code sets up the activity. x [0 NaN 7 8 NaN 2 -3 NaN -8] plot(x,"s-","LineWidth",1.5) 任务1&#xff1a; Create a vector y th…

TCP重传, 滑动窗口, 流量控制, 拥塞控制

TCP重传, 滑动窗口, 流量控制, 拥塞控制 1. 重传机制 TCP 实现可靠传输的方式之一&#xff0c;是通过序列号与确认应答。 在 TCP 中&#xff0c;当发送端的数据到达接收主机时&#xff0c;接收端主机会返回一个确认应答消息&#xff0c;表示已收到消息。 针对数据可能丢失的…