ElasticSearch 你必须知道的事

本文详细介绍了ElasticSearch的倒排索引、索引概念、RESTful接口操作,包括创建索引、文档查询、条件查询、分页、过滤字段、排序、多条件查询、范围查询、聚合查询等实战技巧,适合电商项目中的文档管理和搜索引擎应用。
摘要由CSDN通过智能技术生成

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
                }
            ]
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值