ES(ElasticSearch)的认识


ES(ElasticSearch)的认识

为什么要使用ES

虽然全文搜索领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。

但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene的配置及使用非常复杂,你需要深入了解检索的777相关知识来理解它是如何工作的。

什么是es

es : 做全文检索的 ,底层基于lucene的开发

​ lucene 相等于jdbc

​ es 相当于 mybatis/jpa

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和lucene的比较

为什么需要使用es.为什么不用lucene?

(1)api操作很麻烦 不方便

​ 搜索 : 创建索引 搜索索引 一堆api

​ es: get /product/1 – {}

(2)lucene不支持集群

​ es集群 处理很大的数据量

ES和solr的区别

es 和 solr 都可以做全文检索,solr的重量级的框架,它除了全文检索以外,还可以做其他的事情(比如

命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)),solr可以nosql结合起来使用

solr 在传统的搜索效率要比es好,但是实时搜索领域比es低

使用ES

安装ES服务端

ES服务只依赖于JDK,推荐使用JDK1.7+

  • 下载ES安装包

    官方下载地址:https://www.elastic.co/downloads/elasticsearch

    解压–>bin/elasticsearch.bat–>浏览器访问 http://localhost:9200/

    ​ 9200web里面展示的效果 9300java程序可以访问的端口

  • 运行ES

    bin/elasticsearch.bat

在这里插入图片描述

当看到上图就说明ES集群已经启动并且正常运行

es的客户端的交互方式

  1. 基于restful风格API的去操作

    ES和所有客户端的交互都是使用JSON格式的数据.

    其他所有程序语言都可以使用RESTful API,通过9200端口的与ES进行通信

    get post put delete patch

    1. curl的命令方式 --不用

    2. kibana也可以操作

    3. head工具

      安装的时候,如果出现错误:

在这里插入图片描述

在这里插入图片描述
4. postman(测试后台的java代码)

  1. 通过java代码去操作

    java通过9300操作es服务器

restful风格 +JSON方式 操作数据

​ http特点 就是无状态的

​ get /shopping/1

​ put /shopping/2 {“name”:“xx产品”}

​ post /shopping/2 {“name”:“xx产品”}

​ delete /shopping/1

扩展:Restful认识

Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作

使用Restful的好处

透明性,暴露资源存在。

充分利用 HTTP 协议本身语义。

无状态,这点非常重要。在调用一个接口(访问、操作资源)的时候,可以不用考虑上下文,不用考虑当前状态,极大的降低了复杂度。

HTTP 本身提供了丰富的内容协商手段,无论是缓存,还是资源修改的乐观并发控制,都可以以业务无关的中间件来实现

Restful的典型特征

  1. Server提供的RESTful API中,URL中只使用名词来指定资源。

    “资源”是REST架构或者说整个网络处理的核心。比如:

    GET http://api.itsource.cn/emp/323: 获取323号员工的基本资料;

    GET http://api.itsource.cn/emps: 获取源码时代所有员工资料列表;

  2. REST 是面向资源的,这个概念非常重要,而资源是通过 URI 进行暴露

    URI 的设计只要负责把资源通过合理方式暴露出来就可以了。对资源的操作与它无关,所以REST 通过 URI 暴露资源时,会强调不要在 URI 中出现动词

    比如:左边是错误的设计,而右边是正确的

    GET/rest/api/getDogs-> GET /rest/api/dogs 获取所有小狗狗

    GET /rest/api/addDogs -> POST/PUT /rest/api/dogs 添加一个小狗狗

    POST /rest/api/editDogs/12-> PUT/POST /rest/api/dogs/12 修改一个小狗狗

    POST /rest/api/deleteDogs/12-> DELETE /rest/api/dogs/12 删除一个小狗狗

    左边的这种设计,很明显不符合REST风格,URI 只负责准确无误的暴露资源,而 getDogs/addDogs…已经包含了对资源的操作,这是不对的。相反右边却满足了,它的操作是使用标准的HTTP动词来体现。

  3. 用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号员工

辅助管理工具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 服务器属性。

安装ES服务端

相关概念理解

(1)Near Realtime(NRT):近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级

(2)Index:索引库,包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。

(3)Type:类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。

(4)Document&field:文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。

(5)Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常

(6)Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群

(7)shard(ʃɑːrd,分片):单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。

(8)replica(ˈreplɪkə,复制品):任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。

在这里插入图片描述

下载

https://www.elastic.co/downloads/elasticsearch

正常请求我们应该在linux或者Docker安装,但是现在我们是学习阶段,就在window上面进行安装

安装

解压即可

可以修改内存配置

在这里插入图片描述

在这里插入图片描述

启动

bin/elasticsearch.bat

在这里插入图片描述

测试 -web端口

http://localhost:9200

集群健康状态

针对一个索引,Elasticsearch 中其实有专门的衡量索引健康状况的标志,分为三个等级:

green,绿色。这代表所有的主分片和副本分片都已分配。你的集群是 100% 可用的

yellow,黄色。所有的主分片已经分片了,但至少还有一个副本是缺失的不会有数据丢失,所以搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。如果更多的分片消失,你就会丢数据了。所以可把 yellow 想象成一个需要及时调查的警告。

red,红色。至少一个主分片以及它的全部副本都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。如果你只有一台主机的话,其实索引的健康状况也是 yellow,因为一台主机,集群没有其他的主机可以防止副本,所以说,这就是一个不健康的状态,因此集群也是十分有必要的

文档的crud

基本的CRUD

# 完成crud
# 新增
PUT  crm/employee/1
{
  "name":"xiaorong",
  "age":18
}

# 修改 --整个文档
POST crm/employee/1
{
  "name":"xiaohuahua"
}
# 修改局部文档
POST crm/employee/1/_update
{
  "doc":{"name":"xiaohuahua"}
}

# 查询
GET crm/employee/1

# 删除
DELETE crm/employee/1

特殊的用法

# 展示没有什么效果(了解)
GET crm/employee/AW-tOSHILqo6XVH8f6cg?pretty

# 展示部分的字段

GET crm/employee/AW-tOSHILqo6XVH8f6cg?_source=age,name

# 返回元数据
GET crm/employee/AW-tOSHILqo6XVH8f6cg/_source

# 修改数据 (脚本修改 --了解)
POST crm/employee/AW-tOSHILqo6XVH8f6cg/_update
{
"script" : "ctx._source.age += 5"
}

# 批量新增 --了解
POST _bulk
{ "delete": { "_index": "itsource", "_type": "employee", "_id": "123" }}
{ "create": { "_index": "itsource", "_type": "blog", "_id": "123" }}
{ "title": "我发布的博客111" }
{ "index": { "_index": "itsource", "_type": "blog" }}
{ "title": "我的第二博客2222" }


GET itsource/blog/_search

文档的查询

通过id查询

GET crm/employee/AW-tOSHILqo6XVH8f6cg/_source

批量查询

#  不同库 不同表数据 (了解)
GET _mget
{
"docs" : [
{
"_index" : "itsource",
"_type" : "blog",
"_id" : "123"
},
{
"_index" : "crm",
"_type" : "employee",
"_id" : "AW-tOSHILqo6XVH8f6cg",
"_source": ["name","age"]
}
]
}

#  同一个库 同一个表数据
GET itsource/blog/_mget
{
  "ids":["123","AW-tQP_4Lqo6XVH8f6ci"]
}

其他的查询

# 分页查询
GET crm/employee/_search?size=3&from=6

# 带条件查询
GET crm/employee/_search?q=age:38
GET crm/employee/_search?q=age[18 TO 48]
发布了54 篇原创文章 · 获赞 9 · 访问量 854

猜你喜欢

转载自blog.csdn.net/qq_40629521/article/details/104012338