Spring Boot 教程 - Elasticsearch

1. Elasticsearch简介

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。以后再给大家详细介绍solr。

它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。”Elasticsearch是分布式的,这意味着索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。“相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。

Elasticsearch使用Lucene,并试图通过JSON和Java API提供其所有特性。它支持facetting和percolating,如果新文档与注册查询匹配,这对于通知非常有用。另一个特性称为“网关”,处理索引的长期持久性;例如,在服务器崩溃的情况下,可以从网关恢复索引。Elasticsearch支持实时GET请求,适合作为NoSQL数据存储,但缺少分布式事务。

2. Elasticsearch深入了解

2.1 Elasticsearch的底层实现

  • 2.1.1 lucene

    Es是一个比较复杂的搜索服务器,本身也是使用Java语言编写的,在上面的简介中,说明了ES是一个基于lucene的搜索服务器,lucene是什么呢?Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。lucene也是使用Java语言编写的,Java天下第一😁!

    Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。至于lucene到底是怎么实现的,牛牛们可能要自己去百度或者谷歌一下啦。

  • 2.1.2 Elasticsearch的基本概念

    1. 集群(Cluster):就是多台ES服务器在一起构成搜索服务器,现在很多应用基本上都有集群的概念,提高性能,让应用具有高可用性,一台服务器挂掉,可以很快有另一台ES服务器补上。

    2. 节点(Node):节点就是集群中的某一台ES服务器就称为一个节点。

    3. 索引库(Index Indices):就是ES服务器上的某一个索引,相当于Mysql数据库中的数据库的概念,一个节点可以有很多个索引库。

    4. 文档类型(Type):这个概念就相当于Mysql数据库中表的概念,一个索引库可以有很多个文档类型,但是这个概念现在慢慢淡化了,因为在ES中一个索引库直接存数据文档就挺好的,这个概念现在来说有点多余了,所以ES官方也在淡化这个概念,在ES8中,这个概念将会彻底的消失。

    5. 文档(Doc):文档就相当于Mysql是数据库中某个表的一条数据记录,现在ES已经到7.7版本了,我们也就忽略type这个概念,直接在索引库中存文档即可。另外需要说一下,我们一般把数据文档存到Es服务器的某个索引库的这个动作称之为索引

      最后还有两个比较重要的概念,但是可能不是那么直观的可以感受得到:

      分片(Shards)和副本(Replicas)

      索引可能会存储大量数据,这些数据可能超过单个节点的硬件限制。例如,十亿个文档的单个索引占用了1TB的磁盘空间,可能不适合单个节点的磁盘,或者可能太慢而无法单独满足来自单个节点的搜索请求。

      为了解决此问题,Elasticsearch提供了将索引细分为多个碎片的功能。创建索引时,只需定义所需的分片数量即可。每个分片本身就是一个功能齐全且独立的“索引”,可以托管在群集中的任何节点上。

      分片很重要,主要有两个原因:

      • 它允许您水平分割/缩放内容量
      • 它允许您跨碎片(可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量

      分片如何分布以及其文档如何聚合回到搜索请求中的机制由Elasticsearch完全管理,并且对您作为用户是透明的。

      在随时可能发生故障的网络/云环境中,非常有用,强烈建议您使用故障转移机制,以防碎片/节点因某种原因脱机或消失。为此,Elasticsearch允许您将索引分片的一个或多个副本制作为所谓的副本分片(简称副本)。

      复制很重要,主要有两个原因:

      • 如果分片/节点发生故障,它可提供高可用性。因此,重要的是要注意,副本碎片永远不会与从其复制原始/主要碎片的节点分配在同一节点上。
      • 由于可以在所有副本上并行执行搜索,因此它可以扩展搜索量/吞吐量。

      总而言之,每个索引可以分为多个碎片。索引也可以复制零(表示没有副本)或多次。复制后,每个索引将具有主碎片(从中进行复制的原始碎片)和副本碎片(主碎片的副本)。可以在创建索引时为每个索引定义分片和副本的数量。创建索引后,您可以随时动态更改副本数,但不能事后更改分片数。

      默认情况下,Elasticsearch中的每个索引分配有5个主碎片和1个副本,这意味着如果集群中至少有两个节点,则索引将具有5个主碎片和另外5个副本碎片(1个完整副本),总共每个索引10个碎片。

  • 2.1.3 Elasticsearch的索引原理

    Es作为一个全文检索服务器,那么它在搜索方面肯定很在行啦!那它是怎么做到的呢?

    Es官方有这么一句话:一切设计都是为了提高搜索的性能!

    Es能够快速的搜索出我们需要的内容,靠的就是倒排索引的思想,或者说是一种设计!

    在没有使用倒排索引的情况下,正常思路是根据搜索关键字去查找相应的内容,但是使用了倒排索引之后,ES会先将文档的所有内容拆分成多个词条,创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。

    例如,假设我们有两个文档,每个文档的 content 域包含如下内容:

    ​ Doc_1:The quick brown fox jumped over the lazy dog

    ​ Doc_2:Quick brown foxes leap over lazy dogs in summer

    ES首先会将这两个文档拆分成多个单独的词,或者叫做词条,然后为所有的词条创建一个排序列表,并记录每个词条出现的文档的信息。就像下面这样:

    Term      Doc_1  Doc_2
    -------------------------
    Quick   |       |  X                        /*
    The     |   X   |								Term就是词条,比如第一个Term就是Quick关键字,在Doc_1中不存
    brown   |   X   |  X							在,在Doc_2中存在,其他的以此类推。
    dog     |   X   |							*/
    dogs    |       |  X
    fox     |   X   |
    foxes   |       |  X
    in      |       |  X
    jumped  |   X   |
    lazy    |   X   |  X
    leap    |       |  X
    over    |   X   |  X
    quick   |   X   |
    summer  |       |  X
    the     |   X   |
    ------------------------
    

    现在,如果我们想搜索 quickbrown这两个关键字,我们只需要查找包含每个词条的文档,就相当于我们查询的时候,是通过这个索引表找到文档,在通过文档去找文档内容中的搜索关键字,与传统的通过关键字去找内容是不同的。

    倒排索引到底是个怎么实现的,怎么个思想,我在这里就不一一说明了,大家可以看下官方的详细介绍:倒排索引的原理

    还有es官方的一系列的说明也都可以了解一下:什么是Elasticsearch?

2.2 Elasticsearch的安装

本演示项目ES版本为7.0.0版本,其他版本的ES的maven依赖与其他的jar包关系请自行查阅官方文档,保证不冲突。

  • Windows

    Es服务器的安装很简单,Windows版本特别的简单,直接去官网下载,运行 bin/elasticsearch 或者bin\elasticsearch.bat

  • Linux(CentOS7)

    首先我们去官网下载ES的tar.gz包,然后自建一个文件夹放好,然后解压tar.zg压缩包:

    tar -xvf elasticsearch-7.0.0.tar.gz
    

    然后进入到bin目录下:

    cd elasticsearch-7.0.0/bin
    

    然后运行elasticsearch:

    ./elasticsearch
    

    这个时候肯定会报错的,因为没有进行配置,所以我们先对es进行一些简单的配置,保证能单机运行,进入elasticsearch-7.7.0/config目录,对es的核心配置文件进行编辑:

    vim elasticsearch.yml
    

    进入到了elasticsearch.yml文件的编辑页面:

    首先我们配置集群名称,集群名称自己取一个喜欢的名字就好:

在这里插入图片描述

接下来配置节点名称,就是在这个集群中,这个es服务器的名称:

在这里插入图片描述

接下来配置一些必要的参数:

在这里插入图片描述

bootstrap.memory_lock: 是否锁住内存,避免交换(swapped)带来的性能损失,默认值是: false。

bootstrap.system_call_filter: 是否支持过滤掉系统调用。elasticsearch 5.2以后引入的功能,在bootstrap的时候check是否支持seccomp。

配置network为所有人都可以访问,因为我们一般是使用ssh连接工具在其他的电脑上操作Linux系统,所以我们需要配置一下:

在这里插入图片描述

到这里就配置完成了,但是当你重新去运行.elasticsearch的可执行文件的时候,依然会报错。

报错信息中可能包含以下几个错误:

  • max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

    原因:无法创建本地文件问题,用户最大可创建文件数太小。

    解决方法:切换到root账户下,进入Linux系统文件夹,编辑limits.conf文件:

    vim /etc/security/limits.conf
    

    在文件的末尾加上:

    *                soft    nofile          65536
    *                hard    nofile          65536
    *                soft    nproc           4096
    *                hard    nproc           4096
    
  • max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

    原因:最大虚拟内存太小,需要修改系统变量的最大值。

    解决方法:切换到root账户下,进入Linux系统文件夹,编辑sysctl.conf文件:

    vim /etc/sysctl.conf
    

    在文件的末尾加上:

    vm.max_map_count=262144
    
  • max number of threads [1024] for user [es] likely too low, increase to at least [2048]

    原因:无法创建本地线程问题,用户最大可创建线程数太小。

    解决方法:如果你是CentOS6及以下系统,编辑的文件是90-nproc.conf这个文件,如果你和我一样使用的是CentOS7的话,编辑的文件是20-nproc.conf文件,其实这两个文件是一样的,只是在不同CentOS系统中名称不一样而已。

    CentOS7使用这个命令:

    vim /etc/security/limits.d/20-nproc.conf
    

    CentOS6使用这个命令:

    vim /etc/security/limits.d/90-nproc.conf
    

    只需要在文件中加上以下配置:

    *          soft    nproc     4096
    

    这个配置的意思是说赋予其他用户的可创建本地线程数为4096。在这个文件中本来就有一个配置,意思是说赋予root账户创建线程数不受限制。我们就把上面的配置加在本来存在的配置的下面一行就可以了。

    如果是CentOS7的使用者,还需要配置另一个文件,否则这个最大线程数是不会生效的。CentOS 7 使用systemd替换了SysV,Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,而且够在进程启动过程中更有效地引导加载服务。在/etc/systemd目录下有一个系统的默认管理配置,这里有登陆、日志、服务、系统等。所以CentOS7的使用者还需要配置下面这个文件:

    vim /etc/systemd/system.conf
    

    对其中的选项进行配置,在文件的末尾加上:

    DefaultLimitNOFILE=65536
    DefaultLimitNPROC=4096
    

上面的所以错误解决完毕之后,我们再运行.elasticsearch可执行文件,es才可以启动成功。

2.3 Elasticsearch的使用

首先给大家介绍一个谷歌浏览器插件,这个插件是用来可视化展示es的索引库数据的,这个插件叫做ElasticVue,个人感觉挺好用的,展示也比较方便,给大家截个图看看:

在这里插入图片描述

大家可以使用这个建立索引库,然后调用es官方的es专用的语法操作es服务器进行CRUD操作,但是此处我只介绍Java语言如何调用es服务器API,废话不多说,我们直接开始下一步。

  • 2.3.1 引入依赖

    搭建工程的过程我就不演示了,直接上pom.xml依赖文件。

    pom.xml

    <!--springboot父工程-->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.2.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <dependencies>
            <!--springboot-web组件-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.2.2.RELEASE</version>
            </dependency>
            <!--elasticsearch-rest-client组件-->
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>elasticsearch-rest-client</artifactId>
                <version>7.7.0</version>
            </dependency>
            <!--elasticsearch-rest-high-level-client组件-->
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>elasticsearch-rest-high-level-client</artifactId>
                <version>7.7.0</version>
            </dependency>
            <!--elasticsearch组件-->
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>7.7.0</version>
            </dependency>
            <!--mybatis整合springboot组件-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.0</version>
            </dependency>
            <!--mysql数据库连接驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.18</version>
            </dependency>
            <!--lombok组件-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.10</version>
            </dependency>
            <!--json组件gson-->
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.8.5</version>
            </dependency>
            <!--springboot-test组件-->
            <dependency>
                <<
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值