前面我们安装好了ElasticSearch,我以后就简称他为ES,而一些人还不知道基本的使用,那我们接下来做一个快速
入门,了解一下他的使用方法,以及一些基本概念,方便我们后来整合,那么要学习ES最好的工具呢,就是我们官方文档,
ElasticSearch的官方就是elastic.co
https://www.elastic.co/cn/learn
在了解这一块,
有一个docs,
https://www.elastic.co/guide/index.html
最下边有一个简体中文
https://www.elastic.co/guide/cn/index.html
点进来就有一个ES的权威指南
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
我们就从这儿开始学习ES,我们这块会刷出目录结构,前两章序言前言就不看了,基础入门来掌握一些核心概念,
我们从第一章"你知道的, 为了搜索…",这一块我们要说一个核心概念,安装这些我们已经安装完了,第一个叫"面向文档",
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_document_oriented.html
ElasticSearch它是一个面向文档的,也就是它会存储整个对象,或者文档,不像MYSQL,存储的是数据的一些行列,而存储了
文档以后呢,Elastic可以进行索引,检索,排序,过滤,他的数据类型是很丰富的,而且在ES中,我们是使用JSON作为序列化
格式的,也就是说,比如我们一个USER对象,最终放到我们ES中,会转化成JSON的格式,类似于这个样子
{
"email": "john@smith.com",
"first_name": "John",
"last_name": "Smith",
"info": {
"bio": "Eco-warrior and defender of the weak",
"age": 25,
"interests": [ "dolphins", "whales" ]
},
"join_date": "2014/05/01"
}
JSON大家都知道,天然的轻量级,和跨平台的优势,那么以后我们一个JSON文档,他就代表一个数据对象,接下来我们来看
下一章
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_finding_your_feet.html
这个就是ES的基本概念,对于ES的初次使用呢,基本概念是难以理解的,不过他在这举了一个例子,比如我们要创建一个雇员目录,
我们Megacorp公司,他有一些员工信息,我们这个员工信息呢,经常要进行检索,分析等等,我们要创建一些员工信息,保存在ES中,
通过这个例子我们看一下有什么相关的概念
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_indexing_employee_documents.html
他叫索引雇员文档,我们ES里面要进行数据检索,那ES里面要存一些数据,所以说我们第一个需求,就是要存储一些雇员数据,
放在ES中,而我们这些员工数据呢,是以雇员文档,刚才看的JSON文档的方式,一个JSON文档代表一个雇员,而我们把给ES存数据
的,行为叫做索引,其实就是存储的意思而已,只不过索引还有一些概念,你想把一个信息存储到ES中,你要索引在ES中之前,
你需要确定我们的文档数据,到底要存在ES的哪里,那么就牵涉到一些概念,在ES集群里边,可以有多个索引,前面的索引叫做
动词,后面的又称为名词的形式,然后每个索引可以包含多个类型,每个类型又包含多个文档,每个文档又包含多个属性,这段话什么
意思呢
我们想给ES集群里面存储数据,比如有谷歌公司,有microsoft公司,有刚才说的megacorp公司,
我们要存储员工数据,我们首先确定这个员工是哪个公司的,我可以存在这个节点里面,我们这个节点
是megacorp公司的,我们存在这儿,所以我们把这些东西叫做索引,我们第一层叫做索引,我们这个公司有
员工信息,也有他的一些产品,包括还有一些他的部门,你存的到底是哪些数据,那么第二级我们称之为类型,
我接下来要存的是员工信息,而员工信息呢,数据是什么,我们每一个数据文档,JSON都放到这儿,存了三个文档,
所以这三条数据都叫做文档,而这个文档里面呢,自然就有他的属性,比如员工的ID,员工的名字,员工的age,
这就是我们说的索引类型,文档属性,其实类比到MYSQL,就非常简单了,什么叫索引呢,就相当于我们MYSQL的数据库一样,
我们连上MYSQL,到底要给哪个数据库里面存东西,我们MYSQL里面有很多数据库,而数据库里边又有非常多的表,要是给
employee表里存数据,还是要给department表里存数据,类型就是对应MYSQL里的表,表里会有一行一行的记录,这个记录
就是我们说的文档,表里的列,都有它的字段,这个我们就称为属性,这个和MYSQL的关系基本是一样的,结合这些概念
我们参照ES文档
我们给ES中存储一些员工数据,比如下边的一个例子,我们想要保存一个员工数据,我们将要做这么四步操作,
哪四步操作呢,每一个员工我们都保存一个文档,所谓的文档就是JSON数据,这个文档是employee类型,这个数据是
员工类型的,而且这个文档放在megacorp这个索引内,然后我们要把保存在ES中,那要做这个操作,看起来很多,
其实只需要发一个PUT请求
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
PUT请求的URL地址呢,前面第一位是索引的名字,把什么数据放在什么位置,放在索引的位置,然后第二个是数据类型的名字,
我们是放在employee里面,最后一个是数据的特定标识,我的一号数据,这个消息体就是我们请求的JSON,我们就来发送这个
PUT请求,我们就来结合POSTMAN来发送请求,我们来给ES来发请求,把这个关掉,首先把我们的地址复制过来,这是我们交互的地址
localhost:9200
接下来我们要索引一个员工,我们把URL地址拿过来,然后他必须是一个PUT请求,PUT请求需要带JSON数据,这个数据是员工的文档,
JSON数据我们选择raw,txt我们选择application/json,这是我们要带的JSON数据,这块PUT我们来发送
{
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ]
}
/megacorp/employee/2
PUT /megacorp/employee/3
{
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets",
"interests": [ "forestry" ]
}
这三号员工也保存,那么我们就给ES中存储了这么几个数据,有了这数据呢,ES就能帮我们分析和搜索数据了,我们继续往
高级看,检索文档
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_retrieving_a_document.html
我们之前存了一些数据,我想要检索出来,我怎么办呢,还是发请求,来发一个GET请求
GET /megacorp/employee/1
只要把PUT请求改成GET请求
发现这一块有响应,响应出来索引,类型,id,包括他找到的数据,found true已经找到了,source就是找到的数据,
这个数据有员工的first_name,last_name,age,还有员工的about,interests,这数据我们暂时就检索到了,发送
各种请求都能搜到,同样如果你把GET变成DELETE,这个就是删除,如果变成HEAD请求,这是来检查,不是有这个员工,
我来发送HEAD,我发现这块没有响应体数据,HEAD请求不存在响应体,注意如果有员工的情况下,3号员工我们有,这块的
响应码是200,响应状态码是404
我们发现这一块请求处理完了,这里有响应,响应的内容包括,你这个数据放进哪个索引里面,类型是什么,
id是什么,包括这个数据的版本,这个数据是刚才创建的,包括等等一些信息,都在这,这是我们一个数据,
那我们来保存更多的数据,我把二号的员工复制来
所以这是REST风格,响应404这个资源就没有,这是我们HEAD检查有没有员工,包括DELETE还能删,
比如我发delete请求,我要删3号员工,他写found等于true,已经找到了,而且最终是把他delete删掉,
删掉我们再来发get请求,我们发现found false
就找不到三号了,我们的GET是用来检索文档,delete我们可以来删除文档,head检查文档是否存在,
如果我们想要更新,我们再用PUT命令,新增和修改文档,我们只需要REST API的操作就行了,比如我们
还是之前的1号员工为例,我们在保存1号员工的时候呢,我们之前已经保存过一次了,我再来保存一次,
比如我要把25改成28,
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 28,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
我再来保存的时候呢,发现Version会叠加
result是update,我们第一次添加是created,而我们以后还是一号用户,版本每次都会增加,这就是我们使用
REST风格,就是改变我们请求方式,对ES中的数据进行增删改查,我们继续来测试更多的基本功能,我们点进
轻量搜索里边
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_search_lite.html
如果我们想要搜素所有的员工,以前我们在这些文档的ID
GET /megacorp/employee/_search
现在我们只要变成_search
我们来试一下,所有数据都在hits里面,有index,有数据的索引,类型,以及ID,我们接下来再往下看,这里还有ID为1的,
一个叫Jane,一个叫Jone
这是找所有,包括我们想要哪些条件,比如我们要想找last_name是Smith的
GET /megacorp/employee/_search?q=last_name:Smith
我们只需要带上这个参数,q=last_name:Smith,这个我们称为查询字符串,
http://59.110.158.145:9200/megacorp/employee/_search?q=last_name:Smith
我们也同样找到了
他们的last_name都叫Smith,只不过一个叫Jane,一个叫Jone,而我们这个有相关性得分,我们就得到了
这条结果,我们可以看更多的搜索查询,比如我们搜索的时候不写查询字符串,我们使用查询的表达式,
所谓查询表达式呢,给ES提供一串JSON表达式,JSON里面指定查询规则,
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
语法大概看一下,查询按照一个匹配规则,匹配规则就是last_name等于Smith,更多的语法可以结合文档慢慢的学习,
虽然这个示例是发GET请求,他这个东西是放在请求体中的,GET没有请求体,所以我们测试的时候发POST就行了,
查询还是不用写查询字符串了,写上我们这些查询规则
我们看到和之前的效果是一样的,total找到两个没问题,这个JSON查询的表达式,是非常重要的,
比如这里有一个更复杂的查询示例,只要我们把查询表达式写的复杂,他就会做更复杂的工作,
GET /megacorp/employee/_search
{
"query" : {
"bool": {
"must": {
"match" : {
"last_name" : "smith"
}
},
"filter": {
"range" : {
"age" : { "gt" : 30 }
}
}
}
}
}
匹配last_name是Smith的,filter要过滤,按照什么过滤呢,按照年龄要大于30岁以上,所以我们写了一个复杂的
查询规则
定义复杂的查询表达式,我们继续检索其他的检索功能,我们来找全文检索,全文检索我来换上一个表达式
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"about" : "rock climbing"
}
}
}
我们根据员工的about字段查,查他是否有"rock climbing",我们来点一个send
还有短语检索
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_phrase_search.html
我们刚才看到全文检索的情况下,我们要检索的这两个字段,你有任何一个都行,但是往往我们有时候要检索,
要他完全匹配,我们把它当做一个完整的单词,而不是分词了,要把它当成完整的单词呢,来进行搜索
POST /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
这个时候就只会查处一个结果了,他要完整匹配, 把rock_climbing当成一个单词,那只能查出一条记录,这就是我们说的短语搜索,
把它当成一个完整的短语,还有高亮搜索
https://www.elastic.co/guide/cn/elasticsearch/guide/current/highlighting-intro.html
比如我们还是按照完全匹配的方式,找rock_climbing,然后我们要高亮的字段,在这指定,这是新的查询表达式
POST /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
},
"highlight": {
"fields" : {
"about" : {}
}
}
}