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