Elasticsearch入门一

一、认识ES

二、ES功能

分布式、搜索(全文检索、结构化检索)、数据分析

三、lucene和ES的前世今生

lucene是最先进、功能最强大的搜索库,直接基于lucene开发,非常的复杂。

elasticsearch,基于lucene,隐藏复杂性,提供简单易用的api接口。

四、ES的核心概念

  1. Near Realtime(NRT):近实时,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级
  2. Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称默认是:elasticsearch)来决定的。
  3. Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配),默认节点会去加入一个elasticsearch的集群,如果直接启动一堆节点,它们会自动组成一个elasticsearch集群,当前一个节点也能组成elasticsearch的集群。
  4. Document:文档,es中的最小数据单元,每个index下的type中,都可以去存储多个document,一个document里面有多个field,每个filed就是一个数据字段。
  5. Index:索引, 包含一堆有相似结构的document数据。
  6. Type:类型,每个index里都可以有一个或者多个Type。
  7. shard:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。
  8. 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
                   }
                ]
            }
        }
    }
}

你可能感兴趣的:(Elasticsearch入门一)