ElasticSearch强大文件检索能力,广泛用于文档和日志的,产品的全文检索的中。ElasticSearch的强大分组和统计功能,在一些电商项目也广泛使用的。
至于Es怎么安装的,我就不在这里赘述了。网上大量教程
1.倒排索引
所谓倒排索引,和我们关系型数据库的正向索引来说的,正向索引在我们关系数据库,我们通过索引定位到某一行从而查询到数据。
倒排索引,我们将关键字和文档id联系起来,从关键字定位索引的过程。刚好和我们在关系型数据库使用索引的方式刚好相反。从而也大大提高了查询效率
1.索引
索引是具有某些类似特征的文档集合。例如,您可以拥有店铺数据的索引,商品的一个索引以及订单数据的一个索引。
索引由名称标识(必须全部小写),此名称用于在对其中的文档执行索引,搜索,更新和删除操作时引用索引。相当于关系型数据库的数据库的概念。
ElasticSearch支持RESTful风格,数据查询操作,这里就用postMan做一些常见的操作,
在elasticSearch启动后,9300是作为通信接口,比如集群间通信和客户端的通讯用的。9200
则是一个http协议的数据交互端口
2.创建索引
localhost:9200/shop
创建索引我们一般用PUT请求,PUT请求支持幂等性
3.查询全部的索引
localhost:9200/_cat/indices?v
4.文档创建
文档的创建其实是向索引中添加数据的过程,一般会发送post请求
localhost:9200/shopping/_doc
{
"title": "小米手机",
"category": "小米",
"images": "http:www.xiaomi.com.xm.jpg",
"price": 3999
}
执行结果如下
{
"_index": "shopping",
"_type": "_doc",
"_id": "pmTvPoEBrGnxLZGrlllf",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
从上面可以看出es为我们自动创建了id,这个id相当于主键
通常为了便于查询,要让Es给我创建自定义的id,只需要请求地址加上我们自定义id
localhost:9200/shopping/_doc/1001
5.文档查询
文档已经保存如何查询呢,还是发送get请求带上id,id 是之前我们创建数据指定的id,注意是get请求
localhost:9200/shopping/_doc/1001
查询索引下面的所有数据
localhost:9200/shopping/_doc/_search
6.全量修改
全量修改只给整个文档的一条数据全部修改
PUT:localhost:9200/shopping/_doc/1001
{
"title": "华为手机",
"category": "小米",
"images": "http:www.xiaomi.com.xm.jpg",
"price": 4999
}
执行结果
{"_index":"shopping","_type":"_doc","_id":"1001","_version":2,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":2}
局部修改,指的是修改文档中某一条数据中对象的某一个属性比如这里我修改的是title
localhost:9200/shopping/_update/1001
{
"doc":{"title":"苹果手机"}
}
我们看看查询结果
6.数据的查询
1.条件查询
localhost:9200/shopping/_search
{
"query":{
"match":{
"category":"小米"
}
}
}
7.分页查询
如果需要分页查询呢。
{
"query":{
"match":{
"category":"小米"
}
},
"from":0,
"size":1
}
8.过滤字段
如果我们不需要那么的字段,比如说这里我不需要images,那么久可以用source:指定需要查询的字段
查询的语句是
{
"query":{
"match_all":{
}
},
"from":0,
"size":2,
"_source":["title","category"]
}
执行结果如下
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 11,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "shopping",
"_type": "_doc",
"_id": "pmTvPoEBrGnxLZGrlllf",
"_score": 1,
"_source": {
"title": "小米手机",
"category": "小米"
}
},
{
"_index": "shopping",
"_type": "_doc",
"_id": "1001",
"_score": 1,
"_source": {
"title": "苹果手机",
"category": "小米"
}
}
]
}
}
9.排序
如果我需要对price字段进行排序该怎么操作呢。
{
"query":{
"match_all":{
}
},
"from":0,
"size":2,
"_source":["title","category","price"],
"sort":{
"price":{
"order":"desc"
}
}
}
执行结果如下
{
"took": 33,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 11,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "shopping",
"_type": "_doc",
"_id": "BdYWSYEBDBuwPp6uNC_q",
"_score": null,
"_source": {
"price": 6999,
"title": "苹果手机",
"category": "苹果"
},
"sort": [
6999
]
},
{
"_index": "shopping",
"_type": "_doc",
"_id": "BtYYSYEBDBuwPp6uOi-y",
"_score": null,
"_source": {
"price": 6999,
"title": "苹果手机",
"category": "苹果"
},
"sort": [
6999
]
}
]
}
}
10.多条件查询
多条件与
多条件与的查询,即多个条件同时满足,比如说,我要查询条件为价格为2999的,并且品牌是小米的手机
{
"query":{
"bool":{
"must":[{
"match":{
"category":"小米"
}
},{
"match":{
"price":2999
}
}
]
}
},
"from":0,
"size":2,
"_source":["title","category","price"],
"sort":{
"price":{
"order":"desc"
}
}
}
查询结果如下,显然我们只命中一条记录
{
"took": 21,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "shopping",
"_type": "_doc",
"_id": "AtYTSYEBDBuwPp6u0S_A",
"_score": null,
"_source": {
"price": 2999,
"title": "小米手机",
"category": "小米"
},
"sort": [
2999
]
}
]
}
}
多条件或
比如我想查询分类为华为或者小米的手机
{
"query":{
"bool":{
"should":[{
"match":{
"category":"小米"
}
},{
"match":{
"category":"华为"
}
}]
}
}
}
11.范围查询
比如我要查询2999到4999的手机,这里我们需要用filter进行范围的过滤
{
"query":{
"bool":{
"should":[{
"match":{
"category":"小米"
}
},{
"match":{
"category":"华为"
}
}],
"filter":{
"range":{
"price":{
"gt":5000
}
}
}
}
}
}
12.聚合查询
当我们需要进行分组统计的时候,我们就需要用聚合查询了。用aggs
比如说我们所有的手机的价格进行分组统计
{
"aggs":{
"price_group":{ //名称随意命名
"terms":{
"field":"price" //分组字段
}
}
},
"size":0
}
查询结果如下:
{
"took": 21,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 12,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"price_group": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 3999,
"doc_count": 4
},
{
"key": 6999,
"doc_count": 4
},
{
"key": 5999,
"doc_count": 2
},
{
"key": 2999,
"doc_count": 1
},
{
"key": 4999,
"doc_count": 1
}
]
}
}
}