Elasticsearch介绍及核心概念

1.什么是全文搜索引擎?

1.1 数据的分类

结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等

  • 对于结构化的数据,我们一般可以通过关系型数据库(Mysql,Oracle等)的table的方式存储和搜索,也可以建立索引,通过b-tree等数据结构快速搜索数据。

非结构化的数据:全文数据,指不定长无格式的数据,如邮件,word文档等。

  • 对于非结构化的数据,也即对全文数据的搜索主要有两种方法:顺序扫描法,全文搜索法

 1.2 顺序扫描?

按字面意思,我们可以了解它的大概搜索方式,就是按照顺序扫描的方式查找特定的关键字,比如让你在一篇篮球新闻中,找出”科比”这个名字在哪些段落出现过,那你肯定需要从头到尾把文章阅读一遍,然后标记出关键字在哪些地方出现过。

这种方式毋庸置疑是最低效的,如果文章很长,有几万字,等你阅读完这篇新闻找到“科比”这个关键字,那的花多少时间。

1.3 全文搜索

对非结构化的数据进行顺序扫描很慢,我们是否可以进行优化?把我们的非结构化数据想办法弄的有一定结构不就行了么?将非结构化数据中的一部分信息提取出来,重新组织使其变得有一定结构,然后对这些有一定结构数据进行搜索,从而达到搜索相对较快的目的,这种方式就构成了全文搜索的基本思路。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。

我们以NBA中国网站为例,假设我们都是篮球爱好者,并且我们是科比,那如何快速找到有关科比的新闻呢?全文搜索的方式就是将所有的新闻中所有的关键字进行提取,比如“科比”,“詹姆斯”,“总冠军”,“mvp”等关键字,然后对这些关键字建立索引,通过索引我们就可以找到对应的该关键词出现的新闻了。

1.4 什么是全文搜索引擎?

全文搜索引擎是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的

1.5 几种常用的搜索引擎

Lucene

  • Lucene是⼀个Java全⽂搜索引擎,完全⽤Java编写。Lucene不是⼀个完整的应⽤程序,⽽是⼀个代码库和API,可以很容易地⽤于向应⽤程序添加搜索功能。
  • 通过简单的API提供强⼤的功能 可扩展的⾼性能索引 强⼤、准确、⾼效的搜索算法、跨平台解决⽅案
  • Apache 软件基⾦会
    Apache 软件基⾦会提供的开源软件项⽬的 Apache 社区的⽀持。
    但是 Lucene 只是⼀个框架,要充分利⽤它的功能,需要使⽤ java ,并且在程序中集成
    Lucene 。需要很多的学习了解,才能明⽩它是如何运⾏的,熟练运⽤ Lucene 确实⾮常
    复杂。

Sorl

  • Solr是⼀个基于LuceneJava库构建的开源搜索平台。它以⽤户友好的⽅式提供Apache,Lucene的搜索功能。它是⼀个成熟的产品,拥有强⼤⽽⼴泛的⽤户社区。它能提供分布式索引,复制,负载均衡查询以及⾃动故障转移和恢复。如果它被正确部署然后管理得好,它就能够成为⼀个⾼度可靠,可扩展且容错的搜索引擎。很多互联⽹巨头,如NetflflixeBayInstagram和亚⻢逊都使⽤Solr,因为它能够索引和搜索多个站点。
  • 强⼤的功能
    全⽂搜索
    突出
    分⾯搜索
    实时索引
    动态群集
    数据库集成
    NoSQL 功能和丰富的⽂档处理
     

Elasticsearch

  • Elasticsearch是⼀个开源,是⼀个基于Apache Lucene库构建的Restful搜索引擎.
  • 应⽤场景
    维基百科
    Stack Overflflow
    GitHub 电商⽹站
    ⽇志数据分析
    商品价格监控⽹站
    BI 系统
    站内搜索
    篮球论坛
  • Elasticsearch 是在 Solr 之后⼏年推出的。它提供了⼀个分布式,多租户能⼒的全⽂搜索引
    擎,具有 HTTP Web 界⾯( REST )和⽆架构 JSON ⽂档。 Elasticsearch 的官⽅客户端库提供
    Java Groovy PHP Ruby Perl Python .NET Javascript
  • 主要功能
    分布式搜索
    数据分析
    分组和聚合

2. 为什么不用MySQL做全文搜索?

有人可能会问,为什么一定要用搜索引擎呢?我们的所有的数据不是都可以放在数据库里吗?而且MySQL,Oracle,SQL Server等数据库里不是也能提供查询搜索功能,直接通过数据库查询不就可以了么?

确实,我们大部分的查询功能都是可以通过数据库查询获得,如果查询效率低下,还可以通过新建数据库索引,优化SQL等方式进行提升效率,甚至通过引入缓存比如Redis,memcache来加快数据的返回速度,如果数据量更大,还可以通过分库分表来分担查询压力,那为什么还要全文索引呢?我们从几个角度来说

  1. 数据类型

全文索引搜索很好支持非结构化数据的搜索,可以更好的快速搜索大量存在的任何单词非结构化的文本,例如,Google,百度等的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中的应用日志搜索等等,对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。

  1. 搜索性能

如果使用MySQL做搜索,比如有个player表,这个表有user_name这个字段,我们要找出user_name以james开头的球员,和含有james的球员,我们一般怎么做?数据量达到千万级别的时候怎么办?

select * from player where user_name like ‘james%’

select * from player where user_name like ‘%james%’

  1. 灵活的搜索

如果我们想要查出名字叫james的球员,但是用户输入了jame,我们想提示它一些关键字

如果我们想查出带有”冠军”关键字的文章,但是用户输入了”总冠军”,我们也希望能查出来。

  1. 索引的维护

一般传统数据库,全文搜索都实现的很鸡肋,因为一般也没人用数据库存长文本字段,因为进行全文搜索的时候需要扫描整个表,如果数据量大的话即使对SQL语法进行优化,也是效果甚微,即使建立了索引,但是维护起来也很麻烦,对于insert和update操作都会重新构建索引。

  1. 适合全文索引引擎的场景

搜索的数据对象是大量的非结构化的文本数据

文本数据量达到数十万或数百万级别,甚至更多

支持大量基于交互式文本的查询

需求非常灵活的全文搜索查询

对安全事务,非文本数据操作的需求相对较少的情况

3.ElaticSearch核心概念的介绍

我们在学习ElaticSearch的核心概念之前,回顾下我们使用传统数据库查询数据的时候应该怎么做的?假设我们用使用MySQL数据库存储一些数据,我们操作步骤是怎样的?

  1. 建立数据库—》建表—》插入数据—》查询

3.1 索引(index) 

一个索引可以理解成一个关系型数据库

3.2 类型(type)

一种type就像一类表,比如user表,order表。

注意:

  1. ES5.X中一个index可以有多种type
  2. ES6.X中一个index只能有一种type
  3. ES7.X以后已经移除type这个概念

 

3.3映射(mapping)

Mapping定义了每个字段的类型等信息,相当于关系数据库中的表结构

3.4 文档(document)

一个document相当于关系型数据库中的一行记录。

3. 5 字段

相当于关系型数据库表的字段

 3.6 集群

集群由一个或多个节点组成,一个集群有一个默认名称”elaticsearch”

3.7 节点

集群的节点,一台机器或者一个进程

3.8 分片和副本

分片:是ES中所有数据文件块,也就是数据的最小单元块,ES中所有数据均衡的存储在集群中各个节点的分片中,会影响ES的性能、安全和稳定性, 所以很有必要了解一下它。单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能

副本:一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。

  1. 副本是分片的副本,分片有主分片(primary Shard)和副分片(replica Shard)之分
  2. 一个index数据在物理上被分布在多个主分片中,每个主分片只存放部分数据。
  3. 每个主分片可以有多个副本,叫副本分片,是主分片的复制

下一版会出Elasticsearch索引创建,mapping映射,文档的增删改查等

 

 

猜你喜欢

转载自blog.csdn.net/dfBeautifulLive/article/details/106018276