ES 总结(一)

ES

Elasticsearch 是一个分布式、可扩展、实时的搜索与数据分析引擎。Elastcisearch 是分布式的 文档 存储。它能存储和检索复杂的数据结构—​序列化成为JSON文档—​以 实时 的方式。 换句话说,一旦一个文档被存储在 Elasticsearch 中,它就是可以被集群中的任意节点检索到。

核心概念

1、_index
一个 索引 应该是因共同的特性被分组到一起的文档集合。
2、_type
Elasticsearch 公开了一个称为 types (类型)的特性,它允许您在索引中对数据进行逻辑分区。不同 types 的文档可能有不同的字段,但最好能够非常相似/
3、_id
ID 是一个字符串,当它和 _index 以及 _type 组合就可以唯一确定 Elasticsearch 中的一个文档。 当你创建一个新的文档,要么提供自己的 _id。

ES和关系型数据库

es副本分片承担查询的压力,不承担写入的压力

ES关系型数据库
索引(index)数据库 (database)
类型(type)表(table)
文档(Docment)行 (row)
字段(Field)列 (column)

ES查询语法

1、匹配全部

GET /product/_search
{
"query":{
	"match_all":{}
}
}

2、匹配name为xx,并且按price降序排序

GET /product/_search
{
"query":{
	"match":{
		"name":"xx"
		}
},

 "sort":{
{
    "price":"desc"
		}
	}
}

3、多字段匹配(name和desc都包含aws)

GET /product/_search
{
"query":{
	"multi_match":{
	"query":"aws"
	"fields":["name","desc"]
	}
},
"sort":{
{
"price":"desc" #并且按照价格排序
		}
	}
}

4、返回部分字段

GET /product/_search
{
"query":{
	"match_all":{}
	}"_source":["name","price"]   #元数据想要多个字段
}

5、分页

GET /product/_search
{
"query":{
	"match_all":{}
},
	"from":0,
	"size":2
}
GET /product/_search
{
"query":{
	"match_all":{}
},
"sort":{
	"price":"asc" #按照price进行降序排序
}
	"from":0,
	"size":2
}

6、全文检索
6.1term和match

GET /account/_search
{
	"query":{
	"term":{
		"name":"Amazon redshift" #当前这个词不会被分割
		}
	}
}

6.2组合查询

GET /account/_search 
{
"query":{
	"bool":{
		"must":[
			{"term":{"name":"rds"}},#查询name是rds和aws字段。
			{"term":{"name":"aws"}}
			]
		}
	}
}
GET /account/_search
{
"query":{
	"terms":{
		"name":["aws","rds"]#查询name包含rds和aws字段。
	}
  }
}

7、Query and filter:过滤与查询
(1)must:必须满足
(2)filter:过滤器,不计算相关度分数
(3)should:可满足
(4)must_not:必须不满足,不计算相关分数

GET /account/_search
{ #同时满足name包含iam,desc包含Redshift
	"query":{
	 	"bool":{
			"must"[
			 {"match":{"name":"iam"}},
			 {"match":{"desc":"redshift"}}
			 ] ,
			 #filter不计算相关度,filter的查询性能比query要高。
			 "filter":[
			 {"match_phara":{"name":"aws iam"}},
			 {
			 "range":{
			 	"price":{
			 		"gt":1009 #gt表示大于,gte 大于等于
			 		}#lt表示小于,lte表示小于等于
			 	}
			 }
		   ] 
	 	 }
	 }
}
GET /account/_search
{
"query":{
	"bool":{
		"must":[
		{"match":{"name":"rds"}}#name必须包含rds
		]
		"must_not":[
		 {"match":{"name":"iam"}}#name必须不包含iam
		 ],
		 "should":[
		 {"match":{"desc":"aws"}}
		 ],
		 "filter":[ #筛选条件price大于4999
		 {"range":{
		 		"price":{
		 			"gt":4999
		 			}
		 		}
		 	}
		  ]
		}
	}
}
GET /account/_search
{
"query":{
	"bool":{
		"must":[
		    {"match":{"name":"aws"}}
		],
		"should":[
		 	{"range":{
		 	 	"price":{"gt":3999}
		 	 }},
		 	{
		 	 "range":{
		 	   "price":{"gt":1999}
		 	 }}
		 ],
		 "minimum_should_match":2
		}#如果"minimum_should_match":1,则should中条件仅仅满足一个,默认是0(可以不满足should中的条件)
		#若"minimum_should_match":2,则should中条件必须满足两个。
	}
}
GET /account/_search
{
"query":{
		"constant_score":{
		 "filter":{
		   "bool":{
		  	 "should":[
		  	  {"term":{"name":"rds"}},#name包含rds或者aws
		  	  {"term":{"name":"aws"}}
		  	  ],
		  	 "must_not":{"term":{"name":"www"}}
		  	}
		 		}
		 	}
		}

}

8、Deep paging问题:尽量避免
(1)解释:当你的数据超过1w,不要使用
(2)返回结果不要超过1000个
(3)解决办法:尽量避免深度查询 使用Scroll search
9、Scroll search

GET /account/_search?scroll=1m #使用Scroll search查询
{"query":{
	"match_all":{}
	},
	"sort":[
	 	{"price":"asc"}
	 	],
	 "size":2 
}#查询的数据会包含_scroll_id ,_scroll_id会记录查询到的位置
GET /_search/scroll #加索引会报错
{
"scroll":"1m",
"scroll_id":"查询数据的id"
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值