es
是一种搜索引擎软件
搜索就是查询
和关系型数据库对比
如goods 商品表
id title sell_point
1001 华为p30手机黑色 4.5英寸
select * from goods where title like "%华为%"
1、假如 我们给 title 加上索引 但是like 左边加上 通配符后 索引会失效。意味着 全表扫描 如果有一亿个商品 那么效率很低。
模糊查询可能造成全表扫描
2、select * from goods where title like "%华为手机%" 这样是查询不出来的,必须要 华为和手机分开查。
但是es就能实现。
关系型数据库功能弱。
那么es是如何解决刚才的 两个问题的 :性能低 功能弱。
1、倒排索引:就是将文本内容进行分词形成词条 然后记录词条和数据的唯一标识的对应关系。
首先将一段文本按照一定的规则拆分成不同的词条term。
如:床前明月光 拆分为 :床前 明月 光
反向倒排索引
key (词条term)=>value(存储内容)
床=》床前明月光
前=》床前明月光
床前=》床前明月光
明=》床前明月光
月=》床前明月光
明月=》床前明月光
光=》床前明月光
月光=》床前明月光
上面的value(存储内容)数据量很大其实只需要放 id就行了
es 存储数据和搜索原理:
索引库:index 它其实就相当于关系型数据库中的 数据库。
数据叫做文档:document 他就相当于我们关系型数据库中的 表里面的一行一行的数据。
在es中文档的数据结构其实就是json的数据格式
如:{
“id”:"1",
"title":"华为p30手机",
“price”:3980.00
}
{
“id”:"2",
"title":"三星GNX手机",
“price”:3980.00
}
{
“id”:"3",
"title":"红米4g手机",
“price”:3980.00
}
如果 我们需要对 title 进行分词:具体分词规则是什么 是由es来完成的。
形成的倒排索引如下:
key value
华为 1
p30 1
手机 1,2,3
手 1,2,3
机 1,2,3
三星 2
GNX 2
红米 3
4g 3
index 索引库存储了 文档和 文档分词后的 倒排索引库。
es 搜索:
它是通过 倒排索引 来搜索
如:我们要搜索“手机"这个词
第一步 es会拿着这个 “手机这个词” 去倒排索引中去匹配。
匹配到了 就会根据 对应的id去把文档找到 返回给用户
假设:词条数据量很大 恰好要查询的词条再最后面 怎样处理?查询数据岂不是依然很慢。
es帮我们解决了 那就是 对词条进行排序 形成一个树形的数据结构(请自行补 数据结构算法知识),这样提升词条的 速度。
1、这样 关系型数据中 的查询性能低的问题 es给我们解决了。
2、假如要查询 "华为手机" 这样一个词条呢 这样没有词条匹配 岂不是查询不出来吗?
es的解决方案是 先分词 再查询