全文检索
把要搜索的内容 进行分词储存为倒排索引, 搜索的时候,去扫描的是内容中的所有关键词而不是去扫描内容本身
内容中能拆分出来多少词 倒排索引中就会有多少行 先遍历倒排索引中的关键词,然后去数据源中找到数据返回
Lucene
封装了建立倒排索引,以及搜索的代码,包括各种算法, 提供了java使用的api,用Lucene可以将已有的数据建立索引,Lucene会在本地磁盘上组织索引的数据结构,另外可以用Lucene提供的提供的功能和api对磁盘上的索引数据进行搜索
Elasticsearch
Lucene索引是建立在磁盘上的,当数据量大的时候,建立的索引数据占用的空间也会越来越大, 可能会需要多台机器来存放索引数据,这时前端搜索关键字的时候,就需要去判断去哪台机器上的索引搜索,而且服务器宕机的情况下索引数据可能会丢失等.
这个时候就需要Elasticsearch,ES底层封装了Lucene,可以配置多个ES节点
优点:
- 自动维护数据的分布到多个节点的索引建立,还有搜索请求分布到多个节点的执行
- 自动维护数据的冗余副本,保证某些机器宕机之后不会丢失数据
- 封装了更多的高级功能,便于快速开发应用,提供更复杂的搜索功能,聚合分析的功能,基于地理位置的搜索等
功能:
- 分布式的搜索引擎和数据分析引擎
- 数据分析:比如查询一个电商网站中,某一类商品销量前10的店铺;某类商品中一个月内访问量最高的商品等
- 全文检索,结构化检索,数据分析
- 结构化检索:比如搜索某一类的商品有哪些
- 对海量的数据进行实时的处理
- ES可以自动将海量的数据分散到多台服务器上存储和检索
- 进实时是指秒级别的数据搜索和分析
特点:
- 可以作为一个大型分布式集群技术,处理PB级别的数据, 也可以运行在单机上
- 将全文检索和数据分析合并在了一起
- 对用户而言 开箱即用
- 对传统数据库的补充,提供了很多数据库不能提供的功能,如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理等
核心概念
Near RealTime(NRT): 近实时, 从数据写入到可以被搜索到大概有1s的延迟; 基于ES执行搜索和分析可以达到秒级
Cluster: 集群,包含多个节点,节点可以通过配置集群名称来标识是属于哪个集群的
Node:节点 集群中的一个节点, 节点也有名称(默认是随机分配的), 默认节点会被加入到名为”elasticsearch”的集群
Document&field: 文档,ES中的最小数据单元,一个document可以是任意一条数据, 数据结构通常是JSON 一个document中会有多个field,每个field就是json中的一个字段
Index:索引,包含一堆相似结构的文档数据, 比如有一个订单索引,商品分类索引,索引会有一个名称,一个index代表了一类类似的或者相同的document,index可以包含多个document,比如创建一个product index(商品索引),里面就可能存放了所有的商品数据
Type:类型,每个索引里可以有一个或多个type, type是index中的一个逻辑分类,一个type下的document都有相同的filed
shard:单机无法存储大量数据,ES可以将一个索引中的数据拆分成多个shard,分布在多台服务器上存储.有了shard就可以横向扩展,当数据量增加的时候,直接再增加一个es节点就可以了,搜索和分析的操作分布到多台服务器上执行可以提高吞吐量和性能.
replica: 服务器可能随时故障或宕机,此时shard节点会丢失,因此可以为每个shard创建多个replica副本, replica可以在shard宕机的情况下提供备用服务 同时可以提升搜索操作的吞吐量和性能.
primary shard(建立索引时一次设置,不能修改,默认5个)
replica shard(随时修改数量,默认1个<对应每个primary shard的1个>), 默认每个索引10个shard,5个 primary shard,5个replica shard 最小的高可用配置是两台服务器
ES对应到数据库
document —> 行
type —> 表
index —> 库