什么是搜索?
如果使用数据库做搜索会怎样?
什么是全文检索和Lucene
什么是ElasticSearch?
1. 什么是搜索?
百度、google上查询任何需要的内容信息。这种是通用的搜索。但是百度只是一个通用的搜索引擎,并不等于搜索。
垂直搜索(站内搜索): 在指定领域或内容区域搜索内容,
互联网的搜索:
比如淘宝,拉钩,今日头条等。
IT系统的搜索:
OA软件,办公自动化软件,会议管理,日程管理,项目管理等。
搜索:就是在任何场景下,找寻你想要的信息,这个时候,会输入一段你想要的关键字,然后就期望找到这个关键字相关的信息。
2. 如果使用数据库做搜索会怎样?
关系型数据库: RDBS
select * from a where product_name LIKE "%关键字%"
上面,如果没有做索引的话,就会每条记录都会去查询匹配。
建了索引的,可以提高查询的效率,随着数据的增加的,时间也会增加。
另外一个问题,如果关键词是严格匹配的。不能将搜索词拆分开来。尽可能去搜索更多的符合预期的结果。
缓存型数据库: NOSQL
3. 全文检索和Lunence
倒排索引:
词条,索引
全文检索:
倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。
倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。
(2)Lucene,就是一个jar包,里面封装好的各种倒排索引,以及进行搜索的代码,包括各种算法。我们就用java开发的时候,引入lucene jar,然后基于lucene进行开发就可以了。用lucene,我们就可以将已有的数据建立缩影,lucene会在本地磁盘上面,给我们组织缩影的数据结构,另外的话,我们也可以用lucene提供的功能和api来针对磁盘上额。
Lucene是封装了搜索引擎大的功能。
4.什么是ElasticSearch?
数据量很大的,多台服务器上存放数据,
数据的搜索
高可用
数据量很大的时候,超过单台机器的承受的能力。必须用多台的机器的搜索和管理。
1.数据丢失
如何高性能的建立索引,以及执行搜索
特点:
1.自动维护数据的分布到多个节点的索引的建立,还有搜索请求分布到多个节点的执行。
2.自动维护数据的冗余副本,保证说,一些机器的宕机了,不会丢失任何数据。
3.封装了更多的高级功能,以给我们提供更多高级的支持,让我们快速的开发应用,开发更加复杂的应用。
ElasticSearch介绍
ES功能
使用场景
特点
1. ES的功能
-
分布式的搜索引擎和数据分析引擎
搜索,百度,网站的站内搜索,IT系统检索,数据分析 分布式、搜索、数据分析
-
全文检索、结构化检索、数据分析
全文检索: 查询所有商品的包含mac的商品 select * from products where product_name like "%mac%"
结构化搜索
部分匹配、自动完成、搜索纠错、搜索推荐
数据分析:数据统计、聚合等
-
对海量数据进行近实时的处理
分布式:ES自动可以将海量数据分散到多台服务器上去存储和检索。
海量数据的处理,分布式以后,就可以采用大量的服务器去存储和检索数据,自然而然可以实现海量数据的处理。
近实时:检索一个数据 (离线数据批处理 batch-processing)
2. ES的适用场景
维基百科
The Guardian、新闻
Stack Overflow
Github
电商网站、检索商品
日志数据分析、logstash采集日志、ES进行复杂的数据分析(ELK)
商品价格监控网站、用户设定价格阈值
BI系统、商业智能、ES执行数据分析和挖掘
3. ES特点
可以作为一个大型的分布式集群(数百台服务器)技术,处理PB级数据,服务大公司,可以运行在单机上,服务小公司。
ES不是什么新技术,主要是将全文检索、数据分析以及分布式技术合并在一起,才形成了独一无二的ES.lucene(全文检索)、商用的数据分析软件、分布式数据库 (mycat)
对用户而言,是开箱即用,非常简单,作为中小型的应用,直接3分钟部署ES,就可以作为生产环境的系统使用,数据量不大,操作不是很复杂。
数据库的功能面对很多领域是不够用的(事务,还有各种联机事务的操作):特殊的功能,比如全文检索、同义词处理、相关度排名、复杂数据分析、海量数据近实时处理;ES作为传统数据库的一个补充,提供了数据库所不能提供的很多功能。
ES的核心概念
1. Lucene和es的前世今生
2. es的核心概念
3. es的核心概念 vs 数据库核心概念
1. lucene和ES的前世今生
lucene,最先进、功能最强大,基于lucene开发非常复杂,api复杂(实现一些简单的功能,写大量的java代码),需要深入理解原理(各种索引结构)
ES,基于lucene,隐藏了复杂性,提供了简单易用的restful api接口、java api接口(还有其他语言的api接口)
分布式的文档存储引擎
分布式的搜索引擎和分析引擎
分布式、支持PB级数据
开箱即用,优秀的默认参数,不需要任何额外设置,完全开源。
2. ES的核心概念
Near Realtime(NRT):近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒):基于ES执行搜索和分析可以达到秒级
Cluster:集群:包括多个节点,每个节点属于哪个集群(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就是一个节点很正常。
Node:节点,集群中的一个节点,节点也有一个名称(默认随机分布的),节点名称很重要,在执行运维管理的时候,默认节点会加入一个名称为"elasticsearch"的集群,如果直接启动一堆节点,那么他们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个集群。
Document:文档,ES中最小的数据单元,一个document通常是使用json的数据格式表示的。每个index下的type,都可以存储多个document. 一个document中有很多字段field,一个field就是一个数据字段。
{
name: "JmyvpeE",
cluster_name: "elasticsearch_youdi",
cluster_uuid: "spAvb2wnQe-xVghYxleJ5A",
version: {
number: "6.2.4",
build_hash: "ccec39f",
build_date: "2018-04-12T20:37:28.497551Z",
build_snapshot: false,
lucene_version: "7.2.1",
minimum_wire_compatibility_version: "5.6.0",
minimum_index_compatibility_version: "5.0.0"
},
tagline: "You Know, for Search"
}
Index:索引,包含一堆相似的结构的文档数据。一个index包含多个document,一个index就代表一类类似的或者相同的document,
-
Type: 类型,每个索引里面都有一个或者多个type,type是index的一个逻辑数据分类,一个type 下的document,都有相同的field,比如博客系统,有一个用户数据type,博客数据type,评论数据type.
商品index,里面存放了所有商品,商品document,但是商品分类有很多种,每个种类的document的field可能不太一样,比如电器商品,可能还包含一些售后时间的field,等等
type,日化商品type,电器商品type
Pid,name,desc,category,
Pid,name,desc,category, serivice_time
Pid,name,desc,category, eat_time
每个type里面都包含一堆document
-
shard: index会被拆分多个shard,每个shard就会存放这个index的一部分数据,这些shard会分散在多台服务器上
优点:
横向扩展,比如说数据增加,可以重新建立多shard的索引
数据分布在多个shard上,多台服务器上,所有的操作,就会在多台服务器上并行分布式执行,提升吞吐量和性能。
-
repi: 如果某个节点宕机,一部分数据彻底丢失。 sahrd其实叫primary shard,一般简称shard,replica其实叫replica shard,简称:replicate
高可用,一个shard宕机,数据不丢失,服务继续提供
提升了搜索这类请求的吞吐量和性能
-
ES核心概念 VS 数据库概念
ES 关系数据库 Document row Type table index 库
ES的安装和使用
ES特点之一就是开箱即用
http://127.0.0.1:9200?pretty
{
name: "JmyvpeE",
cluster_name: "elasticsearch_youdi",
cluster_uuid: "spAvb2wnQe-xVghYxleJ5A",
version: {
number: "6.2.4",
build_hash: "ccec39f",
build_date: "2018-04-12T20:37:28.497551Z",
build_snapshot: false,
lucene_version: "7.2.1",
minimum_wire_compatibility_version: "5.6.0",
minimum_index_compatibility_version: "5.0.0"
},
tagline: "You Know, for Search"
}
name: node名称 cluster_name 集群名称
ES的配置文件
修改集群名称:elastic search.yml