Elasticsearch实践:基础入门 elasticsearch入门教程
yuyutoo 2024-10-28 20:21 1 浏览 0 评论
本文以 Elasticsearch 6.2.4为例。
注:截止到2018-09-23的 Elasticsearch 是 6.4.1。5.x系列和6.x系列虽然有些区别,但基本用法是一样的。
官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/
安装
安装比较简单。分两步:
- 配置JDK环境
- 安装Elasticsearch
Elasticsearch 依赖 JDK环境,需要系统先下载安装 JDK 并配置 JAVA_HOME 环境变量。JDK 版本推荐:1.8.0系列。地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
安装JDk
Linux:
$ yum install -y java-1.8.0-openjdk
配置环境变量,需要修改/etc/profile, 增加:
CopyJAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el6_10.x86_64 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar JAVACMD=/usr/bin/java export JAVA_HOME JAVACMD CLASSPATH PATH
然后使之生效:
source /etc/profile
Windows:
安装包地址:
http://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-windows-x64.exe
下载并配置JDK环境变量
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_101 CLASSPATH=.;%JAVA_HOME%\lib;.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
安装Elasticsearch
Elasticsearch 安装只需要下载二进制压缩包包,解压即可使用。需要特别注意的是版本号,如果还要安装Kibana及插件,需要注意选用一样的版本号。
安装包下载:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz
这个页面有 Elasticsearch 所有版本的下载:https://www.elastic.co/downloads/past-releases
下载后解压到指定目录,进入到 bin 目录,就可以运行 Elasticsearch 了:
Linux:
./elasticsearch
Windows:
elasticsearch.bat
Windows也可以安装为系统服务:
D:\work\elk\elasticsearch-6.2.4\bin>elasticsearch-service.bat Usage: elasticsearch-service.bat install|remove|start|stop|manager [SERVICE_ID] elasticsearch-service.bat install elasticsearch-service.bat start elasticsearch-service.bat stop elasticsearch-service.bat remove
浏览器访问:http://127.0.0.1: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版:
https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-windows-x86_64.zip
b. 解压后进kibana-6.2.4-windows-x86_64\bin目录,运行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 gree n - Ready log [02:52:17.869] [info][status][plugin:elasticsearch@6.2.4] Status changed from uninitialized to yellow - Waiting for Elasticsearch log [02:52:17.880] [info][status][plugin:console@6.2.4] Status changed from uninitialized to gre en - Ready log [02:52:17.888] [info][status][plugin:metrics@6.2.4] Status changed from uninitialized to gre en - Ready log [02:52:18.165] [info][status][plugin:timelion@6.2.4] Status changed from uninitialized to gr een - 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 gree n - Ready
c. 浏览器访问: http://127.0.0.1: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执行。
节点操作
查看健康状态
CopyGET /_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 }
注意这里使用的动作是POST。PUT新增数据必须指定文档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
查询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。参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html
所以,实际使用中建议一个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的全部删除。
参考
1、Getting Started | Elasticsearch Reference [6.2] | Elastic
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/getting-started.html
2、Elasticsearch 5.x 关于term query和match query的认识 - wangchuanfu - 博客园
https://www.cnblogs.com/wangchuanfu/p/7444253.html
(本文完)
本文优先在公众号"飞鸿影的博客(fhyblog)"发布,欢迎关注公众号及时获取最新文章推送!
相关推荐
- MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库
-
前言:本文章是在同处局域网内的两台windows电脑,且MySQL是5.5以上版本下进行的一主多从同步配置,并且使用的是集成环境工具PHPStudy为例。最后就是ThinkPHP5的分布式的连接,读写...
- thinkphp5多语言怎么切换(thinkphp5.1视频教程)
-
thinkphp5多语言进行切换的步骤:第一步,在配置文件中开启多语言配置。第二步,创建多语言目录。相关推荐:《ThinkPHP教程》第三步,编写语言包。视图代码:控制器代码:效果如下:以上就是thi...
- 基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin
-
FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。主要特性基于Auth验证的权限管理系统支持无限级父子级权限继承,父级的管理员可任意增删改子级管理员及权限设置支持单...
- Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示
-
本文实例讲述了Thinkphp5.0框架实现控制器向视图view赋值及视图view取值操作。分享给大家供大家参考,具体如下:Thinkphp5.0控制器向视图view的赋值方式一(使用fetch()方...
- thinkphp5实现简单评论回复功能(php评论回复功能源码下载)
-
由于之前写评论回复都是使用第三方插件:畅言所以也就没什么动手,现在证号在开发一个小的项目,所以就自己动手写评论回复,没写过还真不知道评论回复功能听着简单,但仔细研究起来却无法自拔,由于用户量少,所以...
- ThinkPHP框架——实现定时任务,定时更新、清理数据
-
大家好,我是小蜗牛,今天给大家分享一下,如何用ThinkPHP5.1.*版本实现定时任务,例如凌晨12点更新数据、每隔10秒检测过期会员、每隔几分钟发送请求保证ip的活性等本次分享,主要用到一个名为E...
- BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统
-
BeyongCms内容管理系统(简称BeyongCms)BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统,适用于企业Cms,个人站长等,针对移动App、小程序优化;提供完善简...
- YimaoAdminv3企业建站系统,使用 thinkphp5.1.27 + mysql 开发
-
介绍YimaoAdminv3.0.0企业建站系统,使用thinkphp5.1.27+mysql开发。php要求5.6以上版本,推荐使用5.6,7.0,7.1,扩展(curl,...
- ThinkAdmin-V5开发笔记(thinkpad做开发)
-
前言为了快速开发一款小程序管理后台,在众多的php开源后台中,最终选择了基于thinkphp5的,轻量级的thinkadmin系统,进行二次开发。该系统支持php7。文档地址ThinkAdmin-V5...
- thinkphp5.0.9预处理导致的sql注入复现与详细分析
-
复现先搭建thinkphp5.0.9环境...
- thinkphp5出现500错误怎么办(thinkphp页面错误)
-
thinkphp5出现500错误,如下图所示:相关推荐:《ThinkPHP教程》require():open_basedirrestrictionineffect.File(/home/ww...
- Thinkphp5.0极速搭建restful风格接口层
-
下面是基于ThinkPHPV5.0RC4框架,以restful风格完成的新闻查询(get)、新闻增加(post)、新闻修改(put)、新闻删除(delete)等server接口层。1、下载Thin...
- 基于ThinkPHP5.1.34 LTS开发的快速开发框架DolphinPHP
-
DophinPHP(海豚PHP)是一个基于ThinkPHP5.1.34LTS开发的一套开源PHP快速开发框架,DophinPHP秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机...
- ThinkPHP5.*远程代码执行高危漏洞手工与升级修复解决方法
-
漏洞描述由于ThinkPHP5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,黑客构造特定的请求,可直接GetWebShell。漏洞评级严重影响版本ThinkPHP5.0系列...
- Thinkphp5代码执行学习(thinkphp 教程)
-
Thinkphp5代码执行学习缓存类RCE版本5.0.0<=ThinkPHP5<=5.0.10Tp框架搭建环境搭建测试payload...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库
- thinkphp5多语言怎么切换(thinkphp5.1视频教程)
- 基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin
- Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示
- thinkphp5实现简单评论回复功能(php评论回复功能源码下载)
- ThinkPHP框架——实现定时任务,定时更新、清理数据
- BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统
- YimaoAdminv3企业建站系统,使用 thinkphp5.1.27 + mysql 开发
- ThinkAdmin-V5开发笔记(thinkpad做开发)
- thinkphp5.0.9预处理导致的sql注入复现与详细分析
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)