赞
踩
一、ES介绍:
二、请求方式:
三、基本操作
MySQL:数据库 -> 数据表 -> 数据 ES:index -> type -> document
索引 (表)
文档 (数据):对数据的操作需要先找到Index再找到type再找到文档编号,文档编号类似于MYSQL中的主键
添加 – POST index_name/_doc/101
删除 – DELETE index_name/_doc/101
不会物理删除,只会将其标记为deleted,当数据越来越多时,在后台自动删除
修改 – POST index_name/_doc/101
全量修改、部分更新(脚本修改、文档合并等)
修改数据和添加数据相同,若不存在该数据,则会创建一条数据;存在该数据,则进行全量替换,替换document的json串内容
document是不可变的,如果要修改document的内容,就要进行全量替换,直接对document重新创建索引,替换里面的内容
es会把之前的document标记为deleted,然后新增给定的document,当创建越来越多,es会在后台自动删除标记为deleted的document
查询 – GET index_name/_doc/101
四、复杂查询
精确查询
term 不对关键字进行分词,进行全匹配
GET /index1/_search
{
"query":{
"term":{
"item": "1001"
}
}
}
terms 多关键词全匹配
GET /index1/_search
{
"query":{
"terms":{
"item": ["1001","1002","1003"]
}
}
}
模糊查询
match 对关键词进行拆词匹配
GET /index1/_search
{
"query":{
"match":{
"itemName": "花瓶"
}
}
}
match_all 对所有关键词进行拆词匹配
multi_match 多属性匹配
GET /index1/_search
{
"query":{
"multi_match":{
"query": "类别",
"fields": ["itemName","itemPrice"]
}
}
}
分页查询
GET /index1/_search
{
"query":{
"match":{
"itemName": "花瓶"
}
},
"from":0,
"size":3
}
排序 “order”:“asc/desc”
GET /index1/_search { "query":{ "match":{ "itemName": "花瓶" } }, "from":0, "size":3, "sort": [ { "itemPrice": { "order": "asc" } } ] }
范围查询 – gte lte
GET /index1/_search
{
"query":{
"range": {
"itemPrice": {
"gte": 5,
"lte": 20
}
}
}
}
模糊查询 – “fuzzy”:{}
GET /index1/_search
{
"query":{
"fuzzy": {
"itemName": {
"value": "瓶"
}
}
}
}
复合查询 must->and should->or must_not->not
在查询数据时,复合条件的文档会通过_source字段返回数据
GET index1/_search { "query": { "bool":{ "must": [ { "match": { "itemName": "花瓶" } } ] } }, "sort": [ { "itemPrice": { "order": "asc" } } ], "_source": ["itemPrice","itemName"], "from": 0, "size": 5, "highlight": { "fields": { "itemName": {} }, "pre_tags": "aaaa", "post_tags": "ddddd" } }
五、面试相关知识
source字段会存储文档的原始信息,在查询复合条件的文档时,会通过_source字段返回原始信息;但有时并不需要source字段,不使用能节省不少的存储空间;以下几种情况必须有source:
ES:是一个基于Lucene框架的搜索引擎产品,提供Restful风格的操作接口
倒排索引:索引是从ID到内容,倒排索引是从内容到ID。比较适合做关键字检索,可以控制数据总量,提高查询效率。如:根据输入的某个单词,找到含有这个单词,或与这个单词有关的文章
text和keyword类型的区别:keyword类型是不会分词的,直接根据字符串内容建立倒排索引,所以keyword类型的字段只能通过精确值搜索;text类型在存入es时,回显分词,然后根据分词后的内容建立倒排索引
query和filter的区别:query查询操作不仅会进行查询,还会计算分值,用于确定相关度;filter:查询操作仅判断是否满足查询条件,不会计算分值,也不关心返回的排序问题,同时filter查询的结果可以被缓存,提高性能
ES写入数据的工作原理:
ES的更新和删除流程:
ES查询数据的工作原理:
总结:客户端将请求发动到协调节点,协调节点将请求广播到数据节点,数据节点的分片进行数据查询,返回结果进行汇总并排序,协调节点向包含文档ID的分片发送get请求,得到文档数据后,整合返回给客户端
ES的搜索流程:
ES的深度分页与滚动搜索scroll:
ES在高并发下如何保证读写一致:
建立索引阶段性能提升方法:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。