博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Elasticsearch实践(一):基础入门
阅读量:5875 次
发布时间:2019-06-19

本文共 7904 字,大约阅读时间需要 26 分钟。

本文以 Elasticsearch 6.2.4为例。

注:最新(截止到2018-09-23)的 Elasticsearch 是 6.4.1。5.x系列和6.x系列虽然有些区别,但基本用法是一样的。

官方文档:

安装

安装比较简单。分两步:

  • 配置JDK环境
  • 安装Elasticsearch
Elasticsearch 依赖 JDK环境,需要系统先下载安装 JDK 并配置
JAVA_HOME 环境变量。JDK 版本推荐:1.8.0系列。地址:

安装JDk

Linux:

$ yum install -y java-1.8.0-openjdk

配置环境变量,需要修改/etc/profile, 增加:

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el6_10.x86_64PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarJAVACMD=/usr/bin/javaexport JAVA_HOME JAVACMD CLASSPATH PATH

然后使之生效:

source /etc/profile

Windows:

安装包地址:

下载并配置JDK环境变量

JAVA_HOME=C:\Program Files\Java\jdk1.8.0_101CLASSPATH=.;%JAVA_HOME%\lib;.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

安装Elasticsearch

Elasticsearch 安装只需要下载二进制压缩包包,解压即可使用。需要特别注意的是版本号,如果还要安装Kibana及插件,需要注意选用一样的版本号。

安装包下载:

这个页面有 Elasticsearch 所有版本的下载:

下载后解压到指定目录,进入到 bin 目录,就可以运行 Elasticsearch 了:

Linux:

./elasticsearch

Windows:

elasticsearch.bat

Windows也可以安装为系统服务:

D:\work\elk\elasticsearch-6.2.4\bin>elasticsearch-service.batUsage: elasticsearch-service.bat install|remove|start|stop|manager [SERVICE_ID]elasticsearch-service.bat installelasticsearch-service.bat startelasticsearch-service.bat stopelasticsearch-service.bat remove

浏览器访问::9200,如果返回version等信息,说明安装成功。

注: Linux/Mac环境不能使用 root 用户运行。

Dev Tools

我们可以使用curl或者kibana提供的Dev Tools进行API测试。

例如:

curl方式:

curl 'localhost:9200/_cat/health?format=json'[{"epoch":"1537689647","timestamp":"16:00:47","cluster":"elasticsearch","status":"yellow","node.total":"1","node.data":"1","shards":"11","pri":"11","relo":"0","init":"0","unassign":"11","pending_tasks":"0","max_task_wait_time":"-","active_shards_percent":"50.0%"}]

Dev Tools:

GET /_cat/health?format=json

个人比较喜欢Kibana提供的Dev Tools,非常方便。如果没有安装,参考下面安装:

a. 下载kibana Windows版:

b. 解压后进kibana-6.2.4-windows-x86_64bin目录,运行kibana.bat即可:

D:\work\elk\kibana-6.2.4-windows-x86_64\bin>kibana.bat  log   [02:52:17.243] [info][status][plugin:kibana@6.2.4] Status changed from uninitialized to green - Ready  log   [02:52:17.869] [info][status][plugin:elasticsearch@6.2.4] Status changed from uninitializedto yellow - Waiting for Elasticsearch  log   [02:52:17.880] [info][status][plugin:console@6.2.4] Status changed from uninitialized to green - Ready  log   [02:52:17.888] [info][status][plugin:metrics@6.2.4] Status changed from uninitialized to green - Ready  log   [02:52:18.165] [info][status][plugin:timelion@6.2.4] Status changed from uninitialized to green - Ready  log   [02:52:18.200] [info][listening] Server running at http://localhost:5601  log   [02:52:18.268] [info][status][plugin:elasticsearch@6.2.4] Status changed from yellow to green - Ready
c. 浏览器访问: :5601

查看_cat命令:

GET _cat
=^.^=/_cat/allocation/_cat/shards/_cat/shards/{index}/_cat/master/_cat/nodes/_cat/tasks/_cat/indices/_cat/indices/{index}/_cat/segments/_cat/segments/{index}/_cat/count/_cat/count/{index}/_cat/recovery/_cat/recovery/{index}/_cat/health/_cat/pending_tasks/_cat/aliases/_cat/aliases/{alias}/_cat/thread_pool/_cat/thread_pool/{thread_pools}/_cat/plugins/_cat/fielddata/_cat/fielddata/{fields}/_cat/nodeattrs/_cat/repositories/_cat/snapshots/{repository}/_cat/templates

以下测试均在Dev Tools执行。

节点操作

查看健康状态

GET /_cat/health?format=json
format=json 表示输出json格式,默认是文本格式。

结果:

[  {    "epoch": "1537689915",    "timestamp": "16:05:15",    "cluster": "elasticsearch",    "status": "yellow",    "node.total": "1",    "node.data": "1",    "shards": "11",    "pri": "11",    "relo": "0",    "init": "0",    "unassign": "11",    "pending_tasks": "0",    "max_task_wait_time": "-",    "active_shards_percent": "50.0%"  }]

健康状态有3种:

  • Green - 正常(集群功能齐全)
  • Yellow - 所有数据均可用,但尚未分配一些副本(群集功能齐全)
  • Red - 某些数据由于某种原因不可用(群集部分功能可用)
注意:当群集为红色时,它将继续提供来自可用分片的搜索请求,但您可能需要尽快修复它,因为存在未分配的分片。

查看节点

GET /_cat/nodes?format=json

索引

创建index

PUT /customer

输出:

{  "acknowledged": true,  "shards_acknowledged": true,  "index": "customer"}
注:实际项目里一般是不会直接这样创建 index 的,这里仅为演示。一般都是通过创建 mapping 手动定义 index 或者自动生成 index 。

查看所有index

GET /_cat/indices?format=json

结果:

[  {    "health": "yellow",    "status": "open",    "index": "customer",    "uuid": "AC4WMuViTguHDFtCRlXLow",    "pri": "5",    "rep": "1",    "docs.count": "0",    "docs.deleted": "0",    "store.size": "1.1kb",    "pri.store.size": "1.1kb"  }]

删除index

DELETE /customer

输出:

{  "acknowledged": true}
注:删除索引会把数据一并删除。实际操作请谨慎。

简单的增删改查

本文只讲解简单的增删改查。

ES文档有一些缺省字段,称之为Meta-Fields,例如_index_type_id等,查询文档的时候会返回。

按ID新增数据

type为doc:

PUT /customer/doc/1{  "name": "John Doe"}
PUT /customer/doc/2{  "name": "yujc",  "age":22}
如果索引index不存在,直接新增数据也会同时创建index。

同时,该操作也能修改数据:

PUT /customer/doc/2{  "name": "yujc2"}

name字段会被修改,而且_version会被修改为2。该操作实际是覆盖数据

GET /customer/doc/2

结果:

{  "_index": "customer",  "_type": "doc",  "_id": "2",  "_version": 2,  "found": true,  "_source": {    "name": "yujc2"  }}

按ID查询数据

GET /customer/doc/1

结果:

{  "_index": "customer",  "_type": "doc",  "_id": "1",  "_version": 1,  "found": true,  "_source": {    "name": "John Doe"  }}

直接新增数据

我们也可以不指定文档ID从而直接新增数据:

POST /customer/doc{  "name": "yujc",  "age":23}

注意这里使用的动作是POSTPUT新增数据必须指定文档ID。

按ID更新数据

我们使用下面两种方式均能更新已有数据:

PUT /customer/doc/1{  "name": "yujc2",  "age":22}POST /customer/doc/1{  "name": "yujc2",  "age":22}

以上操作均会覆盖现有数据

更新部分字段(_update)

如果只是想更新指定字段,必须使用POST加参数的形式:

POST /customer/doc/1/_update{  "doc":{"name": "yujc"}}

其中_update表示更新。json里doc必须有,否则会报错。

增加字段:

POST /customer/doc/1/_update{  "doc":{"year": 2018}}

就会在已有的数据基础上增加一个year字段,不会覆盖已有数据:

GET /customer/doc/1

结果:

{  "_index": "customer",  "_type": "doc",  "_id": "1",  "_version": 16,  "found": true,  "_source": {    "name": "yujc",    "age": 22,    "year": 2018  }}

也可以使用简单脚本执行更新。此示例使用脚本将年龄增加5:

POST /customer/doc/1/_update{  "script":"ctx._source.age+=5"}

结果:

{  "_index": "customer",  "_type": "doc",  "_id": "1",  "_version": 17,  "found": true,  "_source": {    "name": "yujc",    "age": 27,    "year": 2018  }}

按ID删除数据

DELETE /customer/doc/1

查询指定 Index 的 mapping

GET /customer/_mapping

输出:

{  "customer": {    "mappings": {      "doc": {        "properties": {          "age": {            "type": "long"          },          "name": {            "type": "text",            "fields": {              "keyword": {                "type": "keyword",                "ignore_above": 256              }            }          }        }      }    }  }}

说明:properties表示字段,这里一共有2个字段(ES自动创建的):

  • age,类型是long(支持检索)
  • name,类型是text(支持检索、分词);且额外增加了一个字段name.keyword,类型是keyword(支持检索)。

以上具体到后面讲解。

拓展知识:

注:ElasticSearch里面有
index
type 的概念:index称为索引,type为文档类型,一个index下面有多个type,每个type的字段可以不一样。这类似于关系型数据库的 database 和 table 的概念。但是,ES中不同type下名称相同的filed最终在Lucene中的处理方式是一样的。所以后来ElasticSearch团队想去掉type,于是在6.x版本为了向下兼容,一个index只允许有一个type。预计7.x版本彻底去掉type。参考:

所以,实际使用中建议一个index里面仅有一个type,名称可以和index一致,或者使用固定的doc

批量接口

批量创建

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

该操作会新增2条记录,其中文档第1行和第3行提供的是要操作的文档id,第2行和第4行是相应的源文档,即数据内容。这里对文档的操作是index,也可以是create,二者都是创建文档,只是如果文档已存在,index会覆盖,create会失败。

查询数据:

GET /customer/doc/2

结果:

{  "_index": "customer",  "_type": "doc",  "_id": "2",  "_version": 2,  "found": true,  "_source": {    "name": "Jane Doe"  }}

批量更新、删除

POST /customer/doc/_bulk{"update":{"_id":"1"}}{"doc": { "name": "John Doe becomes Jane Doe" } }{"delete":{"_id":"2"}}

该操作会更新ID为1的文档,删除ID为2的文档。对于删除操作,之后没有相应的源文档,因为删除只需要删除文档的ID。

注意:批量操作如果某条失败了,并不影响下一条继续执行。

按条件更新

curl -X POST http://127.0.0.1:9200/test/doc/_update_by_query -H "Content-Type: application/json" -d '{"script":{"source":"ctx._source[\"is_pub\"]=1"},"query":{"match_all":{}}}'

这个示例的含义是将文档test/doc的所有文档的is_pub字段设置为1。

按条件删除

curl -X POST http://127.0.0.1:9200/test/doc/_delete_by_query -H "Content-Type: application/json" -d '{"query":{"bool":{"filter":{"range":{"id":{"gt":1661208}}}}}}'

这个示例的含义是将文档test/doc里字段 id 符合id>1661208的全部删除。

防盗版声明:本文系原创文章,发布于公众号飞鸿影的博客(fhyblog)及,转载需作者同意。


参考

1、Getting Started | Elasticsearch Reference [6.2] | Elastic

2、Elasticsearch 5.x 关于term query和match query的认识 - wangchuanfu - 博客园

你可能感兴趣的文章
外部中断实验
查看>>
python 回溯法 子集树模板 系列 —— 19、野人与传教士问题
查看>>
多线程之GCD(一)
查看>>
7.3. postForObject
查看>>
Nginx 学习笔记(四)nginx-module-vts模块
查看>>
thinkphp怎么实现图片验证码
查看>>
iOS - UISegmentedControl
查看>>
Web APi之认证(Authentication)两种实现方式【二】(十三)
查看>>
PgSQL · 应用案例 · 海量用户实时定位和圈人-团圆社会公益系统
查看>>
leetcode二分查找问题整理
查看>>
设计模式——8代理模式(Proxy)
查看>>
Data Guard故障自动切换的想法(r11笔记第40天)
查看>>
调查显示:1/3的“00后”希望人工智能和机器人领导国家
查看>>
C++异常处理与临时副本
查看>>
[绝对原创] SAP Get User data by User ID
查看>>
WPF笔记(2.2 DockPanel)——Layout
查看>>
嵌入式工控机主板在无人机中的应用
查看>>
后台(22)——AJAX
查看>>
LVM pvcreate,vgcreate,lvcreate,mkfs
查看>>
DeepMind提出快速调参新算法PBT,适用GAN训练(附论文)
查看>>