目录
- 1、es 中的数据格式
- 2、集群管理
- 3、CRUD 操作
- 4、多种搜索
1、es 中的数据格式
- 与传统的数据库的关系型数据格式不同,es的数据格式是面向文档 document ,而不是面向对象的。
- 应用系统的数据结构都是面向对象的,它是比较复杂的,对象数据存储到数据库中,只能拆解开来,变为扁平的多张二维表,每次查询的时候,还要还原对象格式,故很麻烦。
- es是面向文档document的,文档中存储的数据结构,与面向对象的数据结构是一样的,基于这种文档的数据结构,es可以提供复杂的索引、全文检索、分析聚会等功能,通常es的document使用json数据格式来表达。
例如:
{
"email": "zhangsan@sina.com",
"first_name": "san",
"last_name": "zhang",
"info": {
"bio": "curious and modest",
"age": 28,
"interests": [ "bike", "climb" ]
},
"join_date": "2019/01/01"
}
2、集群管理
(1)快速检查集群的健康状态
GET /_cat/health?v
集群的健康状况:green、yellow、red
green: 每个index的primary shard 和 replica shard 都是active;
yellow: 每个index的primary shard 都是active,但是部分replica shard 是active;
red:部分primary shard 是active,这表明索引数据丢失。
问题:
当启动一个节点时,发现反馈的状态时yellow,原因是什么,再次启动一个节点,反馈的状态为green,原因又是什么?
解答:
我们现在就一个笔记本电脑,就启动了一个es进程,相当于就只有一个node。现在es中有一个index,就是kibana自己内置建立的index。由于默认的配置是给每个index分配5个primary shard和5个replica shard,而且primary shard和replica shard不能在同一台机器上(为了容错)。现在kibana自己建立的index是1个primary shard和1个replica shard。当前就一个node,所以只有1个primary shard被分配了和启动了,但是一个replica shard没有第二台机器去启动,故cluster status为yellow。
此时只要启动第二个es进程,就会在es集群中有2个node,然后那1个replica shard就会自动分配过去,然后cluster status就会变成green状态。
(2)快速查看集群中索引
GET /_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open .kibana 27XiFTvIR6G30nY7db6puA 1 1 1 0 3.1kb 3.1kb
yellow open test_index -5WDMqhdSUWHHLnA9nm1Ag 5 1 6 0 20.7kb 20.7kb
yellow open company xh8htM1BRJ-_LATV17tZwA 5 1 6 0 28.1kb 28.1kb
yellow open ecommerce 2FcmNvm0TD-tvuVtcPz_kg 5 1 3 0 16.9kb 16.9kb
yellow open my_index_new 3WbcDFP8SgS8FST01zCfFQ 5 1 2 0 6.6kb 6.6kb
yellow open my_index UY2JTsUeS8S4VVa01O8Z9A 5 1 3 0 10kb 10kb
(3)创建索引
PUT /test_index
反馈信息
{
"acknowledged": true,
"shards_acknowledged": true
}
(4)删除索引
DELETE /test_index
反馈信息
{
"acknowledged": true
}
3、CRUD 操作
(1)添加数据,新增文档,建立索引,
es会自动建立index和type,不需要提前创建,而且es默认会对document每个field都建立倒排索引,让其可以被搜索。
PUT /index/type/id
{
"json数据"
}
例如
PUT /ecommerce/product/1
{
"name":"gaolujie yagao",
"desc":"gaoxiao meibai",
"price":30,
"producer":"gaolujie producer",
"tags":["meibai","fangzhu"]
}
反馈信息
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
(2)查询信息:检索文档
GET /index/type/id
例如
GET /ecommerce/product/1
反馈信息
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"name": "gaolujie yagao",
"desc": "gaoxiao meibai",
"price": 30,
"producer": "gaolujie producer",
"tags": [
"meibai",
"fangzhu"
]
}
}
(3)修改文档,全量替换
PUT /index/type/id
{
"json数据"
}
PUT /ecommerce/product/1
{
"name" : "jiaqiangban gaolujie yagao",
"desc" : "gaoxiao meibai",
"price" : 30,
"producer" : "gaolujie producer",
"tags": [ "meibai", "fangzhu" ]
}
(4)修改文档,update
POST /ecommerce/product/1/_update
{
"doc": {
"name":"jiaqiangban gaolujie yagao"
}
}
(5)删除信息:删除文档
DELETE /ecommerce/product/1
4、多种搜索
(1)query string search
query string search的由来,因为search参数都是以http请求的query string来附带的。搜索商品名称中包含yagao的商品,而且按照售价降序排序:GET /ecommerce/product/_search?q=name:yagao&sort=price:desc
适用于临时的在命令行使用一些工具,比如curl,快速的发出请求,来检索想要的信息;但是如果查询请求很复杂,是很难去构建的,在生产环境中,几乎很少使用query string search。
搜索全部商品:GET /ecommerce/product/_search
反馈信息
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "ecommerce",
"_type": "product",
"_id": "2",
"_score": 1,
"_source": {
"name": "jiajieshi yagao",
"desc": "youxiao fangzhu",
"price": 25,
"producer": "jiajieshi producer",
"tags": [
"fangzhu"
]
}
},
{
"_index": "ecommerce",
"_type": "product",
"_id": "3",
"_score": 1,
"_source": {
"name": "zhonghua yagao",
"desc": "caoben zhiwu",
"price": 40,
"producer": "zhonghua producer",
"tags": [
"qingxin"
]
}
}
]
}
}
其中参数含义:
took:耗费了几毫秒
timed_out:是否超时,这里是没有
_shards:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或者是它的某个replica shard也可以)
hits.total:查询结果的数量,2个document
hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高
hits.hits:包含了匹配搜索的document的详细数据
(2)query DSL
DSL: Domain Specified Language
http request body 请求体,可以使用json格式构建查询语法,可以构建各种复杂语法,比query string search 强大,更加适合生产环境的使用,可以构建复杂的查询
查询所有商品
GET /ecommerce/product/_search
{
"query": {
"match_all": {}
}
}
查询名称包含yagao的商品,同时按照价格降序排序
GET /ecommerce/product/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order": "desc"
}
}
]
}
分页查询商品,总共2条商品,假设每页就显示1条商品,现在显示第2页,所以就查出来第2个商品
GET /ecommerce/product/_search
{
"query": {
"match_all": {}
},
"from": 1,
"size": 1
}
指定要查询出来商品的名称和价格就可以
GET /ecommerce/product/_search
{
"query": {
"match_all": {}
},
"_source": [
"name",
"price"
]
}
(3)query filter
搜索商品名称包含yagao,而且售价大于25元的商品
GET /ecommerce/product/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "yagao"
}
}
],
"filter": {
"range": {
"price": {
"gte": 25
}
}
}
}
}
}
(4)full text search
GET /ecommerce/product/_search
{
"query": {
"match": {
"name": "jiajieshi yagao"
}
}
}
(5)phrase search
全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回。然而,phrase search,跟全文检索相反,要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能作为结果返回。
GET /ecommerce/product/_search
{
"query": {
"match_phrase": {
"name": "jiajieshi yagao"
}
}
}
(6)highlight search
GET /ecommerce/product/_search
{
"query": {
"match": {
"producer": "producer"
}
},
"highlight": {
"fields": {
"producer": {}
}
}
}