【Elasticsearch】2. Elasticsearch介绍

286 阅读8分钟

全文检索

全文检索(Full-Text Retrieval)以文本作为检索对象,找出含有指定词汇的文本。全面、准确和快速是衡量全文检索系统的关键指标。

全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程。

检索的过程:先定位索引,再根据索引的指向查找到数据。

全文检索的特点:

  • 只处理文本,不处理语义。

    例如在百度中搜索"你今年多大了?",搜索处理的结果是一些包含了"你今年多大了?"的文章,而不是"我今年10岁"。

  • 搜索时英文不区分大小写。

    例如在百度中搜索"Spring"和"spring",两次搜索的结果应该一致。

  • 结果列表有相关度排序。

    例如在百度中搜索"Spring",那么排在第一位的一定是Spring的官网,下面的才是一些Spring的博客和广告。

我们目前使用全文检索功能都是站内检索,搜索不到站外的内容。

为什么要使用全文检索?因为全文检索的效率远远高于数据库检索,而且全文检索的结果有相关度排序,单靠这一点,数据库就望尘莫及。

全文检索目前在Java中的技术实现就是著名的Elasticsearch。

Elasticsearch介绍

ElasticSearch简称ES,是基于Apache Lucene构建的开源搜索引擎,是当前流行的分布式企业级搜索引擎服务。Lucene本身就可以被认为迄今为止性能最好的一款开源搜索引擎工具包,但是Lucene的API相对复杂,需要深厚的搜索理论,很难集成到实际的应用中去。但是ES是采用java语言编写,提供了简单易用的RESTFul API,开发者可以使用其简单的RESTFul API,开发相关的搜索功能,从而避免Lucene的复杂性。

Elasticsearch应用场景

ES主要以轻量级JSON作为数据存储格式,这点与MongoDB有点类似,但它在读写性能上优于MongoDB。同时也支持地理位置查询,还方便地理位置和文本混合查询。以及在统计、日志类数据存储和分析、可视化这方面是引领者。

  • 国外

    Wikipedia使用ES提供全文搜索并高亮关键字、StackOverflow结合全文搜索与地理位置查询、Github使用Elasticsearch检索1300亿行的代码。

  • 国内

    百度(在云分析、网盟、预测、文库、钱包、风控等业务上都应用了ES,单集群每天导入30TB+数据,总共每天60TB+)、新浪、阿里巴巴、腾讯等公司均有对ES的使用。

Elasticsearch安装(Windows版本)

  1. 环境:JDK1.8 +

  2. 进入官网:www.elastic.co/cn/download…

    20210810174629.png

    20210810174835.png

  3. 解压zip包

  4. 启动Elasticsearch:进入bin目录

    elasticsearch
    
  5. 浏览器访问,如果接收到JSON数据,说明启动成功。

    http://localhost:9200
    

    20210810103701.png

    Elasticsearch提供了两个端口,Web端口为9200,TCP端口为9300。两个端口在ES启动时同时启动监听。浏览器对ES进行访问使用的是9200端口,Java中对ES进行数据通信使用的是9300端口。

    ES和Redis一样,在初始启动成功后,只允许在本机访问,不允许有任何其他客户端进行远程连接,之后需要开启远程连接权限,其他客户端才能远程连接ES。

    ES没有单节点启动模式,只有集群启动模式。即使单机启动,默认也是在集群的模式下运行,只是目前集群中只有一个节点。

Elasticsearch目录结构

  • bin:启动和关闭ES的相关脚本。
    • elasticsearch:启动脚本文件
  • config:存放es配置文件。
    • elasticsearch.yml:ES主要配置文件。
    • jvm.options:ES在运行时和jvm的一些参数配置。
  • lib:ES运行时需要的第三方jar包。
  • logs:ES启动和运行时的日志。
  • modules:ES运行时的依赖模块。
  • plugins:ES官方和第三方扩展插件。

Elasticsearch核心概念

1. 接近实时(NRT)

NRT英文全称:Near Real Time。

Elasticsearch是一个接近实时的搜索平台。这意味着,从ES对一个文档进行索引到这个文档被搜索出的整个过程有一个轻微的延迟(通常是1秒内),体现了ES的效率之高。

2. 索引(Index)

一个索引就是一个拥有几分相似特征的文档的集合。

比如说,你可以有一个客户数据的索引,一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。

索引类似于关系型数据库中Database的概念。

在一个集群中,可以定义任意多的索引,ES也被称作索引库。

3. 类型(Type)

一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。

通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义一个类型,也可以为评论数据定义一个类型。

类型类似于关系型数据库中Table的概念。

在同一个索引中,可以定义任意多的类型。

5.x版本以前可以在一个索引中定义多个类型,6.x之后版本也可以使用,但不推荐。在7~8.x版本中彻底移除一个索引中创建多个类型的设定。

4. 映射(Mapping)

Mapping用于定义一个索引中的类型的数据的结构,主要包括字段名、字段数据类型和字段索引类型。

在ES中,我们可以手动创建类型(相当于table)和映射(相当与schema),也可以采用默认创建方式。在默认配置下,ES可以根据插入的数据自动地创建类型及其映射。

映射类似于关系型数据中table的schema的概念。

5. 文档(Document)

一个文档是一个可被索引的基础信息单元

比如,你可以拥有某一个员工的文档,也可以拥有某个商品的一个文档。文档以采用了轻量级的数据交换格式JSON来表示。

文档类似于关系型数据中表的一条记录。

6. 5.x版本架构图

20210810172148.png

7. 6.x版本架构图

5.x版本以前支持在一个索引中定义多个类型,6.x之后版本也可以继续运行5.x版本中创建的具有多类型的索引,但是不推荐。在7.x版本中创建多类型的API被弃用。在8.x版本中彻底移除一个索引中创建多个类型的设定。

6.x之后,官方推荐并逐步规定了一个索引中只能有一个类型。因为一个Database中可以有多个table,所以官方后来说明了使用Database来类比索引,table类比类型,是不恰当的。

**为什么要设置成一个index中只能放一个type呢?**官方是这么说的:

最初,我们谈到“索引”类似于SQL数据库中的“数据库”,而“类型”相当于“表”。这是一个糟糕的类比,导致了错误的假设。在SQL数据库中,表是彼此独立的。一个表中的字段与另一个表中的同名字段没有关系。映射类型中的字段则不是这样。

在Elasticsearch索引中,不同映射类型中具有相同名称的字段在内部由相同的Lucene字段支持。换句话说,使用上面的示例,用户类型中的user_name字段与管理员类型中的user_name字段存储在完全相同的字段中,并且两个user_name字段在两种类型中必须具有相同的映射。

例如,当您希望在同一索引中删除一种类型的日期字段和另一种类型的布尔字段时,这可能会导致失败。最重要的是,在同一个索引中存储很少或没有共同字段的不同实体会导致数据稀疏,并干扰Lucene有效压缩文档的能力。由于这些原因,我们决定将types的概念从Elasticsearch中移除,推行type的概念。

20210810172205.png