1. ElasticSearch基本使用
1.1 基本概念
- 集群和节点 :多个节点组成一个集群,每一个集群都有一个唯一的名字,默认为“elasticsearch”,每一个节点都有其自己的名字,但每一个节点都是通过集群的名字来加入集群的
- 索引:含有相同属性的文档集合,就相当于sql里面一个database,就是一个数据库;
- 类型:索引可以定义一个或多个类型,文档必须属于一个类型,就相当于sql里面一个table,也就是一个表;索引名要小写且没有下划线
- 文档:是可以被索引的基本数据单位,相当于sql里面的一条记录;
- 分片:每个索引都有多个分片,每个分片都是一个Luence索引;分片是为了缓解大数据量的索引所带来的硬盘压力,并减少对搜索速度造成的瓶颈;分片允许用户进行横向和纵向的扩展
- 备份:拷贝一份分片就完成了分片的备份;可以在主分片失效或者损坏的时候来代替主分片来执行搜索任务,提高ES的可用性,并分摊搜索压力
- ES在创建是会自动创建五个分片,一个备份;分片的数量只能在创建索引的时候确定,而不能在后期进行修改,而备份可以修改
1.2 RESTFul API
ElasticSearch的API组成示意RESTFul API的风格来命名自己的API的;
API基本格式:http://:/<索引>/<类型>/<文档id>
常用HTTP动词:GET/ PUT/ POST/ DELETE
1.3 创建索引
1.3.1 非结构化创建
这里可以查看book这个索引的信息来看出来,他是结构化还是非结构化的索引
1.3.2 结构化创建
{
"novel": {
"properties": {
"title": {
"type": "text"
}
}
}
}
再去到概览里面,右上角刷新,之后查看book的索引信息,就会看到mapping当中有了参数
这里会有一个问题,就是在复合查询的时候,json格式的数据会很麻烦而且易错,所以大家可以考虑使用Postman工具来进行API的操作;
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
},
"mappings":{
"man":{
"properties":{
"name":{
"type":"text"
},
"country":{
"type":"keyword"
},
"age":{
"type":"integer"
},
"data":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
再次刷新Head插件页面,便会展示出我们刚设置好的索引
1.4 插入操作
1.4.1 指定文档id插入
还是利用postman工具,访问people/man/1并输入接送数据
然后再次刷新Head插件页面,你会发现people这个索引下面的docs从0变成了1,这便意味着我么插入数据成功了,最上方数据浏览选项卡里面便能够看到我们插入的数据;
1.4.2 自动产生文档id插入
直接借用上面的数据做一些修改
这个时候你可以去Head页面去查看了,docs从1变成2了,数据浏览也能看到我们刚刚插入的信息;
1.5 修改操作
1.5.1 直接修改文档
1.5.2 脚本修改文档
脚本修改,就是利用ES内置支持的语言,来对文档内容进行修改;ES自身支持的语言有:painless,groovy,JavaScript以及python;
当然也可以把参数提取出来,单独写
{
"script":{
"lang":"painless",
"inline":"ctx._source.age = params.age",
"params":{
"age":100
}
}
}
1.6 删除操作
1.6.1 删除文档
删除文档的操作就很简单,只需要在postman中输入想要删除的文档id的路径,发送一个delete请求就可以了
1.6.2 删除索引
删除索引就属于一种敏感操作,一旦删除,就会失去该索引下面所有的数据;
删除操作你可以直接在head界面里,在你想要删除的索引下面动作下拉栏里面去删除
当然你也可以在postman中进行删除,类似删除文档,你只需要把路径保留到你要删除的索引,发送delete请求即可;
上面两个步骤执行完成后,就把之前创建的两个索引都删掉了,此时再来head来查看,就不再有任何的数据了;
1.7 查询操作
1.7.1 准备工作
我们上面的操作已经清空了我们ES,这里为了方便我们后面的查询操作,我预先构建了一个索引,这里我只放出结构,希望大家能够自己动手去创建一下,以加深印象
1.7.2 简单查询
顾名思义,简单查询就只需要输入路径加你想要查询的id,发送get请求即可
1.7.3 条件查询
添加查询就是发送一些你设定好的条件参数,然后post发送这些参数,等待ES查询结果
这里先简单说明一下里面的一些参数是什么意思,具体的语法在后面会详细讲解
{
// 查询
"query":{
// 匹配所有
"match_all":{},
// 匹配(按条件)
"match":{
"title":"Java"
}
},
// 从哪开始
"from":1,
// 数据个数
"size":2,
// 自定义排序
"sort":[
// 出版日期,降序
{"publish_date":{"order":"desc"}}
]
}
1.7.4 聚合查询
{
// 聚合查询关键字
"aggs":{
// 自定义查询名称(可以多个)
"group_by_word_count":{
// 关键词,聚合
"terms":{
// 指定聚合字段
"field":"word_count"
},
// 关键词,计算
"stats":{
"field":"word_count"
}
}
}
}
最下面便是聚合信息,相同字数的数据便被聚合在了一起;
2. ElasticSearch高级使用
query,filter语法
2.1 子条件查询
子条件查询就是以特定字段查询所指特定值:分为Query Context和Filter Context
-
Query Context
在查询过程中,除了判断文档是否满足查询条件外,ES还会计算一个_sorce来表示匹配度,旨在判断目标文档和查询条件匹配的有多好
a. 全文本查询:针对文本类型数据;
{ // 查询 "query":{ // 匹配所有 "match_all":{}, // 匹配(按条件模糊搜索) "match":{ "title":"Java" }, // 精确匹配 "match_phrase":{ "title":"Java" }, // 组合搜索 "multi_match":{ // 搜索内容 "query":"", // 搜索范围 "fields":[] }, // 语法查询(支持通配符,布尔查询等) "quer _string":{ // 搜索内容(利用AND或者OR来进行连接) "query":"", // 搜索范围 "fields":[] } } }
b. 字段查询:针对结构化数据,如数字,日期等;
{ // 查询 "query":{ // 范围查询 "range":{ "word_count":{ // 大于等于(greater than or equal) "gte":1000, // 小于等于 "lte":10000 } } } }
-
Filter Context
在查询过程中,只判断该文档是否满足条件,只有YES或NO;filter基本上就是用来做数据过滤的,比query要快一些,但是要结合bool来使用,结果会被ES进行缓存;
{ // 查询 "query":{ // bool关键字 "bool":{ // filter关键词 "filter":{ // 过滤条件 "trem":{ } } } } }
2.2 复合条件查询
复合条件查询就是以一定的逻辑组合子条件查询,常见的包括:固定分数查询,布尔查询等等;
{
"query":{
// 固定分数查询
"constant_score":{
// 过滤
"filter":{
"match":{
}
},
// 指定分数
"boost": 1
},
// 布尔查询
"bool":{
// 应当满足的条件
"shoule":[
// 多个条件之间为或
],
// 必须满足的条件
"must":[
// 多个条件之间为与
],
// 必须不能满足
"must_not":[
]
// 这些都可以和filter进行组合,再进一步筛选
}
}
}