文章目录
学习地址:elasticsearch学习视频
1 开篇
我们查询的信息:文章、视频、图片、网站信息等
按数据格式分类:
1、结构化数据
2、非结构化数据
3、半结构化数据
结构化数据
使用特定的结构来组织和管理数据,一般表现为二维表结构
缺点:扩展现有的结构不方便
非结构化数据
无法用二维表结构表示的数据,如:服务器日志、视频、报表和图片等
半结构化数据
数据的结构和内容混在一起,没有明显的区分,如:xml文件、html文件等
缺点:查询内容不方便
2 技术选型
Elasticsearch是什么
The Elastic Stack, 包括 Elasticsearch、Kibana、Beats 和 Logstash(也称为 ELK Stack)。
能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视
化。Elaticsearch,简称为 ES,ES 是一个开源的高扩展的分布式全文搜索引擎,是整个 Elastic
Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上
百台服务器,处理 PB 级别的数据
Elasticsearch And Solr
目前市面上流行的搜索引擎软件,主流的就两款:Elasticsearch 和 Solr,两者都可以独立部署启动的搜索引擎服务软件。
Elasticsearch Or Solr
Elasticsearch 和 Solr 都是开源搜索引擎,那么我们在使用时该如何选择呢?
- Google 搜索趋势结果表明,与 Solr 相比,Elasticsearch 具有很大的吸引力,但这并不意味着 Apache Solr 已经死亡。虽然有些人可能不这么认为,但 Solr 仍然是最受欢迎的搜索引擎之一,拥有强大的社区和开源支持。
- 与 Solr 相比,Elasticsearch 易于安装且非常轻巧。此外,你可以在几分钟内安装并运行Elasticsearch。但是,如果 Elasticsearch 管理不当,这种易于部署和使用可能会成为一个问题。基于 JSON 的配置很简单,但如果要为文件中的每个配置指定注释,那么它不适合您。总的来说,如果你的应用使用的是 JSON,那么 Elasticsearch 是一个更好的选择。否则,请使用 Solr,因为它的schema.xml 和 solrconfig.xml 都有很好的文档记录。
- Solr 拥有更大,更成熟的用户,开发者和贡献者社区。ES 虽拥有的规模较小但活跃的用户社区以及不断增长的贡献者社区。Solr 贡献者和提交者来自许多不同的组织,而 Elasticsearch 提交者来自单个公司。
- Solr 更成熟,但 ES 增长迅速,更稳定。
- Solr 是一个非常有据可查的产品,具有清晰的示例和 API 用例场景。 Elasticsearch 的 文档组织良好,但它缺乏好的示例和清晰的配置说明
3 略
4 入门——环境准备
官方地址:https://www.elastic.co/cn/
下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
Elasticsearch 分为 Linux 和 Windows 版本,基于我们主要学习的是 Elasticsearch 的 Java客户端的使用,所以课程中使用的是安装较为简便的 Windows 版本。
安装软件
Windows 版的 Elasticsearch 的安装很简单,解压即安装完毕,解压后的 Elasticsearch 的目录结构如下
解压后,进入 bin 文件目录,点击 elasticsearch.bat
文件启动 ES 服务
注意:9300
端口为 Elasticsearch 集群间组件的通信端口,9200
端口为浏览器访问的 http协议 RESTful 端口。
打开浏览器(推荐使用谷歌浏览器),输入地址:http://localhost:9200
,测试结果
问题解决
- Elasticsearch 是使用 java 开发的,且 7.8 版本的 ES 需要 JDK 版本 1.8 以上,默认安装包带有 jdk 环境,如果系统配置JAVA_HOME,那么使用系统默认的 JDK,如果没有配置使用自带的 JDK,一般建议使用系统配置的 JDK。
- 双击启动窗口闪退,通过路径访问追踪错误,如果是“空间不足”,请修改
config/jvm.options
配置文件
# 设置 JVM 初始内存为 1G。此值可以设置与-Xmx 相同,以避免每次垃圾回收完成后 JVM 重新分配内存
# Xms represents the initial size of total heap space
# 设置 JVM 最大可用内存为 1G
# Xmx represents the maximum size of total heap space
-Xms1g
-Xmx1g
5 RESTful & JSON
-
在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和DELETE。
-
在 REST 样式的 Web 服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括 HTTP GET、POST、PUT、DELETE,还可能包括 HEAD 和 OPTIONS。简单的理解就是,如果想要访问互联网上的资源,就必须向资源所在的服务器发出请求,请求体中必须包含资源的网络路径,以及对资源进行的操作(增删改查)
基本的json对象:
var obj={"name":"zhangsan","age":30}
对象嵌套:
var obj={"name":"zhangsan","age":30,"info":{"email":"xxxxxx"}}
即使用大括号嵌套即可
对象集合
var objs=[obj1,obj2]
使用中括号,对象之间逗号隔开即可
上述的表示容易转换为字符串从而在网络中表示,从而在网络中传递。而我们所熟悉的对象,是无法在网络中传递的,如new Object()
,是不能在网络中传递的,只能将其序列化,然后接收端再将其反序列化
JSON字符串:网络中传递的字符串的格式符合JSON格式,就将其统称为JSON字符串
6 Postman客户端工具
如果直接通过浏览器向 Elasticsearch 服务器发请求,那么需要在发送的请求中包含HTTP 标准的方法,而 HTTP 的大部分特性且仅支持 GET 和 POST 方法。所以为了能方便地进行客户端的访问,可以使用 Postman 软件
Postman 是一款强大的网页调试工具,提供功能强大的 Web API 和 HTTP 请求调试。软件功能强大,界面简洁明晰、操作方便快捷,设计得很人性化。Postman 中文版能够发送任何类型的 HTTP 请求 (GET, HEAD, POST, PUT…),不仅能够表单提交,且可以附带任意类型请求体。
Postman 官网:https://www.getpostman.com
Postman 下载:https://www.getpostman.com/apps
7 倒排索引
数据格式
Elasticsearch是面向文档型数据库,一条数据在这里表现出来就是一个文档。将Elasticsearch里存储文档数据和关系型数据库MySQL存储数据的概念进行类比如下:
ES 里的 Index 可以看做一个库,而 Types 相当于表,Documents 则相当于表的行。
这里 Types 的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个type,Elasticsearch 7.X 中, Type 的概念已经被删除了
ES软件专门用于全文检索数据,因此索引是整个搜索引擎的关键,为了能够快速准确地查询数据,它使用了一种特殊的概念来存储和查询数据:倒排索引
倒排索引对应于正排索引(正向索引)
正向索引:
id | content |
---|---|
1001 | My name is zhang san |
1002 | My name is li si |
将id设置为主键,生成主键索引,通过主键索引快速关联到对应的content信息,这种索引就是正排索引(正向索引)
但是如果我们想要查询文章的内容中包含了哪些热门词汇,就需要采取模糊查询,而模糊查询效率就低了很多。因此我们需要换一种方式将索引和数据关联起来:倒排索引
将关键字和id关联起来
keyword | id |
---|
如果查询关键字为name
,那么得到对应的id
就是1001,1002
如果查询关键字为zhang
,那么得到对应的id
就是1001
keyword | id |
---|---|
name | 1001,1002 |
zhang | 1001 |
那么这样就是通过关键字keyword来查询主键id,然后再关联到数据content
8 Http-索引-创建
来到Postman软件中进行操作
对比关系型数据库,创建索引就等同于创建数据库
在Postman中,向ES服务器发PUT
请求:http://127.0.0.1:9200/shop
,shop
就是我们要创建的索引
请求后,服务器返回响应:
如果此时,发送同样的创建shop
索引请求,就会报错,因为当前shop
索引已经存在了
9 Http-索引-查询&删除
查询刚刚创建的shop
索引,使用GET
请求:http://127.0.0.1:9200/shop
请求后,ES服务器返回的结果:
http://127.0.0.1:9200/_cat/indices?v
查询所有索引
这里请求路径中的_cat
表示查看的意思,indices
表示索引,所以整体含义就是查看当前ES服务器中的所有索引,由于索引等同于数据库,因此该命令就像是mysql中的show databases命令
shopping
索引是我之前创建了的
删除索引
发送DELETE
请求后,ES服务器返回结果:
10 Http-文档-创建(PUT&POST)
索引已经创建好了,下面可以来创建文档并添加数据。这里的文档可类比为mysql中的表数据,添加的数据格式为JSON格式
在Postman中,向ES服务器发POST
请求:http://127.0.0.1:9200/shop/_doc
此处发送请求的方式必须为 POST
,不能是PUT
,否则会发生错误
请求体内容为:
{
"title":"小米手机",
"category":"小米",
"images":"http://www.gulixueyuan.com/xm.jpg",
"price":3999.00
}
返回结果:
上面的数据创建后,由于没有指定数据唯一性标识(ID),默认情况下,ES 服务器会随机生成一个。
如果想要自定义唯一性标识,需要在创建时指定:http://127.0.0.1:9200/shop/_doc/1001
此处需要注意:如果增加数据时明确数据主键,那么请求方式也可以为 PUT
11 Http-查询-主键查询&全查询
输入路径以及选定为GET
请求即可:http://127.0.0.1:9200/shop/_doc/1001
1001就相当于主键
localhost:9200/shop/_search
查询索引下的所有数据(注意此时body中不能有数据,否则会报错)
12 Http-全量修改&局部修改&删除
全量修改:
http://127.0.0.1:9200/shop/_doc/1001
,选择PUT
或POST
请求
局部修改
更新局部的数据,说明每次更新的结果不相同,因此不能采用put方式,只能采用post
注意要将请求路径中修改为_update
,明确指明是要更新数据,json中的body指明要更新哪部分的数据
删除
13 Http-条件查询&分页查询&查询排序
条件查询:
通过请求路径进行条件查询:
GET请求
http://127.0.0.1:9200/shop/_search?q=category:小米
通过请求体进行条件查询:
{
"query":{
"match":{
"category":"小米"
}
}
}
分页查询
from
:当前页的起始索引,默认从 0 开始。 from = (pageNum - 1) * size
size
:每页显示多少条
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/shop/_search
请求体:
{
"query":{
"match_all":{
}
},
"from":0,
"size":2
}
如果想指定显示title字段:
请求体:
{
"query":{
"match_all":{
}
},
"from":0,
"size":2,
"_source":["title"]
}
排序查询:
{
"query": {
"match_all": {
}
},
"sort": [
{
"price": {
"order": "desc"
}
}
],
"from": 0,
"size": 2
}
14 多条件查询&范围查询
http://127.0.0.1:9200/shop/_search
条件体(使用bool)
{
"query":{
"bool":{
"must":[
{
"match":{
"category":"小米"
}
}
]
}
}
}
条件与(使用must)
{
"query":{
"bool":{
"must":[
{
"match":{
"category":"小米"
}
},
{
"match":{
"price":3999
}
}
]
}
}
}
条件或(使用should)
{
"query":{
"bool":{
"should":[
{
"match":{
"category":"小米"
}
},
{
"match":{
"category":"华为"
}
}
]
}
}
}
范围查询(使用filter和range,同时注意filter是在must或should外面)
{
"query":{
"bool":{
"should":[
{
"match":{
"category":"小米"
}
},
{
"match":{
"category":"华为"
}
}
],
"filter":{
"range":{
"price":{
"gt":5000
}
}
}
}
}
}
15 Http-全文搜索&完全匹配&高亮查询
body内容
{
"query":{
"match":{
"category":"小华"
}
}
}
那么category
的值为小米/华为都会被匹配到,因为”小华“被进行分词了,被拆成”小“和”华“,因此匹配时”小米“和”华为“都能匹配到。
底层在匹配的时候会被拆分,形成一个个的词,然后进行倒排索引匹配,因此产生这样的现象
如果想要完全匹配,那么需要使用match_phrase
{
"query":{
"match_phrase":{
"category":"小华"
}
}
}
匹配后高亮显示:
{
"query":{
"match_phrase":{
"category":"小米"
}
},
"highlight":{
"fields":{
"category":{}
}
}
}