ElasticSearch01

一.认识ElasticSearch

ES即为了解决原生Lucene使用的不足,优化Lucene的调用方式,并实现了高可用的分布式集群的搜索方案,其第一个版本于2010年2月出现在GitHub上并迅速成为最受欢迎的项目之一。
首先,ES的索引库管理支持依然是基于Apache Lucene™的开源搜索引擎。
ES也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
不过,ES的核心不仅仅在于Lucene,其特点更多的体现为:

分布式的实时文件存储,每个字段都被索引并可被搜索
分布式的实时分析搜索引擎 --ES
KB-MB-GB-TB-PB
可以扩展到上百台服务器,处理PB级结构化或非结构化数据
高度集成化的服务,你的应用可以通过简单的 RESTful API、各种语言的客户端甚至命令行与之
交互。
上手Elasticsearch非常容易。它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它拥有开瓶即饮的效果(安装即可使用),只需很少的学习既可在生产环境中使用。

二.ES安装及使用说明

1.ES安装

① 下载ES安装包
官方下载地址:https://www.elastic.co/downloads/elasticsearch
在这里插入图片描述

② 运行ES
bin/elasticsearch.bat
③ 验证
访问:http://localhost:9200/
在这里插入图片描述
看到上图信息,恭喜你,你的ES集群已经启动并且正常运行.

2.ES交互方式客户端

① 基于RESTful API
ES和所有客户端的交互都是使用JSON格式的数据.
其他所有程序语言都可以使用RESTful API,通过9200端口的与ES进行通信,在开发测试阶段,你可以使用你喜欢的WEB客户端, curl命令以及火狐的POSTER插件方式和ES通信。
Curl命令方式:
默认windows下不支持curl命令,在资料中有curl的工具及简单使用说明。
在这里插入图片描述
火狐的POSTER插件界面:
类似于Firebug,在火狐的“扩展”中搜索“POSTER”,并安装改扩展工具。
在这里插入图片描述
使用POSTER模拟请求的效果

在这里插入图片描述
② Java API
ES为Java用户提供了两种内置客户端:
节点客户端(node client):
节点客户端以无数据节点(none data node)身份加入集群,换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。
传输客户端(Transport client):
这个更轻量的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单转发请求给集群中的节点。
两个Java客户端都通过9300端口与集群交互,使用ES传输协议(ES Transport Protocol)。集群中的节点
之间也通过9300端口进行通信。如果此端口未开放,你的节点将不能组成集群。
注意
Java客户端所在的ES版本必须与集群中其他节点一致,否则,它们可能互相无法识别。

3.扩展:Restful认识

Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作。
使用Restful的好处:
透明性,暴露资源存在。
充分利用 HTTP 协议本身语义。
无状态,这点非常重要。在调用一个接口(访问、操作资源)的时候,可以不用考虑上下文,不用考虑当前状态,极大的降低了复杂度。
HTTP 本身提供了丰富的内容协商手段,无论是缓存,还是资源修改的乐观并发控制,都可以以业务无关的中间件来实现。
Restful的典型特征:
① Server提供的RESTful API中,URL中只使用名词来指定资源。
“资源”是REST架构或者说整个网络处理的核心。比如:
GET http://api.itsource.cn/emp/323: 获取323号员工的基本资料;
GET http://api.itsource.cn/emps: 获取源码时代所有员工资料列表;
② REST 是面向资源的,这个概念非常重要,而资源是通过 URI 进行暴露
URI 的设计只要负责把资源通过合理方式暴露出来就可以了。对资源的操作与它无关,所以REST 通过 URI 暴露资源时,会强调不要在 URI 中出现动词。
比如:左边是错误的设计,而右边是正确的
GET /rest/api/getDogs -> GET /rest/api/dogs 获取所有小狗狗
GET /rest/api/addDogs -> POST /rest/api/dogs 添加一个小狗狗
POST /rest/api/editDogs/12 -> PUT /rest/api/dogs/12 修改一个小狗狗
POST /rest/api/deleteDogs/12 -> DELETE /rest/api/dogs/12 删除一个小狗狗
左边的这种设计,很明显不符合REST风格,URI 只负责准确无误的暴露资源,而 getDogs/addDogs…已经包含了对资源的操作,这是不对的。相反右边却满足了,它的操作是使用标准的HTTP动词来体现。
③ 用HTTP协议里的动词来实现资源的添加,修改,删除等操作。
即通过HTTP动词来实现资源的状态扭转:
GET 用来获取资源,
POST 用来新建资源(也可以用于更新资源),
PUT 用来更新资源,
DELETE 用来删除资源。
比如:
GET http://api.itsource.cn/emp/323
POST http://api.itsource.cn/emp/232: 修改一个员工
PUT http://api.itsource.cn/emp: 添加员工资料
DELETE http://api.itsource.cn/emp/323: 删除323号员工

4.辅助管理工具Kibana5

① Kibana5.2.2下载地址:https://www.elastic.co/downloads/kibana
② 解压并编辑config/kibana.yml,设置elasticsearch.url的值为已启动的ES
③ 启动Kibana5 : bin\kibana.bat
④ 默认访问地址:http://localhost:5601
Discover:可视化查询分析器
Visualize:统计分析图表
Dashboard:自定义主面板(添加图表)
Timelion:Timelion是一个kibana时间序列展示组件(暂时不用)
Dev Tools :Console(同CURL/POSTER,操作ES代码工具,代码提示,很方便)
Management:管理索引库(index)、已保存的搜索和可视化结果(save objects)、设置 kibana 服务器属性。

5.安装es服务端

1)下载
https://www.elastic.co/downloads/elasticsearch
正常请求我们应该在linux或者Docker安装,但是现在我们是学习阶段,就在window上面进行安装

在这里插入图片描述
2) 安装
解压即可
可以修改内存配置
在这里插入图片描述
在这里插入图片描述
3) 启动
bin/elasticsearch.bat
在这里插入图片描述
4) 测试 -web端口
http://localhost:9200
查询状态

5.安装kibana客户端

1)下载
在这里插入图片描述
2)安装
解压即可
3)配置
配置服务器地址,编辑config/kibana.yml,设置elasticsearch.url的值为已启动的ES
3) 启动
在这里插入图片描述
在这里插入图片描述
4) 测试
http://localhost:5601
在这里插入图片描述

三.ES文档操作

1.什么是ES中的文档

ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。
ES使用Javascript对象符号(JavaScript Object Notation),也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。
ES存储的一个员工文档的格式示例:
{
“email”: “laozheng@itsource.cn”,
“name”: “老郑”,
“info”: {
“addr”: “四川省成都市”,
“age”: 30,
“interests”: [ “美食”, “美女” ]
},
“join_date”: “2016-06-01”
}
尽管原始的 employee对象很复杂,但它的结构和对象的含义已经被完整的体现在JSON中了,在ES中将对象转化为JSON并做索引要比在表结构中做相同的事情简单的多。
一个文档不只有数据。它还包含元数据(metadata)—关于文档的信息。三个必须的元数据节点是:
在这里插入图片描述
_index:索引库,类似于关系型数据库里的“数据库”—它是我们存储和索引关联数据的地方。
_type:在应用中,我们使用对象表示一些“事物”,例如一个用户、一篇博客、一个评论,或者一封邮件。可以是大写或小写,不能包含下划线或逗号。我们将使用 employee 做为类型名。
_id:与 _index 和 _type 组合时,就可以在ELasticsearch中唯一标识一个文档。当创建一个文档,你可以自定义 _id ,也可以让Elasticsearch帮你自动生成。
另外还包括:_uid文档唯一标识(_type#_id)
_source:文档原始数据
_all:所有字段的连接字符串

2.文档的增删改

创建索引文档
①使用自己的ID创建:

PUT {index}/{type}/{id}
{
  "field": "value",
  ...
}
②ES内置ID创建:
POST {index}/{type}/
{
  "field": "value",
  ...
}

①②ES响应内容:

{
"_index": "itsource",
"_type": "employee",
"_id": xxxxxx,
"_version": 1, //文档版本号
"created": true //是否新增
}

③ 获取指定ID的文档
GET itsource/employee/123?pretty --没有效果 经过格式化
③返回的内容:

{
"_index" : "itsource",
"_type" : "employee",
"_id" : "123",
"_version" : 1,
"found" : true,
"_source" : {
   "email": "laozheng@itsource.cn",
   "fullName": "老郑",
   ...
   "joine_date": "2016-06-01"
}
}

返回文档的部分字段:
GET默认返回整个文档,通过GET /itsource/employee/123?_source=fullName,email
只返回文档内容,不要元数据:

GET itsource/employee/123/_source

④ 修改文档
更新整个文档

post {index}/{type}/{id}
{
   Id:1,
   Name:xx
}

在响应中,我们可以看到Elasticsearch把 _version 增加了。

{
...
"_version" : 2,
"created": false
}

created 标识为 false 因为同索引、同类型下已经存在同ID的文档。
在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档。旧版本文档不会立即消失,但你也不能去访问它。Elasticsearch会在你继续索引更多数据时清理被删除的文档。
局部更新文档
接受一个局部文档参数 doc,它会合并到现有文档中,对象合并在一起,存在的标量字段被覆盖,新字段被添加。

POST itsource/employee/123/_update
{
“doc”:{
"email" : "nixianhua@itsource.cn", 
"salary": 1000
}
}

email会被更新覆盖,salary会新增。
这个API 似乎 允许你修改文档的局部,但事实上Elasticsearch
遵循与之前所说完全相同的过程,这个过程如下:

  1. 从旧文档中检索JSON
  2. 修改它
  3. 删除旧文档
  4. 索引新文档
    脚本更新文档 --了解
    也可以通过使用简单的脚本来进行。这个例子使用一个脚本将age加5:
POST itsource/emploee/123/_update
{
"script" : "ctx._source.age += 5"
}

在上面的例子中, ctx._source指向当前被更新的文档。
注意,目前的更新操作只能一次应用在一个文档上。
删除文档
DELETE {index}/{type}/{id}
存在文档的返回:

{
"found" : true,
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 3
}

不存在的返回:

{
"found" : false,
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 4
}

注意:尽管文档不存在,但_version依旧增加了。这是内部记录的一部分,它确保在多节点间不同操作可以有正确的顺序。
批量操作bulk API – 后台java程序api
使用单一请求来实现多个文档的create、index、update 或 delete。
Bulk请求体格式:

{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n

每行必须以 “\n” 符号结尾,包括最后一行。这些都是作为每行有效的分离而做的标记。
create当文档不存在时创建之。
index创建新文档或替换已有文档。
update局部更新文档。
delete删除一个文档。
例如:

POST _bulk
{ "delete": { "_index": "itsource", "_type": "employee", "_id": "123" }}
{ "create": { "_index": "itsource", "_type": "blog", "_id": "123" }}
{ "title": "我发布的博客" }
{ "index": { "_index": "itsource", "_type": "blog" }}
{ "title": "我的第二博客" }

注意:delete后不需要请求体,最后一行要有回车

发布了8 篇原创文章 · 获赞 0 · 访问量 92
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览