ElasticSearch入门

文章目录

一、ElasticSearch简介

1、什么是ElasticSearch

       Elaticsearch,简称为es, es是⼀个开源的⾼扩展的分布式全⽂检索引擎,它可以近乎实时的存储、检索数据;本⾝扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使⽤Java开发并使⽤Lucene作为其核⼼来实现所有索引和搜索的功能,但是它的⽬的是通过简单的RESTful API来隐藏Lucene的复杂性,从⽽让全⽂搜索变得简单。
       补充: 什么是全文检索     Lucene的介绍和使用

2、ElasticSearch使用案例

  • 2013年初,GitHub抛弃了Solr,采取ElasticSearch 来做PB级的搜索。 “GitHub使⽤ElasticSearch搜索20TB的数据,包括13亿⽂件和1300亿⾏代码”
  • 维基百科:启动以elasticsearch为基础的核⼼搜索架构
  • SoundCloud:“SoundCloud使⽤ElasticSearch为1.8亿⽤户提供即时⽽精准的⾳乐搜索服务”
  • 百度:百度⽬前⼴泛使⽤ElasticSearch作为⽂本数据分析,采集百度所有服务器上的各类指标数据及⽤户⾃定义数据,通过对各种数据进⾏多维分析展⽰,辅助定位分析实例异常或业务层⾯异常。⽬前覆盖百度内部20多个业务线(包括casio、云分析、⽹盟、预测、⽂库、直达号、钱包、风控等),单集群最⼤100台机器,200个ES节点,每天导⼊30TB+数据
  • 新浪使⽤ES 分析处理32亿条实时⽇志
  • 阿⾥使⽤ES 构建挖财⾃⼰的⽇志采集和分析体系

3、ElasticSearch对⽐Solr

  • Solr 利⽤ Zookeeper 进⾏分布式管理,⽽ Elasticsearch ⾃⾝带有分布式协调管理功能;
  • Solr ⽀持更多格式的数据,⽽ Elasticsearch 仅⽀持json⽂件格式;
  • Solr 官⽅提供的功能更多,⽽ Elasticsearch 本⾝更注重于核⼼功能,⾼级功能多有第三⽅插件提供;
  • Solr 在传统的搜索应⽤中表现好于 Elasticsearch,但在处理实时搜索应⽤时效率明显低于Elasticsearch

二、ElasticSearch相关概念(术语)

1,概述

       Elasticsearch是⾯向⽂档(document oriented)的,这意味着它可以存储整个对象或⽂档(document)。然⽽它不仅仅是存储,还会索引(index)每个⽂档的内容使之可以被搜索。在Elasticsearch中,你可以对⽂档(⽽⾮成⾏成列的数据)进⾏索引、搜索、排序、过滤。Elasticsearch对⽐传统关系型数据库如下:
在这里插入图片描述

2,索引 index

       ⼀个索引就是⼀个拥有⼏分相似特征的⽂档的集合。⽐如说,你可以有⼀个客户数据的索引,另⼀个产品⽬录的索引,还有⼀个订单数据的索引。⼀个索引由⼀个名字来标识(必须全部是⼩写字母的),并且当我们要对对应于这个索引中的⽂档进⾏索引、搜索、更新和删除的时候,都要使⽤到这个名字。在⼀个集群中,可以定义任意多的索引。

3,类型 type

       在⼀个索引中,你可以定义⼀种或多种类型。⼀个类型是你的索引的⼀个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有⼀组共同字段的⽂档定义⼀个类型。⽐如说,我们假设你运营⼀个博客平台并且将你所有的数据存储到⼀个索引中。在这个索引中,你可以为⽤户数据定义⼀个类型,为博客数据定义另⼀个类型,当然,也可以为评论数据定义另⼀个类型。

4,字段 Field

       相当于是数据表的字段,对⽂档数据根据不同属性进⾏的分类标识

5,映射 mapping

       mapping是处理数据的⽅式和规则⽅⾯做⼀些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射⾥⾯可以设置的,其它就是处理es⾥⾯数据的⼀些使⽤规则设置也叫做映射,按着最优规则处理数据对性能提⾼很⼤,因此才需要建⽴映射,并且需要思考如何建⽴映射才能对性能更好。

6,⽂档 document

       ⼀个⽂档是⼀个可被索引的基础信息单元。⽐如,你可以拥有某⼀个客户的⽂档,某⼀个产品的⼀个⽂档,当然,也可以拥有某个订单的⼀个⽂档。⽂档以JSON(Javascript Object Notation)格式来表⽰,⽽JSON是⼀个到处存在的互联⽹数据交互格式。
       在⼀个index/type⾥⾯,你可以存储任意多的⽂档。注意,尽管⼀个⽂档,物理上存在于⼀个索引之中,⽂档必须被索引/赋予⼀个索引的type。

7,接近实时 NRT

       Elasticsearch是⼀个接近实时的搜索平台。这意味着,从索引⼀个⽂档直到这个⽂档能够被搜索到有⼀个轻微的延迟(通常是1秒以内)

8,集群 cluster

       ⼀个集群就是由⼀个或多个节点组织在⼀起,它们共同持有整个的数据,并⼀起提供索引和搜索功能。⼀个集群由⼀个唯⼀的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为⼀个节点只能通过指定某个集群的名字,来加⼊这个集群

9,节点 node

       ⼀个节点是集群中的⼀个服务器,作为集群的⼀部分,它存储数据,参与集群的索引和搜索功能。和集群类似,⼀个节点也是由⼀个名字来标识的,默认情况下,这个名字是⼀个随机的漫威漫画⾓⾊的名字,这个名字会在启动的时候赋予节点。这个名字对于管理⼯作来说挺重要的,因为在这个管理过程中,你会去确定⽹络中的哪些服务器对应于Elasticsearch集群中的哪些节点。
       ⼀个节点可以通过配置集群名称的⽅式来加⼊⼀个指定的集群。默认情况下,每个节点都会被安排加⼊到⼀个叫做“elasticsearch”的集群中,这意味着,如果你在你的⽹络中启动了若⼲个节点,并假定它们能够相互发现彼此,它们将会⾃动地形成并加⼊到⼀个叫做“elasticsearch”的集群中。
       在⼀个集群⾥,只要你想,可以拥有任意多个节点。⽽且,如果当前你的⽹络中没有运⾏任何Elasticsearch节点时,这时启动⼀个节点,会默认创建并加⼊⼀个叫做“elasticsearch”的集群。

10,分⽚和复制 shards&replicas

       当⼀个索引需要存储的数据超出单个结点硬件限制的最大数据时,⽐如,⼀个具有10亿⽂档的索引占据1TB的磁盘空间,⽽任⼀节点都没有这样⼤的磁盘空间;或者单个节点处理搜索请求,响应太慢时。该如何解决?
       为了解决这个问题,Elasticsearch提供了将索引划分成多份的能⼒,这些份就叫做分⽚。当你创建⼀个索引的时候,你可以指定你想要的分⽚的数量。每个分⽚本⾝也是⼀个功能完善并且独⽴的“索引”,这个“索引”可以被放置到集群中的任何节点上。分⽚很重要,主要有两⽅⾯的原因:

              (1)允许你⽔平分割/扩展你的内容容量。
              (2)允许你在分⽚(位于多个节点上)之上进⾏分布式的、并⾏的操作,进⽽提⾼性能/吞吐量。

       ⾄于⼀个分⽚怎样分布,它的⽂档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为⽤户的你来说,这些都是透明的。
       在⼀个⽹络/云的环境⾥,失败随时都可能发⽣,在某个分⽚/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有⼀个故障转移机制是⾮常有⽤并且是强烈推荐的。为此⽬的,Elasticsearch允许你创建分⽚的⼀份或多份拷贝,这些拷贝叫做复制分⽚,或者直接叫复制。
       复制之所以重要,有两个主要原因: 在分⽚/节点失败的情况下,提供了⾼可⽤性。因为这个原因,注意到复制分⽚从不与原/主要(original/primary)分⽚置于同⼀节点上是⾮常重要的。l另外,复制可以扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并⾏运⾏。
       总之,每个索引可以被分成多个分⽚。⼀个索引也可以被复制0次(意思是没有复制)或多次。⼀旦复制了,每个索引就有了主分⽚(作为复制源的原来的分⽚)和复制分⽚(主分⽚的拷贝)之别。分⽚和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分⽚的数量。
       默认情况下,Elasticsearch中的每个索引被分⽚5个主分⽚和1个复制,这意味着,如果你的集群中⾄少有两个节点,你的索引将会有5个主分⽚和另外5个复制分⽚(1个完全拷贝),这样的话每个索引总共就有10个分⽚。
在这里插入图片描述

三、ElasticSearch使用

1,Elasticsearch 安装

参考链接:es下载安装
也可自寻参考网上教程

2,Elasticsearch 客户端操作

2.1,elasticsearch-head安装

参考链接:elasticsearch-head安装和使用
如若es相关软件或插件的安装使用出现问题请自寻参考网上教程

2.2,使⽤Postman⼯具进⾏Restful接⼜访问
2.2.1,ElasticSearch 的接口语法

在这里插入图片描述

2.2.2,创建索引 index 和映射 mapping

请求url:

PUT 192.168.220.100:9200/blog1

请求体:

{
   
	"mappings": {
   
		"article": {
   
			"properties": {
   
				"id": {
   
					"type": "long",
					"store": true,
					"index":"not_analyzed"
				},
				"title": {
   
					"type": "text",
					"store": true,
					"index":"analyzed",
					"analyzer":"standard"
				},
				"content": {
   
					"type": "text",
					"store": true,
					"index":"analyzed",
					"analyzer":"standard"
				}
			}
		}
	}
}

elasticsearch-head查看:
在这里插入图片描述

2.2.3,创建索引后设置 Mapping

       我们可以在创建索引时设置mapping信息,当然也可以先创建索引然后再设置mapping。在上⼀个步骤中创建索引时不设置请求体,即不设置mapping信息,直接使⽤put⽅法创建⼀个索引,然后使用post方法来提交mapping信息。

请求的url:

POST http://192.168.220.100:9200/blog2/hello/_mapping

请求体:

{
   
	"hello": {
   
		"properties": {
   
			"id":{
   
				"type":"long",
				"store":true
			},
			"title":{
   
				"type":"text",
				"store":true,
				"index":true,
				"analyzer":"standard"
			},
			"content":{
   
				"type":"text",
				"store":true,
				"index":true,
				"analyzer":"standard"
			}
		}
	}
}
2.2.4,删除索引 index

请求url:

DELETE 192.168.220.100:9200/blog1

elasticsearch-head查看:
在这里插入图片描述

2.2.5,创建⽂档 document

请求url:

POST 192.168.220.100:9200/blog1/article/1

请求体:

{
   
	"id":1,
	"title":"ElasticSearch是⼀个基于Lucene的搜索服务器",
	"content":"它提供了⼀个分布式多⽤户能⼒的全⽂搜索引擎,基于RESTful web接⼝。
	Elasticsearch是⽤Java开发的,并作为Apache许可条款下的开放源码发布,是当前流⾏的企业级搜
	索引擎。设计⽤于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使⽤⽅便。"
}

elasticsearch-head查看:
在这里插入图片描述

2.2.6,修改⽂档 document

修改文档其实就是添加一个id相同的文档

请求url:

POST 192.168.220.100:9200/blog1/article/1

请求体:

{
   
	"id":1,
	"title":"【修改】ElasticSearch是⼀个基于Lucene的搜索服务器",
	"content":"【修改】它提供了⼀个分布式多⽤户能⼒的全⽂搜索引擎,基于RESTful web接⼝。
	Elasticsearch是⽤Java开发的,并作为Apache许可条款下的开放源码发布,是当前流⾏的企业级搜
	索引擎。设计⽤于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使⽤⽅便。"
}

elasticsearch-head查看:
在这里插入图片描述

2.2.7,删除⽂档 document

请求url:

DELETE 192.168.220.100:9200/blog1/article/1

2.2.8,查询⽂档 - 根据 id 查询

请求url:

GET 192.168.220.100:9200/blog1/article/1

elasticsearch-head查看:
在这里插入图片描述

2.2.9,查询⽂档 -querystring 查询 和 term 查询

重新添加文档之后进行查询:
请求url:

POST 192.168.220.100:9200/blog1/article/_search

分别发送以下三个请求体:
请求体1:

{
   
	"query": {
   
		"query_string": {
   
			"default_field": "title",
			"query": "搜索服务器"
		}
	}
}

请求体2:

{
   
	"query": {
   
		"query_string": {
   
			"default_field": "title",
			"query": "钢索"
		}
	}
}

请求体3:

{
   
	"query": {
   
		"term": {
   
			"title": "搜索"
		}
	}
}

结果:请求1和请求2能查询到,而请求3查询不到

原因:在创建索引时,声明了各字段以标准分词器进行分词;对于中文,标准分词器会将每一个字作为一个词;每添加一个文档(记录),便会通过分词器对其建立索引。当通过query_string的方式查询时,会通过标准分词器分词查询,所以一旦根据查询体中的某个字查询到便可;而当通过term的方式查询时,不会对查询体分词查询,此时查询体匹配不到索引中的词,所以查询不到。

我们希望,在建立索引时,使用符合中文语义的分词器进行分词;同样,在查询时,使用该分词器对查询体进行分词查询。这时,就需要用到IK分词器。

3,IK分词器

3.1,IK分词器简介

       IKAnalyzer是⼀个开源的,基于java语⾔开发的轻量级的中⽂分词⼯具包。从2006年12⽉推出1.0版开始,IKAnalyzer已经推出 了3个⼤版本。最初,它是以开源项⽬Lucene为应⽤主体的,结合词典分词和⽂法分析算法的中⽂分词组件。新版本的IKAnalyzer3.0则发展为 ⾯向Java的公⽤分词组件,独⽴于Lucene项⽬,同时提供了对Lucene的默认优化实现。

IK分词器3.0的特性如下:

  • 采⽤了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的⾼速处理能⼒。
  • 采⽤了多⼦处理器分析模式,⽀持:英⽂字母(IP地址、Email、URL)、数字(⽇期,常⽤中⽂数量词,罗马数字,科学计数法),中⽂词汇(姓名、地名处理)等分词处理。
  • 对中英联合⽀持不是很好,在这⽅⾯的处理⽐较⿇烦.需再做⼀次查询,同时是⽀持个⼈词条的优化的词典存储,更⼩的内存占⽤。
  • ⽀持⽤户词典扩展定义。
  • 针对Lucene全⽂检索优化的查询分析器IKQueryParser;采⽤歧义分析算法优化查询关键字的搜索排列组合,能极⼤的提⾼Lucene检索的命中率。
3.2,IK分词器安装使用

ik分词器版本需要与es版本一致
参考链接:ik分词器安装

使用示例(创建索引时使用):
在这里插入图片描述

ik_max_word:会将⽂本做最细粒度的拆分

  • ⽐如会将“中华⼈民共和国⼈民⼤会堂”拆分为“中华⼈民共和国、中华⼈民、中华、华⼈、⼈民共和国、⼈民、共和国、⼤会堂、⼤会、会堂等词语。

ik_smart:会做最粗粒度的拆分

  • ⽐如会将“中华⼈民共和国⼈民⼤会堂”拆分为中华⼈民共和国、⼈民⼤会堂。

四、Kibana使⽤-掌握DSL语句

1,Kibana简介

       我们上⾯使⽤的是elasticsearch-head插件实现数据查找的,但是elasticsearch-head的功能⽐较单⼀,我们这⾥需要⼀个更专业的⼯具实现对⽇志的实时分析,也就是我们接下来要讲的kibana。
       Kibana 是⼀款开源的数据分析和可视化平台,它是 Elastic Stack 成员之⼀,设计⽤于和 Elasticsearch协作。您可以使⽤ Kibana 对 Elasticsearch 索引中的数据进⾏搜索、查看、交互操作。您可以很⽅便的利⽤图表、表格及地图对数据进⾏多元化的分析和呈现。
       Kibana 可以使⼤数据通俗易懂。它很简单,基于浏览器的界⾯便于您快速创建和分享动态数据仪表板来追踪 Elasticsearch 的实时数据变化。
       搭建 Kibana ⾮常简单。您可以分分钟完成 Kibana 的安装并开始探索 Elasticsearch 的索引数据 — 没有代码、不需要额外的基础设施。

2,Kibana下载安装

参考链接:Kibana安装

3,Kibana使用

3.1,配置索引

要使⽤Kibana,您必须⾄少配置⼀个索引。索引⽤于标识Elasticsearch索引以运⾏搜索和分析。它们还⽤于配置字段。
在这里插入图片描述
我们修改索引名称的匹配⽅式即可,下⾯2个选项不⽤勾选。点击create,会展⽰出当前配置的索引的域信息,如下图:
在这里插入图片描述
域的每个标题选项分别代表如下意思:
在这里插入图片描述

3.2,数据搜索

Discover为数据搜索部分,可以对⽇志信息进⾏搜索操作。
在这里插入图片描述
可以使⽤Discover实现数据搜索过滤和搜索条件显⽰以及关键词搜索,如下图:在这里插入图片描述

3.3,DSL 语句使用
3.3.1,Query DSL结构化查询介绍

       Query DSL是⼀个Java开源框架⽤于构建类型安全的SQL查询语句。采⽤API代替传统的拼接字符串来构造查询语句。⽬前Querydsl⽀持的平台包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。elasticsearch提供了⼀整套基于JSON的DSL语⾔来定义查询。

3.3.2,查询所有索引

DSL语句:

GET /_cat/indices?v

结果如下:
在这里插入图片描述

3.3.3,删除某个索引

DSL语句:

DELETE /skuinfo

结果如下:
在这里插入图片描述

3.3.4,新增索引

DSL语句:

PUT /user

结果如下:
在这里插入图片描述

3.3.5,创建映射

DSL语句:

PUT /user/userinfo/_mapping
{
   
	"properties": {
   
		"name":{
   
			"type": "text",
			"analyzer": "ik_smart",
			"search_analyzer": "ik_smart"
		},
		"city":{
   
			"type": "text",
			"analyzer": "ik_smart",
			"search_analyzer": "ik_smart"
		},
		"age":{
   
			"type": "long"
		},
		"description":{
   
			"type": "text",
			"analyzer": "ik_smart",
			"search_analyzer": "ik_smart"
		}
	}
}
3.3.6,新增⽂档数据

DSL语句:

PUT /user/userinfo/1
{
   
	"name":"李四",
	"age":22,
	"city":"深圳",
	"description":"李四来⾃湖北武汉!"
}
#新增⽂档数据 id=4
PUT /user/userinfo/4
{
   
	"name":"张三丰",
	"age":66,
	"city":"武汉",
	"description":"在武汉读书,家在武汉!"
}
#新增⽂档数据 id=5
PUT /user/userinfo/5
{
   
	"name":"赵⼦⻰",
	"age":77,
	"city":"⼴州",
	"description":"赵⼦⻰来⾃深圳宝安,但是在⼴州⼯作!",
	"address":"⼴东省茂名市" #该文档多添加一个字段
}
3.3.7,修改⽂档数据

(1)替换操作
更新数据可以使⽤之前的增加操作,这种操作会将整个数据替换掉。
DSL语句:

#更新数据,id=4
PUT /user/userinfo/4
{
   
	"name":"张三丰",
	"description":"在武汉读书,家在武汉!在深圳⼯作!"
}

效果如下:
在这里插入图片描述
使⽤GET命令查看:GET /user/userinfo/4
效果如下:
在这里插入图片描述
(2)更新操作
我们先使⽤下⾯命令恢复数据:

#恢复⽂档数据 id=4
PUT /user/userinfo/4
{
   
	"name":"张三丰",
	"age":66,
	"city":"武汉",
	"description":"在武汉读书,家在武汉!"
}

使⽤POST更新某个列的数据

#使⽤POST更新某个域的数据
POST /user/userinfo/4/_update
{
   
	"doc":{
      #单独更改部分字段必须有
		"name":"张三丰",
		"description":"在武汉读书,家在武汉!在深圳⼯作!"
	}
}

效果如下:
在这里插入图片描述
使⽤GET命令查看:GET /user/userinfo/4
在这里插入图片描述

3.3.8,删除Document

DELETE /user/userinfo/7

3.3.9,查询所有数据

GET /user/_search

3.3.10,根据ID查询

GET /user/userinfo/2

3.3.11,Sort排序

DSL语句:

#搜索排序
GET /user/_search
{
   
	"query":{
   
		"match_all": {
   }
	},
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我待Java如初恋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值