一、认识ES
二、ES功能
分布式、搜索(全文检索、结构化检索)、数据分析
三、lucene和ES的前世今生
lucene是最先进、功能最强大的搜索库,直接基于lucene开发,非常的复杂。
elasticsearch,基于lucene,隐藏复杂性,提供简单易用的api接口。
四、ES的核心概念
- Near Realtime(NRT):近实时,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级
- Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称默认是:elasticsearch)来决定的。
- Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配),默认节点会去加入一个elasticsearch的集群,如果直接启动一堆节点,它们会自动组成一个elasticsearch集群,当前一个节点也能组成elasticsearch的集群。
- Document:文档,es中的最小数据单元,每个index下的type中,都可以去存储多个document,一个document里面有多个field,每个filed就是一个数据字段。
- Index:索引, 包含一堆有相似结构的document数据。
- Type:类型,每个index里都可以有一个或者多个Type。
- shard:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。
- replica:任何一个服务器随时可能故障或宕机,此时shard就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障的时候提供备用服务,保证数据不丢失。primary shard(建立索引是一次设置,不能修改,默认5个),replica shrad(随时修改数据,默认1个),默认每个索引是10个shard,5个primary shard,5个replica shard,最小高可用配置,是2台服务器。
五、简单的集群管理
1.快速检查集群的健康状况
GET /_cat/health?v
如何快速了解集群的健康状态?
- green:每个索引的primary shard和replia shard都是active状态的
- yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
- red:不是所有索引的primary shard都是active状态,部分索引有数据丢失了
2.快速查看集群中有那些索引
GET /_cat/indices?v
3.简单的索引操作
创建索引:PUT /test_index?pretty
删除索引:DELETE /test_index?pretty
六、简单的CRUD操作
添加 PUT /index/type/id
查询 GET /index/type/id
指定修改 POST /index/type/id/_update{
"doc":{
"key":"value"
}
}
删除 DELETE /index/type/id
七、多种搜索方式
1.query String search(搜索全部type下的数据):基本不用
GET: /index/type/_search
响应详解
- took:耗费了毫秒数
- timed_out:是否超时
- _shards:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shrad
- hits-> total:查询结果的数量
- hits-> max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配分数越高
- hits.hits:包含了匹配搜索的ducument的详细数据
查询倒序
GET /index/type/_search?q=key:value&sort=key:desc
2.DSL(Domain Specified Language)
查询所有type下的数据
GET /index/type/_search
{
"query":{"match_all":{}}
}
查询某个key包含value的值,同时降序排序
GET /index/type/_search
{
"query":{
"match":{
"key":"value"
}
},
"sort":[
{"key":"desc"}
]
}
分页查询,假设总共3条数据,每页就显示1条,现在显示第2页,所以就查出来第2个商品
GET /index/type/_search
{
"query":{"match_all":{}},
"from":1, //从第一个开始查
"size":1 //查多少条
}
指定要查询出来的的key
GET /index/type/_search
{
"query":{"match_all":{}},
"_source":["key1","key2"]
}
3.query filter
GET /index/type/_search
{
"query":{
"bool":{
"must":{ //must 必须匹配
"match":{"key":"value"}
},
"filter":{ //filter 筛选
"range":{
"key" :{"gt": value} //gt 表示大于
}
}
}
}
}
4.full-text search (全文检索)
GET /index/type/_search
{
"query":{
"match":{
"key" :"value value"
}
}
}
5.phrase search(短语搜索)
跟全文检索相反,全文检索会将输入的搜索串拆解开来,去倒排索引里面一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回。
phrase search(短语搜索),要求输入的搜索串,必须在指定的字段文本中,完全包含一摸一样的,才可以算匹配上,才能作为结果返回
GET /index/type/_search
{
"query":{
"match_phrase":{"key":"value"}
}
}
6.highlight search(高亮搜索结果)
GET /index/type/_search
{
"query" : {
"match":{"key":"value"}
},
"highlight":{
"fields":{"key":{}}
}
}
八、聚合分析
GET /index/type/_search
{
"size":0,// 只返回聚合
"aggs":{ //聚合
"group_by":{ //变量名(随便取)
"terms":{"field":"key"} //按某个key去分组,求出每组的数量
}
}
}
GET /index/type/_search
{
"size":0,
"query":{
"match":{"key":"value"} //先搜索
},
"aggs":{
"all_tags":{
"terms":{"field":"key"}//再分组
}
}
}
//先分组后计算平均值
GET /index/type/_search
{
"size":0,
"aggs":{
"group_by":{
"terms":{"field":"key"},
"aggs":{
"avg_xx":{
"avg":{"field":"key"}
}
}
}
}
}
//先分组后计算平均值再排序
GET /index/type/_search
{ "size":0,
"aggs":{
"group_by":{
"terms":{"field":"key","order":{"abc":"desc"}},
"aggs":{
"abc":{
"avg":{"field":"value"}
}
}
}
}
}
//按区间分组
GET /index/type/_search
{
"aggs":{
"group_by":{
"range":{
"field":"key",
"ranges":[
{
"from":0,
"to",20
},
{
"from":20,
"to":40
},
{
"from":40,
"to":60
}
]
}
}
}
}