ES学习笔记
第一天
用PostMan URL:http://172.0.0.1:8080/shopping
PUT请求是具有幂等性的创建索引 而POST是不具有幂等性的创建索引 (什么是幂等性 就是两次请求一样 加入第一次创建成功了,第二次会告诉你已经存在了)
GET请求是获取索引 DELETE请求是删除索引
http://172.0.0.1:8080/_cat/indices?v 表示查询详细索引 (_cat表示查询)
POST http://172.0.0.1:8080/shopping/_doc 表示添加数据 (_doc表示索引中添加文档,添加数据就等于添加文档 )
POST http://172.0.0.1:8080/shopping/_doc/1001 表示自定义id (因为POST是不具有幂等性的,所以每次发送请求之后,会由ES自己随机生成一个id,也可以我们自己自定义一个id)
GET http://172.0.0.1:8080/shopping/_search 查询这个索引下的所有数据
完全覆盖(相当于具有幂等性的 可以用PUT请求)
POST http://172.0.0.1:8080/shopping/_update/1001 局部更新(相当于不具有幂等性 只能用POST请求)
GET http://172.0.0.1:8080/shopping/_search?q=category:小米 表示根据category=小米查询(一般有中文容易乱码 所以都是用请求体来查询)
{
"query":{
"match_all":{
(match_all代表全量查询)
},
"match_phrase":{
(matchphrasel代表完全匹配)
}
},
"highlight" : {
"name" : {
(highlight代表高亮)
}
}
"from" : 0, (页码-1)*每页数据条数
"size" : 2, (from 代表从第几页开始查 0代表第一页,size代表每页几条数据)
"_source" : ["title"] (_source 代表隐藏数据)
"sort" : {
""price : {
"order" : "desc" (根据价格进行降序)
}
}
}
第二天
1.关于分片与复制
每个索引可以分成多个分片,每个索引也可以复制0次或者多次,如果复制了多次,复制的分片不可以跟原分片在同一节点上,用来提高性能,复制和分片的数量可以创建索引的时候指定,创建完索引之后,只能动态的改变复制的数量不能改变分片的数量
2.query和filter的区别
Query context 查询上下文
这种语句在执行时既要计算文档是否匹配,还要计算文档相对于其他文档的匹配度有多高,匹配度越高,_score
分数就越高
Filter context 过滤上下文
过滤上下文中的语句在执行时只关心文档是否和查询匹配,不会计算匹配度,也就是得分。
执行全文检索或者查询结果依赖相关度分值时需要用query,但是执行精确值查询或者查询结果只有yes或者no,这时需要用filter。并且filter查询速度较快,并会进行缓存,后面可以提升查询速度,而query因为要计算相关度分值,所以是重量级查询,并且不会进行缓存
3.keyword和match_phrase的区别
文档字段属性如果是一个keyword
类型,那就需要完全匹配才能命中。好比这个字段值是12345
,那么你不论是1234
还是123456
都不会命中。
如果是match_phrase
,那就是真正的包含关系。好比这个字段值是12345
,那么你是1234
就会命中,而123456
不会命中。因为12345包含1234而不包含123456。
4.为什么filter过滤快
楷文:
filter查询快,一个原因是因为不需要评分,其次就是filter采用的数据结构 bit set,filter的缓存实际上就是bitset的缓存,filter在使用bitset的过程中:会先从稀疏bitset开始过滤,filter过滤采用的数据结构
分片控制:用户可以访问任一节点获取数据,这个节点就是协调节点,假如它的负载比较大,它会轮询来把请求发给合适的节点
路由计算:hash(id)%主分片数量