ElasticSearch学习笔记总结

ElasticSearch简介

什么是ElasticSearch

ElaticSearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单 .

ElasticSearch对比Solr

  • Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
  • Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
  • Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
  • Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch.

什么是全文检索

全文检索:将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。

比如:计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

ElasticSearch应用场景

  1. 维基百科,类似百度百科,牙膏,牙膏的维基百科,全文检索,高亮,搜索推荐。
  2. The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+ 社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)。
  3. Stack Overflow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案。
  4. GitHub(开源代码管理),搜索上千亿行代码。
  5. 国内:站内搜索(电商,招聘,门户,等等),IT系统搜索(OA,CRM,ERP,等等),数据分析(ES热门的一个使用场景)。

ElasticSearch的安装与启动

安装ES

ElasticSearch的官方地址: https://www.elastic.co/products/elasticsearch

  1. 从官网下载压缩包

  2. 解压缩,进入bin目录,点击elasticsearch.bat启动,控制台显示的日志信息如下:

    image-20200324204405635
    注意:9300是tcp通讯端口,集群间和TCPClient都执行该端口,9200是http协议的RESTful接口 。

  3. 通过浏览器输入localhost:9200访问ElasticSearch服务器,看到如下返回的json信息,代表服务启动成功:

在这里插入图片描述

注意:ElasticSearch是使用java开发的,且本版本的es需要的jdk版本要是1.8以上,所以安装ElasticSearch之前保 证JDK1.8+安装完毕,并正确的配置好JDK环境变量,否则启动ElasticSearch失败。

安装ES的图形化界面插件

ElasticSearch不同于Solr自带图形化界面,我们可以通过安装ElasticSearch的head插件,完成图形化界面的效 果,完成索引数据的查看。安装插件的方式有两种,在线安装和本地安装。本文档采用本地安装方式进行head插 件的安装。elasticsearch-5-*以上版本安装head需要安装node和grunt.

插件官网地址:https://github.com/mobz/elasticsearch-head

建议使用docker安装,更方便,运行命令:

docker run -p 9100:9100 --name es-head mobz/elasticsearch-head:5

启动后,浏览器输入:localhost:9100,即可查看到可视化界面.

注意:

必须在elasticsearch中启用CORS,否则浏览器将因违反同源策略而拒绝elasticsearch-head的请求

如果不能成功连接到es服务,需要修改ElasticSearch的config目录下的配置文件:config/elasticsearch.yml,增加以下两句命令:

Enable CORS in elasticsearch

http.cors.enabled: true 
http.cors.allow‐origin: "*"

然后重新启动ElasticSearch服务,就可以正常连接了.

ElasticSearch相关概念(术语)

概述

Elasticsearch是面向文档(document)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档进行索引、搜索、排序、过滤。

Elasticsearch比传统关系型数据库如下:

Relational DB ‐> Databases ‐> Tables  ‐>  Rows      ‐> Columns
Elasticsearch ‐> Indices   ‐> Types   ‐>  Documents ‐> Fields

Elasticsearch核心概念

索引 index

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

比如说:你可以有一个客户数据的索引,有一个产品目录的索引,还有一个订单数据的索引。

一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字

在一个集群中,可以定义任意多的索引。 可以把索引理解为数据库.

类型 type

在一个索引中,你可以定义一种或多种类型

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

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

通常,会为具有一组共同字段的文档定义一个类型,可以把type理解为表.

文档 document

一个文档是一个可被索引的基础信息单元,是ES中的最小数据单元。文档以JSON格式来表示.

比如,你可以拥有某一个客户的文档,某一个产品的一个文档,

在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type 。

可以理解为数据中的一行数据.

字段Field

相当于是数据表的字段,对文档数据根据不同属性进行的分类标识 .

可以理解为数据库中的列.

映射 mapping

mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面可以设置的,其它就是处理es里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。

接近实时 NRT

Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒以内)

集群 cluster

一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。一个集群由 一个唯一的名字标识,这个名字默认就是“elasticsearch”。

这个名字是重要的,因为一个节点只能通过指定某个集 群的名字,来加入这个集群.

节点 node

一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。和集群类似,一 个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的 时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对 应于Elasticsearch集群中的哪些节点.

一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫 做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此, 它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中.

在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何Elasticsearch节点, 这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群.

分片和复制 shards&replicas

一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。

分片很重要,主要有两方面的原因:

1)允许你水平分割/扩展你的内容容量。

2)允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量。

至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户的你来说,这些都是透明的。

在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制 .

复制之所以重要,有两个主要原因: 在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行。总之,每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。

默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。

ElasticSearch与数据库的类比

关系型数据库(比如Mysql) 非关系型数据库(Elasticsearch)
数据库Database 索引Index
表Table 类型Type(6.0版本之后在一个索引下面只能有一个,7.0版本之后取消了Type)
数据行Row 文档Document(JSON格式)
数据列Column 字段Field
约束 Schema 映射Mapping

IK 分词器和ElasticSearch集成使用

安装IK分词器

下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

  1. 去官网下载压缩包
  2. 解压,将解压后的elasticsearch文件夹拷贝到elasticsearch-5.6.8\plugins下,并重命名文件夹为analysis-ik
  3. 重新启动ElasticSearch,即可加载IK分词器

IK分词器测试

IK提供了两个分词算法ik_smart 和 ik_max_word

  • ik_smart 为最小切分,

  • ik_max_word为最细粒度划分

测试最小切分:

浏览器输入地址:

http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JWE3bTYp-1596695634328)(https://tva1.sinaimg.cn/large/00831rSTly1gd5d9l4gstj31400swgpt.jpg)]

测试最细切分:在浏览器地址栏输入地址:

http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员

image-20200324220451130

ElasticSearch集群的相关概念

ES集群是一个 P2P类型(使用 gossip 协议)的分布式系统,除了集群状态管理以外,其他所有的请求都可以发送到 集群内任意一台节点上,这个节点可以自己找到需要转发给哪些节点,并且直接跟这些节点通信。所以,从网络架 构及服务配置上来说,构建集群所需要的配置极其简单。在 Elasticsearch 2.0 之前,无阻碍的网络下,所有配置了 相同 cluster.name 的节点都自动归属到一个集群中。2.0 版本之后,基于安全的考虑避免开发环境过于随便造成的 麻烦,从 2.0 版本开始,默认的自动发现方式改为了单播(unicast)方式。配置里提供几台节点的地址,ES 将其视作 gossip router 角色,借以完成集群的发现。由于这只是 ES 内一个很小的功能,所以 gossip router 角色并不需要 单独配置,每个 ES 节点都可以担任。所以,采用单播方式的集群,各节点都配置相同的几个节点列表作为 router 即可。

集群中节点数量没有限制,一般大于等于2个节点就可以看做是集群了。一般处于高性能及高可用方面来考虑一般 集群中的节点数量都是3个及3个以上。

集群搭建

  1. 准备三台elasticsearch服务器

创建elasticsearch-cluster文件夹,在内部复制三个elasticsearch服务

  1. 修改每台服务器配置

修改elasticsearch-cluster\node*\config\elasticsearch.yml配置文件

node1节点:

 #节点1的配置信息:
#集群名称,保证唯一
cluster.name: my‐elasticsearch
#节点名称,必须不一样
node.name: node‐1
#必须为本机的ip地址
network.host: 127.0.0.1
#服务端口号,在同一机器下必须不一样
http.port: 9200
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9300
#设置集群自动发现机器ip集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]

node2节点:

#节点2的配置信息:
#集群名称,保证唯一
cluster.name: my‐elasticsearch
#节点名称,必须不一样
node.name: node‐2
#必须为本机的ip地址
network.host: 127.0.0.1
#服务端口号,在同一机器下必须不一样
http.port: 9201
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9301
#设置集群自动发现机器ip集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]

node3节点:

#节点3的配置信息:
#集群名称,保证唯一
cluster.name: my‐elasticsearch
#节点名称,必须不一样
node.name: node‐3
#必须为本机的ip地址
network.host: 127.0.0.1
#服务端口号,在同一机器下必须不一样
http.port: 9202
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9302
#设置集群自动发现机器ip集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
  1. 启动三个节点即可.
  2. 使用elasticsearch-header查看集群情况

image-20200806143316239

ElasticSearch编程操作

Spring Data ElasticSearch 使用

Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。

如何使用

  1. 引入Maven
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
  1. 配置application.yml

    server:
      port: 8080
    spring:
      application:
        name: elastic-search-service
      # 配置es
      data:
        elasticsearch:
          cluster-name: elasticsearch
          cluster-nodes: localhost:9300
    
    
  2. 编写Pojo

    package com.hg.model;
    
    import lombok.Data;
    import org.springframework.data.annotation.Id;
    import org.springframework.data.elasticsearch.annotations.Document;
    import org.springframework.data.elasticsearch.annotations.Field;
    import org.springframework.data.elasticsearch.annotations.FieldType;
    
    /**
     * @Author skh
     * @Date 2020/3/25 19:40
     * @Desc
     */
    @Data
    //指定索引名称和type名称
    @Document(indexName = "index_blog", type = "article")
    public class Article {
    
        @Id
        //定义字段类型,是否存储,是否分词
        @Field(type = FieldType.Long, store = true)
        private Long id;
    
        @Field(type = FieldType.Text, store = true, analyzer = "ik_smart")
        private String title;
    
        @Field(type = FieldType.Text, store = true, analyzer = "ik_smart")
        private String content;
    }
    
    
    1. 编写repository接口继承ElasticsearchRepository

      public interface ArticleRepository extends ElasticsearchRepository<Article,Long> {
      
          List<Article> findByTitle(String title);
      }
      
      
  3. 使用ArticleRepository就可以实现es的增删改查功能了.

  4. 也可以注入ElasticsearchTemplate实现增删改查功能.

猜你喜欢

转载自blog.csdn.net/kaihuishang666/article/details/107838836