Elasticsearch详细总结

Elasticsearch
1.1、什么是Elasticsearch
Elasticsearch,简称Es,Es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。ES使用Java开发。Lucene作为其核心来实现所有的索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
在这里插入图片描述

1.2、Elasticsearch的使用案例
(1)百度:百度目前广泛使用Elasticsearch作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部20多个业务线(包括casio、云分析、网盟、预测、文库、直达号、钱包、风控等),单集群最大100台机器,200个ES节点,每天导入30TB+数据
(2)新浪使用ES分析处理32条实时日志
(3)阿里使用ES构建挖财自己的日志采集和分析体系
(4)2013年初,GitHub抛弃了Solr,采用Elasticsearch来做PB级的搜索。“GitHub使用Elasticsearch搜索20TB的数据,包括13亿文件和1300亿行代码”
(5)维基百科:启动以Elasticsearch为基础的核心搜索框架
(6)SoundCloud:“SoundCloud使用Elasticsearch为1.8亿用户提供即时而准确的音乐搜索服务”
1.3、Es企业使用场景
企业使用场景一般分为2中情况:
(1)已经上线的系统:
模块搜索功能使用数据库查询实现,但是已经出现性能问题,或者不满足产品的高亮相关度排序需求时。这种情况就会对系统的查询功能进行技术改造,转而使用全文检索,而es就是首选。改造业务流程如图:
在这里插入图片描述

(2)系统新增加的模块
产品一开始就要实现高亮相关度排序等全文检索的功能。针对这种情况,企业实现功能业务流程如图:
在这里插入图片描述(3)索引库存什么数据
索引库的数据是用来搜索用的,里面存储的数据和数据库一般不会是完全一样的,一般都比数据库的数据少。
那索引库存什么数据呢?
以业务需求为准,需求决定页面要显示什么字段以及会按什么字段进行搜索,那么这些字段就都要保存到索引库中。
二、相关软件的安装
2.1、Elasticsearch安装
(1)下载ES压缩包
Elasticsearch的官方地址:https://www.elastic.co/cn/downloads/past-releases
在这里插入图片描述(2)安装ES服务
Window版的Elasticsearch的安装很简单,类似Window版的Tomcat,解压开即安装完毕,解压后的Elasticsearch的目录结构如下:
在这里插入图片描述

(3)启动ES服务
点击Elasticsearch下的bin目录下的Elasticsearch.bat启动,控制台显示的日志信息如下:
在这里插入图片描述在这里插入图片描述注意:9300是tcp通讯端口,集群间和TCP客户端都执行该端口,9200是http协议的RESTful接口。
通过浏览器访问Elasticsearch服务器,看到如下返回的json信息,代表服务启动成功:
在这里插入图片描述注意:Elasticsearch是使用java开发的,且本版本的es需要的jdk版本要是1.8及以上,所以安装Elasticsearch之前保证JDK1.8+安装完毕,并正确的配置好JDK环境变量,否则启动Elasticsearch失败。
2.2、安装ES插件ElasticSearch-head
(1)在Chrome浏览器地址栏中输入:chrome://extensions/
在这里插入图片描述

(2)打开Chrome扩展程序的开发者模式
(3)将资料中的ElasticSearch-head-Chrome插件拖入浏览器的插件页面:
在这里插入图片描述(4)最后即可安装成功在这里插入图片描述2.3、安装Kibana
(1)什么是Kibana
Kibana是Elasticsearch的数据可视化和实时分析的工具,利用Elasticsearch的聚合功能,生成各种图表,如柱形图,线状图,饼图等。
https://www.elastic.co/cn/products/kibana
在这里插入图片描述(2)安装配置
在这里插入图片描述

①解压即安装成功
②进入安装目录下的config目录的kibana.yml文件

修改elasticsearch服务器的地址:
elasticsearch.url: “http://localhost:9200”

在这里插入图片描述修改kibana配置支持中文:
i18n.locale: “zh-CN”在这里插入图片描述(3)运行访问
①进入安装目录下的bin目录
②双击运行kibana.bat,启动成功在这里插入图片描述③发现kibnan的监听端口是5601,我们访问:http://127.0.0.1:5601
在这里插入图片描述2.4安装Postman
Postman中文版是Postman这款强大网页吊事工具的windows客户端,提供功能强大的Web Api和HTTP请求调试。软件功能强大,界面简介明晰、操作方便快捷,设计得很人性化。Postman中文版能够发送任何类型的HTTP请求(GET, HEAD, POST, PUT…),不仅能够表单提交,且可以附带任意类型请求体。在这里插入图片描述(1)下载Postman工具
Postman官网:https://www.getpostman.com
在这里插入图片描述

(2)界面

在这里插入图片描述2.5、集成IK分词器
Lucene的IK分词器早在2012年已经没有维护了,现在我们要使用的是在其基础上维护升级的版本,并且开发为Elasticsearch的集成插件了,与Elasticsearch一起维护升级,版本也保持一致。
GitHub仓库地址:https://github.com/medcl/elasticsearch-analysis-ik
下载插件:在这里插入图片描述(1)安装插件

插件已经在资料中准备好了,解压之后,存放到D:\elasticsearch-6.8.0\plugins\目录中,即可安装成功插件。
在这里插入图片描述

注意:解压的时候,如下文件必须在plugins目录的第一级目录下

在这里插入图片描述

重新启动ElasticSearch之后,看到如下日志代表安装成功
在这里插入图片描述(3)测试
IK分词器有两种分词模式:ik_max_word和it_smart模式
①ik_max_word:会将文本做最细粒度的拆分
②it_smart:会做最粗粒度的拆分(智能拆分)
请求方式:POST
请求url:http://127.0.0.1:9200/_analyze
请求体:
{
“analyzer”: “ik_smart”,
“text”: “南京市长江大桥”
}
在这里插入图片描述

最细粒度的拆分结果:
{
“tokens”: [
{
“token”: “南京市”,
“start_offset”: 0,
“end_offset”: 3,
“type”: “CN_WORD”,
“position”: 0
},
{
“token”: “南京”,
“start_offset”: 0,
“end_offset”: 2,
“type”: “CN_WORD”,
“position”: 1
},
{
“token”: “市长”,
“start_offset”: 2,
“end_offset”: 4,
“type”: “CN_WORD”,
“position”: 2
},
{
“token”: “市”,
“start_offset”: 2,
“end_offset”: 3,
“type”: “CN_CHAR”,
“position”: 3
},
{
“token”: “长江大桥”,
“start_offset”: 3,
“end_offset”: 7,
“type”: “CN_WORD”,
“position”: 4
},
{
“token”: “长江”,
“start_offset”: 3,
“end_offset”: 5,
“type”: “CN_WORD”,
“position”: 5
},
{
“token”: “大桥”,
“start_offset”: 5,
“end_offset”: 7,
“type”: “CN_WORD”,
“position”: 6
}
]
}
智能拆分结果:
在这里插入图片描述

{
“tokens”: [
{
“token”: “南京市”,
“start_offset”: 0,
“end_offset”: 3,
“type”: “CN_WORD”,
“position”: 0
},
{
“token”: “长江大桥”,
“start_offset”: 3,
“end_offset”: 7,
“type”: “CN_WORD”,
“position”: 1
}
]
}

(3)添加扩展词典和停用词典
停用词:有些词在文本中出现的频率非常高。但对文本的语义产生不了多大的影响。例如英文的a、an、the、of等。或中文的”的、了、呢等”。这样的词称为停用词。停用词经常被过滤掉,不会被进行索引。在检索的过程中,如果用户的查询词中含有停用词,系统会自动过滤掉。停用词可以加快索引的速度,减少索引库文件的大小。
扩展词:就是不想让哪些词被分开,让他们分成一个词。比如上面的江大桥
南京市长江大桥

自定义扩展词库
①进入到D:\elasticsearch-6.8.0\plugins\elasticsearch-analysis-ik-6.8.0\config目录下, 新增自定义词典myext_dict.dic

输入 :江大桥
在这里插入图片描述

②将我们自定义的扩展词典文件,配置到IKAnalyzer.cfg.xml文件中
在这里插入图片描述

③然后重启:
在这里插入图片描述

④进行测试:
在这里插入图片描述{
“tokens”: [
{
“token”: “南京市”,
“start_offset”: 0,
“end_offset”: 3,
“type”: “CN_WORD”,
“position”: 0
},
{
“token”: “市长”,
“start_offset”: 3,
“end_offset”: 5,
“type”: “CN_WORD”,
“position”: 1
},
{
“token”: “江大桥”,
“start_offset”: 5,
“end_offset”: 8,
“type”: “CN_WORD”,
“position”: 2
}
]
}

三、Elasticsearch核心概念
Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。Elasticsearch比传统关系型数据库如下:
索引库(indexes)-------------数据库(Databases)
类(type)-------------------数据表(Table)
文档(Document)-------------行(Row)
字段(Field)----------------列(Columns)
映射配置(mappings)----------DDL

详细说明:

概念说明
索引库(indexs)索引库包含一堆相关业务,结构相似的文档document数据,比如说建立一个商品product索引库,里面可能就存放了所有的商品数据。
类型(type)Type是索引库中的一个逻辑数据分类,一个type下的document,都有相同的field,类似于数据库中的表。比如商品type,里边存放了所有的商品document数据。6.0版本以后一个index只能有1个type,6.0版本以前每个index里可以是一个或多个type
文档(document)文档是es中的存入索引库最小数据单元,一个document可以是一条客户数据,一条商品数据,一条订单数据,通常用JSON数据结构表示。Document存在索引库下的type类型中。
字段(filed)field是Elasticsearch的最小单位。一个document里面有多个field,每个field就是一个数据字段
映射配置(mappings)对type文档结构的约束叫做映射(mapping),用来定义document的每个字段的约束。如:字段的数据类型、是否分词、是否索引、是否存储等特性。Type是模拟mysql中的table概念。表示有结构的,也就是表中每个字段都有约束信息;

四、操作Elasticsearch
说明文档地址: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
实际开发中,有五种方式操作Elasticsearch服务:
(1)第一种,Elasticsearch的RESTful接口直接操作。
(2)第二种,Elasticsearch提供的Java API进行操作。
(3)第三种,Spring Data Elasticsearch进行操作。
(4)第四种,Elasticsearch-head-master图形化界面操作。
(5)第五种,Kibana进行操作。
在这里插入图片描述Elasticsearch的RESTful接口
HTTP协议请求的规范
请求方法:
请求地址:😕/:/ ?<Query_String>
请求体:

参数解释
Verb适当的HTTP方法或谓词:GET、 POST、 PUT、 HEAD 或者 DELETE。
Protocolhttp或者https(如果你在Elasticsearch前面有一个https代理)
HostElasticsearch集群任意节点的主机名,或者用localhost代表本地机器上的节点
Port运行Elasticsearch HTTP服务的端口号,默认是9200
PathPath API的终端路径(例如 _count将返回集群中文档数量)。Path可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。
Query_String任意可选的查询字符串参数(例如?pretty将格式化地输出JSON返回值,使其更容易阅读)
Body一个JSON格式的请求体(如果请求需要的话)

Mysql数据库,你都干了什么事情?
(1)创建数据库(索引库)
(2)删除数据(索引库)
(3)查询数据库(索引库)
(4)创建表(创建,查询),创建的type
(5)表内数据:增,删,改,查(根据id查询,查询所有,分页查询,模糊查询)
(6)文档增删查询
4.1、索引库操作
Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求。
(1)创建索引库
请求方法:PUT
请求地址:http://127.0.0.1:9200/blog1
请求体:无

Postman操作界面:
在这里插入图片描述{
“acknowledged”: true,
“shards_acknowledged”: true,
“index”: “blog1”
}
acknowledged代表请求成功!
(2)查看索引库
请求方法:GET
请求地址:http://127.0.0.1:9200/blog1
请求体:无
Postman操作界面:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210616211238896.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTQ5Mzc1MQ==,size_16,color_FFFFFF,t_70#pic_center

(3)删除索引库
请求方法:DELETE
请求地址:http://127.0.0.1:9200/blog1
请求体:无
Postman操作界面:在这里插入图片描述4.2、类型(type)及映射(mapping)操作
有了索引库,等于有了数据库中的database。接下来就需要索引库中的类型了,也就是数据库中的表。创建数据库表需要设置字段约束,索引库也一样,在创建索引库的类型时,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做字段映射(mapping)
字段的约束包括但不限于:
(1)字段的数据类型
(2)是否要存储
(3)是否要索引
(4)是否分词
(5)分词器是什么
我们一起来看下创建的语法。

(1)创建映射
创建映射语法
PUT /索引库名/_mapping/类型名称 或 索引库名/类型名称/_mapping
{
“properties”: {
“字段名”: {
“type”: “类型”,
“index”: true,
“store”: true,
“analyzer”: “分词器”
}
}
}
类型名称:就是前面讲的type的概念,类似于数据库中的表
字段名:任意填写,下面指定许多属性,例如:
①type:类型,可以是text、long、short、date、integer、object等
②index:是否索引,默认为true
③store:是否将数据进行独立存储,默认为false
④analyzer:分词器,这里的ik_max_word即使用ik分词器
案例:
请求方法:PUT
请求地址:http://127.0.0.1:9200/test/goods/_mapping 或http://127.0.0.1:9200/test/_mapping/goods
请求体:
{
“properties”: {
“title”: {
“type”: “text”,
“analyzer”: “ik_max_word”
},
“subtitle”: {
“type”: “text”,
“analyzer”: “ik_max_word”
},
“images”: {
“type”: “keyword”,
“index”: “false”
},
“price”: {
“type”: “float”
}
}
}
Postman操作界面:
在这里插入图片描述上述案例中,就是给test这个索引库添加一个名称为goods的类型,并且在类型中设置了4个字段:
①title:商品标题
②subtitle:商品子标题
③images:商品图片
④price:商品价格
并且给这些字段设置了一些属性,至于这些属性对应的含义,下面介绍

(2)映射属性详解
①Type
Elasticsearch中支持的数据类型非常丰富,说几个关键的:
1)String类型,又分两种
a.Text:可分词,不可参与聚合
b.Keword:不可分词,数据会作为完整字段进行匹配,可以参与聚合
2)Numerical:数值类型,分两类
a.基本数据类型:long、interger、short、byte、double、float、half_float
b.浮点数的高精度类型:scaled_float
3)Date:日期类型
4)Array:数组类型
5)Object:对象
②Index
Index影响字段的索引情况。
1)true:字段会被索引,则可以用来进行搜索。默认值就是true
2)false:字段不会被索引,不能用来搜索
Index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。
但是有些字段是我们不希望被索引的,比如商品的图片信息,就需要手动设置index为false。
③ Store
是否将数据进行独立存储。
原始的文本会存储在_source里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source里面提取出来的。当然你也可以独立的存储某个字段,只要设置store:ture即可,获取独立存储的字段要比从_source中解析快的多,但是也会占用更多的空间,所以要根据实际业务需求来设置,默认为false。
(3)查看映射
请求方法:GET
请求地址:http://127.0.0.1:9200/test/goods/_mapping 或http://127.0.0.1:9200/test/_mapping/goods
请求体:无
Postman操作界面:
在这里插入图片描述

(4)一次创建索引库及配置映射(常用)
刚才的案例中,我们就是把创建索引库和类型分开来做,其实也可以在创建索引库的同时,直接指定索引库中的类型,基本语法:
put /索引库名
{
“settings”:{
“索引库属性名”:“索引库属性值”
},
“mappings”:{
“类型名”:{
“properties”:{
“字段名”:{
“映射属性名”:“映射属性值”
}
}
}
}
}
案例:
请求方法:PUT
请求地址:http://127.0.0.1:9200/test2
请求体:
{
“settings”:{},
“mappings”:{
“goods”:{
“properties”:{
“title”:{
“type”:“text”,
“analyzer”:“ik_max_word”
},
“subtitle”:{
“type”:“text”,
“analyzer”:“ik_max_word”
},
“images”:{
“type”:“keyword”,
“index”:“false”
},
“price”:{
“type”:“float”
}
}
}
}
}
Postman操作界面:
在这里插入图片描述

4.3、文档操作
文档,即索引库中某个类型下的数据,会根据规则创建索引,将来用来搜索。可以类比做数据库中的每一行数据。
(1)新增文档
请求方法:POST
请求地址:http://127.0.0.1:9200/test2/goods
请求体:
{
“title”:“小米手机”,
“images”:“http://image.leyou.com/12479122.jpg”,
“price”:2699.00
}
Postman操作界面:
在这里插入图片描述

可以看到结果显示为:created,是创建成功了。
另外,需要注意的是,在响应结果中有个_id字段,这个就是这条文档数据的唯一标识,以后的增删改查都依赖这个id作为唯一标识。
可以看到id的值为:ovHYLG4BWrjRrOzLyYxz,这里我们新增时没有指定id,所以是ES帮我哦们随机生成的id。
(2)查看文档
根据rest风格,新增是post,查询应该是get,不过查询一般都需要条件,这里我们把刚刚生成数据的id带上。
请求方法:GET
请求地址:http://127.0.0.1:9200/test2/goods/ovHYLG4BWrjRrOzLyYxz
请求体:无
Postman操作界面:
在这里插入图片描述(3)新增文档并自定义id
请求方法:POST
请求地址:http://127.0.0.1:9200/test2/goods/1
请求体:
{
“title”:“大米手机”,
“images”:“http://image.leyou.com/12479122.jpg”,
“price”:2899.00
}在这里插入图片描述
(4)修改文档
把刚才新增的请求方式改为PUT,就是修改了。不过修改必须指定id,
①id对应文档存在,则修改
②id对应文档不存在,则新增
比如,我们把使用id为3,不存在,则应该是新增:
请求方法:PUT
请求地址:http://127.0.0.1:9200/test/goods/2
请求体:
{
“title”:“超米手机”,
“images”:“http://image.leyou.com/12479122.jpg”,
“price”:3899.00
}
Postman操作界面:
在这里插入图片描述可以看到结果是:update,显然是更新数据。
(5)删除文档
请求方法:DELETE
请求地址:http://127.0.0.1:9200/test/goods/2
请求体:无
Postman操作界面:
在这里插入图片描述4.4、查询
我们从6块来讲查询:
(1)基本查询
(2)_source过滤
(3)结果过滤
(4)高级查询
(5)排序
(6)高亮
(7)分页
导入数据,这里是采用批处理的API,大家直接复制到postman运行即可:
请求方法:POST
请求地址:http://127.0.0.1:9200/test/goods
请求体:依次导入
{“title”:“大米手机”,“images”:“http://image.leyou.com/12479122.jpg”,“price”:3288}

{“title”:“小米手机”,“images”:“http://image.leyou.com/12479122.jpg”,“price”:2699}

{“title”:“小米电视4A”,“images”:“http://image.leyou.com/12479122.jpg”,“price”:4288}

4.4.1、基本查询
就两种:
match(带分词器的查询)
term(直接将查询的条件作为关键词去精确匹配)
查询基本语法:
请求方法:POST
请求地址:http://127.0.0.1:9200/索引库名/_search
请求体:
{
“query”:{
“查询类型”:{
“查询条件”:“查询条件值”
}
}
}
这里的query代表一个查询对象,里边可以有不同的查询属性
(1)查询类型:
①例如:match_all,match,term,range等等
(2)查询条件:查询条件会根据类型的不同,写法也有差异,后面详细讲解

1、查询所有(match_all)
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”:{
“match_all”: {}
}
}

(1)query:代表查询对象
(2)match_all:代表查询所有
Postman操作界面:
在这里插入图片描述响应内容:
{
“took”: 1,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: 3,
“max_score”: 1,
“hits”: [
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “p_HnLG4BWrjRrOzLxIww”,
“_score”: 1,
“_source”: {
“title”: “大米手机”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 3288
}
},
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qfHnLG4BWrjRrOzL8Ywa”,
“_score”: 1,
“_source”: {
“title”: “小米电视4A”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 4288
}
},
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qPHnLG4BWrjRrOzL3Yxl”,
“_score”: 1,
“_source”: {
“title”: “小米手机”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 2699
}
}
]
}
}
(1)took:查询花费时间,单位是毫秒
(2)time_out:是否超时
(3)_shards:分片信息
(4)Hhits:搜索结果总览对象
①total:搜索到的总条数
②max_score:所有结果中文档得分的最高分
③hits:搜索结果的文档对象数组,每个元素是一条搜索到的本当信息
1)_index:索引库
2)_type:文档类型
3)_id:文档id
4)_score:文档得分
5)_source:文档的源数据
2、匹配查询(match)
现在,索引库中有2部手机,1台电视;
(1)or关系
match类型查询,会把查询条件分词,然后进行查询,多个词条之间是or的关系
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”:{
“match”:{
“title”:“小米电视4A”
}
}
}
Postman操作界面:
在这里插入图片描述

响应内容:
{
“took”: 8,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: 2,
“max_score”: 1.1507283,
“hits”: [
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qfHnLG4BWrjRrOzL8Ywa”,
“_score”: 1.1507283,
“_source”: {
“title”: “小米电视4A”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 4288
}
},
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qPHnLG4BWrjRrOzL3Yxl”,
“_score”: 0.2876821,
“_source”: {
“title”: “小米手机”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 2699
}
}
]
}
}
在上面的案例中,不仅会查询到电视,而且于小米相关的都会查询到,多个词之间是or的关系。
(2)and关系
某些情况下,我们需要更精确查找,我们希望这个关系变成and,可以这样做:
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”:{
“match”:{
“title”:{
“query”:“小米电视4A”,
“operator”:“and”
}
}
}
}
Postman操作界面:
在这里插入图片描述

响应内容:
{
“took”: 1,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: 1,
“max_score”: 1.1507283,
“hits”: [
{
“_index”: “heima”,
“_type”: “goods”,
“_id”: “qfHnLG4BWrjRrOzL8Ywa”,
“_score”: 1.1507283,
“_source”: {
“title”: “小米电视4A”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 4288
}
}
]
}
}
本例中,只有同时包含小米和电视的词条才会被搜索到。
3、多匹配字段查询(multi_match)
multi_match与match类似,不同的是它可以在多个字段中查询

为了测试效果我们在这里新增一条数据:
请求方法:POST
请求地址:http://127.0.0.1:9200/test/goods
请求体:
{
“title”: “华为手机”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 5288,
“subtitle”: “小米”
}
案例:
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”: {
“multi_match”: {
“query”: “小米”,
“fields”: [“title”,“subtitle”]
}
}
}
Postman操作界面:
在这里插入图片描述

响应结果:
{
“took”: 3,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: 3,
“max_score”: 0.6099695,
“hits”: [
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qfHnLG4BWrjRrOzL8Ywa”,
“_score”: 0.6099695,
“_source”: {
“title”: “小米电视4A”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 4288
}
},
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qvHyLG4BWrjRrOzL9Yzn”,
“_score”: 0.2876821,
“_source”: {
“title”: “华为手机”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 5288,
“subtitle”: “小米”
}
},
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qPHnLG4BWrjRrOzL3Yxl”,
“_score”: 0.2876821,
“_source”: {
“title”: “小米手机”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 2699
}
}
]
}
}
本例中,我们在title字段和subtitle字段中查询小米这个词

4、关键词精确查询(term)
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”:{
“term”:{
“price”:2699
}
}
}
Postman操作界面:
在这里插入图片描述

响应结果:
{
“took”: 0,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: 1,
“max_score”: 1,
“hits”: [
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qPHnLG4BWrjRrOzL3Yxl”,
“_score”: 1,
“_source”: {
“title”: “小米手机”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 2699
}
}
]
}
}
5、多关键词精确查询(terms)
terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于mysql的in:
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”:{
“terms”:{
“price”:[2699,5288]
}
}
}
Postman操作界面:
在这里插入图片描述

响应结果:
{
“took”: 3,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: 2,
“max_score”: 1,
“hits”: [
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qvHyLG4BWrjRrOzL9Yzn”,
“_score”: 1,
“_source”: {
“title”: “华为手机”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 5288,
“subtitle”: “小米”
}
},
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qPHnLG4BWrjRrOzL3Yxl”,
“_score”: 1,
“_source”: {
“title”: “小米手机”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 2699
}
}
]
}
}

4.4.2、结果过滤
默认情况下,Elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回
如果我们只想获取其中的部分字段,我们可以添加_source的过滤
(1)指定字段
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“_source”: [“title”,“price”],
“query”: {
“term”: {
“price”: 2699
}
}
}
Postman操作界面:
在这里插入图片描述(3)过滤指定字段:includes和excludes
我们也可以通过:
①includes:来指定想要显示的字段
②excludes:来指定不想要显示的字段
二者都是可选的。
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“_source”: {
“includes”:[“title”,“price”]
},
“query”: {
“term”: {
“price”: 2699
}
}
}

请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“_source”: {
“excludes”: [“images”]
},
“query”: {
“term”: {
“price”: 2699
}
}
}

Postman操作界面:
在这里插入图片描述查询结果:
{
“took”: 1,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: 1,
“max_score”: 1,
“hits”: [
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qPHnLG4BWrjRrOzL3Yxl”,
“_score”: 1,
“_source”: {
“price”: 2699,
“title”: “小米手机”
}
}
]
}
}

4.4.3、高级查询(了解)
(1)布尔组合(bool)
bool把各种其他查询通过must(与&&)、must_not(非!)、should(或||)的方式进行组合
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”:{
“bool”:{
“must”: { “match”: { “title”: “小米” }},
“must_not”: { “match”: { “title”: “电视” }},
“should”: { “match”: { “title”: “手机” }}
}
}
}
查询结果:
{
“took”: 11,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: 1,
“max_score”: 0.5753642,
“hits”: [
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qPHnLG4BWrjRrOzL3Yxl”,
“_score”: 0.5753642,
“_source”: {
“title”: “小米手机”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 2699
}
}
]
}
}
(2)范围查询(range)
range查询找出那些落在指定区间内的数字或者时间
range查询允许以下字符:

操作符说明
gt==(greater than)大于>
gte==(greater than equal)大于等于>=
lt ==(less than)小于<
lte==(less than equal)小于等于<=

示例:
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”:{
“range”: {
“price”: {
“gte”: 3000,
“lt”: 5000
}
}
}
}
响应结果:{
“took”: 0,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: 2,
“max_score”: 1,
“hits”: [
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “p_HnLG4BWrjRrOzLxIww”,
“_score”: 1,
“_source”: {
“title”: “大米手机”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 3288
}
},
{
“_index”: “test”,
“_type”: “goods”,
“_id”: “qfHnLG4BWrjRrOzL8Ywa”,
“_score”: 1,
“_source”: {
“title”: “小米电视4A”,
“images”: “http://image.leyou.com/12479122.jpg”,
“price”: 4288
}
}
]
}
}
(3)模糊查询(fuzzy)
我们新增一个商品:apple
请求方法:POST
请求地址:http://127.0.0.1:9200/test/goods/4
请求体:
{
“title”:“apple手机”,
“images”:“http://image.leyou.com/12479122.jpg”,
“price”:5899.00
}
fuzzy自动将拼写错误的搜索文本,进行纠正,纠正以后去尝试匹配索引中的数据
它允许用户搜索词条与实际词条出现偏差,但是偏差的编辑距离不得超过2:
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”: {
“fuzzy”: {
“title”: “appla”
}
}
}
上面的查询,也能查到apple手机
fuzziness,你的搜索文本最多可以纠正几个字母去跟你的数据进行匹配,默认如果不设置,就是1,我们可以通过
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”: {
“fuzzy”: {
“title”: {
“value”: “applaa”,
“fuzziness”: 2
}
}
}
}

4.4.4、查询排序
(1)单字段排序
sort可以让我们按照不同的字段进行排序,并且通过order指定排序的方式
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”: {
“match_all”: {}
},
“sort”: [
{“price”: {“order”: “desc”}}
]
}
(2)多字段排序
假定我们想要结合使用price和_score(得分)进行查询,并且匹配的结果首先按照价格排序,然后按照相关性得分排序:
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”:{
“match_all”:{}
},
“sort”: [
{ “price”: { “order”: “desc” }},
{ “_score”: { “order”: “desc” }}
]
}

4.4.5、高亮查询(Highlighter)
Elasticsearch中实现高亮的语法比较简单:
请求方法:POST
请求地址:http://127.0.0.1:9200/heima/_search
请求体:
{
“query”: {
“match”: {
“title”: “电视”
}
},
“highlight”: {
“pre_tags”: “”,
“post_tags”: “
”,
“fields”: {
“title”: {}
}
}
}
在使用match查询的同时,加上一个highlight属性:
①pre_tags:前置标签
②post_tags:后置标签
③fields:需要高亮的字段
title:这里声明title字段需要高亮,后面可以为这个字段设置特有配置,也可以空
Postman操作界面:
在这里插入图片描述4.4.6、分页查询
Elasticsearch中实现分页的语法非常简单:
请求方法:POST
请求地址:http://127.0.0.1:9200/test/_search
请求体:
{
“query”: {
“match_all”: {}
},
“size”: 2,
“from”: 0
}

size:每页显示多少条
from:当前页
Postman操作页面:
在这里插入图片描述五、Elasticsearch集群
单点的问题
单台服务器,往往都有最大的负载能力,超过这个阈值,服务器性能就会大大降低甚至不可用。单点的Elasticsearch也是一样,那单点的es服务器存在那些可能出现的问题呢?
(1)单台机器存储容量有限
(2)单服务器容易出现单点故障,无法实现高可用
(3)单服务的并发处理能力有限
所以,为了应对这些问题,我们需要对Elasticsearch搭建集群
集群中节点数量没有限制,大于等于2个节点就可以看做是集群了。一般出于高性能及高可用方面来考虑集群中节点数量都是3个以上。
5.1、集群的相关概念
5.1.1、集群cluster
一个集群就是由一个或多个几点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。一个集群有一个唯一的名字标识,这个名字默认就是”Elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。
5.1.2、节点node
一个节点是集群中的一个服务,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的那些服务对应于Elasticsearch集群中的哪些节点。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“Elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动的形成并加入到一个叫做“Elasticsearch”的集群中。在一个集群里,只要你想,可以拥有任意多个节点。
5.1.3、分片和赋值shards&replicas
为了解决索引占用空间过大(1TB以上)这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。
为了提高分片高可用,Elasticsearch允许创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。
默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。
5.2集群的搭建
5.2.1准备三台Elasticsearch服务器
创建Elasticsearch-cluster文件夹,在内部复制三个Elasticsearch服务
5.2.2修改每台服务器配置
修改Elasticsearch-cluster\node*\config\Elasticsearch.yml配置文件

node1节点:
#节点1的配置信息:
#集群名称,保证唯一
cluster.name: my-Elasticsearch
#节点名称,必须不一样
node.name: node-1
#必须为本机的ip地址
network.host: 127.0.0.1
#服务端口号,在同一机器下必须不一样
http.port: 9201
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9301
#设置集群自动发现机器ip集合
discovery.zen.ping.unicast.hosts: [“127.0.0.1:9301”,“127.0.0.1:9302”,“127.0.0.1:9303”]
node2节点:
#节点2的配置信息:
#集群名称,保证唯一
cluster.name: my-Elasticsearch
#节点名称,必须不一样
node.name: node-2
#必须为本机的ip地址
network.host: 127.0.0.1
#服务端口号,在同一机器下必须不一样
http.port: 9202
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9302
#设置集群自动发现机器ip集合
discovery.zen.ping.unicast.hosts: [“127.0.0.1:9301”,“127.0.0.1:9302”,“127.0.0.1:9303”]
node3节点:
#节点3的配置信息:
#集群名称,保证唯一
cluster.name: my-Elasticsearch
#节点名称,必须不一样
node.name: node-3
#必须为本机的ip地址
network.host: 127.0.0.1
#服务端口号,在同一机器下必须不一样
http.port: 9203
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9303
#设置集群自动发现机器ip集合
discovery.zen.ping.unicast.hosts: [“127.0.0.1:9301”,“127.0.0.1:9302”,“127.0.0.1:9303”]
5.2.3 启动各个节点服务器
双击Elasticsearch-cluster\node*\bin\Elasticsearch.bat
5.2.4 集群测试
添加索引和映射
请求方法:PUT
请求地址:http://127.0.0.1:9201/test3
请求体:
{
“settings”:{},
“mappings”:{
“goods”:{
“properties”:{
“title”:{
“type”:“text”,
“analyzer”:“ik_max_word”
},
“subtitle”:{
“type”:“text”,
“analyzer”:“ik_max_word”
},
“images”:{
“type”:“keyword”,
“index”:“false”
},
“price”:{
“type”:“float”
}
}
}
}
}
添加文档
请求方法:POST
请求地址:http://127.0.0.1:9200/test3/goods
请求体:
{
“title”:“小米手机”,
“images”:“http://image.leyou.com/12479122.jpg”,
“price”:2699.00
}
使用Elasticsearch-header查看集群情况:
在这里插入图片描述

可以通过elasticsearch-head插件查看集群健康状态,有以下三个状态:
在这里插入图片描述

Green
所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
Yellow
所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。如果 更多的 分片消失,你就会丢数据了。把 yellow 想象成一个需要及时调查的警告。
Red
至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。

总结:
(1)理解Elasticsearch的作用
①全文检索引擎,弥补mysql数据库查询的步骤,超快速查询数据解决方案
(2)能够安装Elasticsearch服务
(3)理解Elasticsearch的相关概念
(4)能够使用Postman发送Restful请求操作Elasticsearch
(5)理解分词器的作用
①分词,把一段话中的关键词,拆分出来
②拆分原理:
1)单字拆分
2)二分法拆分
3)词典分词(Ik-anaylzer)
(6)能够使用Elasticsearch集成IK分词器
(7)能够完成es集群搭建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值