Elaticsearch,简称为 ES, 是一个开源的高扩展的分布式全文搜索引擎 (这里说到的全文搜索引擎指的是目前广泛应用的主流搜索引擎)。与传统型关系数据库不同,Elaticsearch使用的是倒排索引,它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
例如百度、谷歌之类的搜索引擎,它们都是根据网页中的关键字生成索引的,当我们在这类搜索引擎输入关键字进行搜索时,它们会根据关键字去匹配索引,然后将索引对应的所有网页返回;除了这类搜索引擎之外,还一些非结构化的数据文本等,对于这些内容的搜索,关系型数据库搜索不是能很好的支持。而且一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段(除了wordpress,之前折腾wordpress时,把数据库删了,文章直接就没了,后面发现wordpress竟然把文章存在数据库里 ==+ )。当进行全文检索时,需要扫描整个表,如果数据量大的话即使对 SQL 的语法优化,也收效甚微。即使建立了索引,后期维护起来也比较麻烦,进行插入和更新操作时都会重新构建索引。 全文搜索引擎的适用场景:
下载安装
,下载完后直接解压;
进入 bin 文件目录,点击 elasticsearch.bat 文件启动 ES 服务
打开地址:,测试是否启动成功
RESTful
在SpringMVC中有提到过。
REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就 是 RESTful。Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之 间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务 器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用 服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。 在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它 向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个唯一的地址。所有资源都共享统一的接口,以便在客 户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和 DELETe。
在 REST 样式的 Web 服务中,每个资源都有一个地址。资源本身都是方法调用的目 标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括 HTTP GET、POST、 PUT、DELETE,还可能包括 HEAD 和 OPTIONS。简单的理解就是,如果想要访问互联 网上的资源,就必须向资源所在的服务器发出请求,请求体中必须包含资源的网络路径,以 及对资源进行的操作(增删改查)。
第三方工具
使用Elasticsearch服务器发请求时必须包含HTTP 标准的方法,而大部分浏览器默认发送的只有 GET 和 POST 请求。所以为了能方便地进行客户端的访问,
我们可以使用 网页调试工具配合使用。
Postman下载安装后,按照提示填写信息,然后随便创建一个team就可以了;
使用Elasticsearch服务器发请求时必须包含HTTP 标准的方法,而大部分浏览器默认发送的只有 GET 和 POST 请求。所以为了能方便地进行客户端的访问,
我们可以使用以下几种工具可配合使用。
数据格式
Elasticsearch 是面向文档型数据库,一条数据对应的就是一个文档。
与MySQL的类比:
ES 里的 Index 可以看做一个库,而 Types 相当于表,documents 则相当于表的行。 这里 Types 的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个 type,Elasticsearch 7.X 中, Type 的概念已经被删除了
用 JSON 作为文档序列化的格式,比如一条用户信息:
Postman
索引操作
为了方便演示RESTful风格,这里使用的是Postman进行操作,如果不用RESTful风格,可直接跳到Kibana
打开Postman,按照提示进行初始化设置;
进入Postman界面后,新建一个Collection;
创建索引
相当于关系型数据库中的创建数据库
点击右侧加号;输入一个PUT命令:
然后点击Send,可以看到创建成功的提示 返回结果:
重复添加时会报错: 返回结果:
查询索引
输入一个GET命令,来查询所有索引;(cat 表示查看的意思,indices 表示索引,相当于像 MySQL 中的 show tables)
返回结果:
查询单个索引
返回结果:
删除索引
返回结果:
文档操作
创建文档
这里的文档就相当于MySQL中的表中的数据
发送一个POST请求,创建文档,文档的格式为JSON:
选择POST请求(由于此处没有指定ID为非幂等性操作,所以只能用POST):
简单理解幂等性:多次操作与一次操作的结果相同,即为幂等性操作;反之 此例中由于没有指定ID,所以ID为随机生成,导致多次操作与一次操作的结果不同
输入请求体:点击Body,点击raw,格式选择JSON,并在输入框输入请求体(请求完成后记得把请求体删除,否则遇到不需要请求体的命令时会报错)
然后点击Send发送请求;
返回结果(附解释):
上面的数据创建后,由于没有指定数据唯一性标识(ID)(也就是主键),默认情况下,ES 服务器会随机生成一个。 如果想要自定义唯一性标识,需要在创建时指定(此时就变成了幂等性操作,因此可以使用POST和PUT两种请求方式):
请求体:(请求完成后记得把请求体删除,否则遇到不需要请求体的命令时会报错)
返回结果:
查看文档
返回结果:
修改文档
请求体:(请求完成后记得把请求体删除,否则遇到不需要请求体的命令时会报错)
点击Send发送请求:
返回结果:
请求体:
返回结果:
删除文档
返回结果:
请求体:
返回结果:
同理如果要删除索引下全部数据,只需要改请求体条件即可:
Kibana
打开Kibana的bin路径下的kibana.bat启动Kibana;
然后浏览器访问5601端口,点击Explore on my own;
在左侧菜单找到Dev Tools;
索引操作
创建索引
相当于关系型数据库中的创建数据库
输入一个PUT命令:
错误写法(不能有空行):
点击代码右侧的启动按钮,可以在右侧看到创建成功的提示 返回结果:
重复添加时会报错: 返回结果:
查询索引
输入一个GET命令,来查询所有索引;(cat 表示查看的意思,indices 表示索引,相当于像 MySQL 中的 show tables)
返回结果:
可以看到ElasticSearch请求方式用小写也能执行,但是左侧会报错误提醒
查询单个索引
返回结果:
删除索引
返回结果:
文档操作
创建文档
这里的文档就相当于MySQL中的表中的数据
发送一个POST请求,创建文档,文档的格式为JSON:
选择POST请求(由于此处没有指定ID为非幂等性操作,所以只能用POST):
简单理解幂等性:多次操作与一次操作的结果相同,即为幂等性操作;反之 此例中由于没有指定ID,所以ID为随机生成,导致多次操作与一次操作的结果不同
点击右侧运行按钮运行
返回结果(附解释):
上面的数据创建后,由于没有指定数据唯一性标识(ID)(也就是主键),默认情况下,ES 服务器会随机生成一个。 如果想要自定义唯一性标识,需要在创建时指定(此时就变成了幂等性操作,因此可以使用POST和PUT两种请求方式)
返回结果:
查看文档
返回结果:
修改文档
请求体:(请求完成后记得把请求体删除,否则遇到不需要请求体的命令时会报错)
返回结果:
请求体:
返回结果
删除文档
返回结果:
返回结果:
同理如果要删除索引下全部数据,只需要改请求体条件即可:
对比
一图简单对比Postman和Kibana使用ES命令方式区别:
由于后面示例都是用的Kibana,继续用Postman的可自行参照此图,根据示例中的Kibana进行类比
映射关系
索引库(index)中的映射类似于数据库(database)中的表结构(table)。 创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型 下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)。
映射数据说明:
创建映射关系
首先创建索引
然后创建映射关系
返回结果:
返回结果:
查看映射关系
返回结果:
高级查询
为了方便演示,这里不使用系统自动给的映射,而是自行创建映射
创建完映射后,创建数据
全量查询(match_all)
匹配查询(match)
match 匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系 1)直接通过请求路径查询(不推荐,中文容易出现乱码)
返回结果:
查询条件被自动分词,所有content字段中包含“OS、Android、Not、on”的文档均会被检索出来
2)通过请求体查询
返回结果和上面一样 为了更直观的显示我们可以使用进行查询:
可以很直观的看到查询条件被分成了四个字段“OS、Android、Not、on”
测试text类型映射:
返回结果:
查询字段中的华和果自动被分词了,因此所有name中包含华和果的文档全被检索出来了
同样可以看到关键词被分成了华和果两个字段
测试keyword类型映射:
返回结果(未查到符合要求文档):
可以看到由于vendor字段被设置了keyword映射,所以查询关键词并没有被分词;所以必须输入该字段的完整值进行查询
返回结果:
测试index为false(不能被检索):
返回结果:(提示错误信息)
字段匹配查询(multi_match)
multi_match 与match 的区别就是它可以在多个字段中进行查询
查询在name和content字段中包含华和MIUI的文档
返回结果:
关键字精确查询(term)
term 查询,精确的关键词匹配查询,不对查询条件进行分词。
返回结果:(未查询到)
由于text类型默认会被自动分词,所以存入name字段的值:“小米手机”会被自动分成“小、米、手、机”四个字,因此当我们进行精确匹配查询“小米手机”时就会查询不到;只有当查询“小、米、手、机”四个字的任意字时才会匹配到;如果name字段被设为keyword映射,则只有当查询的关键词为“小米手机”时才会进行匹配
多关键字精确查询(terms)
terms查询和term查询的区别是它可以指定多值进行匹配查询,并且只需要匹配一个值即为满足查询条件;类似于mysql 的in 。
返回结果:
指定查询字段(_source)
默认情况下,ElasticSearch会将保存在_source中的所有字段都返回。因此我们可以自定义返回的字段
设置_source只返回name和area字段
返回结果:
过滤字段(includes/excludes)
includes:来指定想要显示的字段
excludes:来指定不想要显示的字段 返回结果:
可以看到满足must条件的华为和小米均被查了出来,而符合should要求的华为优先级较高,被排在了前面
范围查询(range)
range 查询找出那些落在指定区间内的数字或者时间。range 查询允许以下字符
返回结果:
模糊查询(wildcard)
模糊查询效率较慢,因此不推荐使用;和大部分模糊匹配一样,使用*或者?进行占位替代;
返回结果:
因为是模糊查询,所以不受keyword映射影响,但是仍然会受到分词器的影响,比如下面实例中的模糊查询name为“小米”的文档,而上面示例已经说了,“小米手机”已经被分词成了四个独立的字,因此通过“小米”去模糊查询,仍然是查询不到的
单字段排序(sort)
sort 可以按照不同的字段进行排序,并且通过order 指定排序的方式(desc 降序,asc升序)。
返回结果:
多字段排序(sort)
为方便测试,添加一个只有ID不同的数据:
开始测试:
先按价格降序,然后按_id升序
返回结果:
测试完成后,删除刚刚添加的数据
高亮查询(highlight)
Elasticsearch 可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。 在使用match 查询的同时,加上一个highlight 属性(可以不设置,不设置则为默认值):
pre_tags:前置标签 (默认为em标签)
post_tags:后置标签 (默认为em标签)
fields:需要高亮的字段
title:这里声明title 字段需要高亮,后面可以为这个字段设置特有配置
返回结果:
因为是html语法,所以返回结果里面只有文字,而不是直接显示效果
分页查询(from)
from:当前页的起始索引,默认从0 开始。 from = (页数 - 1) * size 【即from为0时,为第一页,以此类推】 size:每页显示多少条
返回结果:
聚合查询(aggs)
聚合允许使用者对es文档进行统计分析,类似与MySQL中的group by
度量聚合
例如取最大值(max)、最小值(min)、平均值(avg)、总数(count)、 去重后求总数(cardinality)、返回所有度量类型的统计(stats)等等。
返回结果:
在查询结果底部的aggregations字段中可以看到得到的相加结果为33172.0
桶聚合查询
在已有的分组条件下再进行聚合即为桶聚合,相当于MySQL中的group by 语句;桶聚合返回很多子集,并限定输入数据到一个特殊的叫做桶的子集中。可以把桶聚合想象成 类似切面功能的东西。
terms聚合为字段中每个词条返回一个桶。允许你生成字段每个值的统计;
范围聚合和时间范围聚合
多个聚合的嵌套即为桶嵌套
中文支持
在Kiabana的配置文件中修改,然后重启Kiabana即可:
可视化操作
直接对索引操作:
文档的可视化操作
以上就是本篇文章【ElasticSearch快速入门(一)】的全部内容了,欢迎阅览 ! 文章地址:http://lianchengexpo.xrbh.cn/quote/7091.html 行业 资讯 企业新闻 行情 企业黄页 同类资讯 网站地图 返回首页 迅博思语资讯移动站 http://lianchengexpo.xrbh.cn/mobile/ , 查看更多