1、什么是Elasticsearch
    基于Lucene构建的开源、分布式、RESTful接口全文搜索引擎。还是一个
    分布式文档数据库,其中每个字段均是被索引的数据且可被搜索,它能扩展
    至数以百计的服务器存储以及处理PB(1PB=1024TB)级的数据

    2、Elasticsearch存储结构
    Elasticsearch是文件存储,Elasticsearch是面向文档型数据库,一条
    数据在这里就是一个文档,用JSON作为文档序列化的格式。
    关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
    Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)

    3、Linux安装Elasticsearch
    (1)上传,解压
    (2)修改elasticsearch.yml
    network.host: 192.168.212.151
    http.port: 9200
    (3)启动Elasticsearc
    cd /usr/local/elasticsearch-6.4.3/bin
    ./elasticsearch
    报错内容:can not run elasticsearch as root
    (4)解决方案
    因为安全问题elasticsearch 不让用root用户直接运行,所以要创
    建新用户
    第一步:liunx创建新用户 adduser XXX 然后给创建的用户加
    密码 passwd XXX 输入两次密码。
    第二步:切换刚才创建的用户 su XXX 然后执行elasticsearch
    会显示Permission denied 权限不足。
    第三步:给新建的XXX赋权限,chmod 777 这个不行,因为这个
    用户本身就没有权限,肯定自己不能给自己付权限。所以要用root用户登录付权限。
    第四步:root给XXX赋权限,chown -R XXX /你的elasticsearch
    安装目录。
    (5)创建分组和用户
    groupadd espzm
    useradd pzmpzm -g espzm -p 123456
    chown -R pzmpzm:espzm elasticsearch-6.4.3
    su pzmpzm 切换用户
    (6)继续报错
    bootstrap checks failed max virtual memory areas
    vm.max_map_count [65530] is
    (7)解决方案(用root账户)
    vi /etc/sysctl.conf
    在最后一行添加:vm.max_map_count=655360
    进入/etc:sysctl -p
    (8)继续报错
    max file descriptors [4096] for elasticsearch process is too
    low, increase to at least [65536]
    (9)解决方案(用root账户)
    vi /etc/security/limits.conf
    soft nofile 65536
    hard nofile 131072
    soft nproc 2048
    hard nproc 4096
    (10)访问Elasticsearch
    关闭防火墙systemctl stop firewalld.service
    地址:htpp://192.168.5.3:9200

    4、端口区别
    9300端口: ES节点之间通讯使用
    9200端口: ES节点和外部通讯使用
    9300是TCP协议端口号,ES集群之间通讯端口号
    9200是暴露ES RESTful接口端口号

    5、Kibana可视化界面
    Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起
    工作。用Kibana来搜索,查看,并和存储在Elasticsearch索引中的数
    据进行交互。你可以轻松地执行高级数据分析,并且以各种图标、表格
    和地图的形式可视化数据。Kibana使得理解大量数据变得很容易。它简单
    的、基于浏览器的界面使你能够快速创建和共享动态仪表板,实时显示
    Elasticsearch查询的变化。

    6、Linux安装Kibana
    (1)上传解压包,解压
    (2)修改配置文件
    进入config目录,编辑kibana.yml文件,修改配置:
    server.port: 5601
    server.host: “192.168.5.3”
    elasticsearch.url: “http:// 192.168.5.3:9200”
    (3)启动Kibana
    ./bin/kibana
    (4)访问Kibana
    http://192.168.5.3:5601

    7、Kibana增删改查文档
    (1)创建索引(PUT)
    Elasticsearch - 图1
    (2)查询索引(GET)
    Elasticsearch - 图2
    (3)创建文档(PUT或POST)
    /索引/文档/id
    Elasticsearch - 图3
    (4)查询文档(GET)
    /索引/类型/id
    Elasticsearch - 图4
    (5)更新文档
    直接在原来文档基础上进行插入即可。
    Elasticsearch - 图5
    (6)删除索引(DELETE)
    DELETE /索引名
    (7)id描述
    id是唯一的,不可重复

    8、Elasticsearch版本控制(乐观锁机制)
    1.为什么要进行版本控制
    为了保证数据再多线程操作下的准确性
    2.悲观锁和乐观锁
    悲观锁:假设会发生并发冲突,屏蔽一切可能违反数据准确性的操作
    乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据
    完整性。
    3.内部版本控制和外部版本控制
    内部版本控制:_version自增长,修改数据后,_version会自动的
    加1
    外部版本控制:为了保持_version与外部版本控制的数值一致,使
    用version_type=external检查数据当前version
    值是否小于请求中的version值

    9、SpringBoot整合Elasticsearch
    (1)创建Maven工程,添加依赖

    org.springframework.boot

    spring-boot-starter-data-elasticsearch


    (2)创建JavaBean类
    注解:Document
    属性:indexName String类型 指定索引名称
    Type String类型 指定类型
    注解:id
    作用:用在属性上,指定id
    Elasticsearch - 图6
    (3)创建Dao层,继承CrudRepository
    T:指定javabean类
    ID:指定主键的数据类型
    Elasticsearch - 图7
    (4)编写Controller方法进行测试
    Elasticsearch - 图8
    (5)编写SpringBoot启动类
    注解:EnableElasticsearchRepositories 指定Dao层的包路径
    作用:扫描Dao层
    Elasticsearch - 图9

    10、倒排索引原理
    (1)正向索引
    正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档的信息直到找出所有包含查询关键字的文档。这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护;因为索引是基于文档建立的,若是有新的文档加入,直接为该文档建立一个新的索引块,挂接在原来索引文件的后面。若是有文档删除,则直接找到该文档号文档对应的索引信息,将其直接删除。但是在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大延长,检索效率低下。尽管正排表的工作原理非常的简单,但是由于其检索效率太低,除非在特定情况下,否则实用性价值不大。
    (2)倒排索引
    倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项
    记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记
    录该文档的ID和字符在该文档中出现的位置情况。由于每个字或词
    对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,
    但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,
    所以效率高于正排表。在全文检索中,检索的快速响应是一个最为关
    键的性能,而索引建立由于在后台进行,尽管效率相对低一些,但不
    会影响整个搜索引擎的效率。
    *文档内容:

    序号 文档内容
    1 小俊是一家科技公司创始人,开的汽车是奥迪a8l,加速爽。
    2 小薇是一家科技公司的前台,开的汽车是保时捷911
    3 小红买了小薇的保时捷911,加速爽。
    4 小明是一家科技公司开发主管,开的汽车是奥迪a6l,加速爽。
    5 小军是一家科技公司开发,开的汽车是比亚迪速锐,加速有点慢


    倒排索引会对以上文档内容进行关键词分词,可以使用关键词直接定位到文档内容。

    单词ID 单词 倒排列表docId
    1 1,2,3,4,5
    2 一家 1,2,4,5
    3 科技公司 1,2,4,5
    4 开发 4,5
    5 汽车 1,2,4,5
    6 奥迪 1,4
    7 加速爽 1,3,4
    8 保时捷 2,3
    9 保时捷911 2
    10 比亚迪 5


    (3)对比
    正排索引是从文档到关键字的映射(已知文档求关键字),倒排索引
    是从关键字到文档的映射(已知关键字求文档)。

    11、高级查询
    (1)查询当前索引下同个类型的所有数据
    GET /索引/类型/search
    (2)用POST插入数据
    POST /索引/类型/
    Id会自动生成
    (3)根据多个ID进行查询
    GET /索引/类型/_mget
    {
    “ids”:[id1,id2,…]
    }
    (4)根据某个字段的值来查询文档
    GET /索引/类型/_search?q=字段名:字段值
    (5)查询某个字段在某个区间的所有文档
    GET /索引/类型/_search?q=字段名[字段值 TO 字段值]
    注意:TO一定要大写
    (6)分页
    &from=X&size=X
    from:表示从第几条数据开始 从0开始
    size:表示每页的显示的个数
    (7)排序
    降序:desc
    &sort=字段名:desc

    12、DSL语言查询
    es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL)。
    由于DSL查询更为直观也更为简易,所以大都使用这种方式。
    DSL查询是POST过去一个json,由于post的请求是json格式的,所以存在很多灵活性,也有很多形式。
    (1)term查询(精确匹配)
    Elasticsearch - 图10
    (2)match查询(模糊查询,支持分词查询)
    Elasticsearch - 图11
    (3)term和match区别
    term查询不会对字段进行分词查询,会采用精确匹配。
    match会根据该字段的分词器,进行分词查询。

    13、分词器
    因为Elasticsearch中默认的标准分词器分词器对中文分词不是很友好,会将中文词语拆分成一个一个中文的汉子。因此引入中文分词器-es-ik插件。
    下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
    注意: es-ik分词插件版本一定要和es安装的版本对应
    第一步:下载es的IK插件(资料中有)命名改为ik.zip
    第二步: 上传到/usr/local/elasticsearch-6.4.3/plugins
    第三步: 重启elasticsearch即可

    14、自定义扩展分词器文件(本地分词文件)
    (1)在/usr/local/elasticsearch-6.4.3/plugins/ik/config目录下
    建立custom目录,并上传new_word.dic文件,文件内容如下:
    老铁
    王者荣耀
    洪荒之力
    共有产权房
    一带一路
    余胜军
    (2)config目录下进行配置,vi IKAnalyzer.cfg.xml
    初始配置文件的内容,如下:
    Elasticsearch - 图12
    配置如下:
    custom/new_word.dic
    (3)重启Elasticsearch
    (4)测试
    Elasticsearch - 图13

    15、文档映射
    在7.X版本以上,移除了类型type。
    (1)概述
    已经把ElasticSearch的核心概念和关系数据库做了一个对比,索引(index)相当于数据库,类型(type)相当于数据表,映射(Mapping)相当于数据表的表结构。ElasticSearch中的映射(Mapping)用来定义一个文档,可以定义所包含的字段以及字段的类型、分词器及属性等等。
    文档映射就是给文档中的字段指定字段类型、分词器。
    查询文档映射:使用GET /索引/类型/_mapping
    (2)分类
    A、动态映射
    我们知道,在关系数据库中,需要事先创建数据库,然后在该数
    据库实例下创建数据表,然后才能在该数据表中插入数据。而
    ElasticSearch中不需要事先定义映射(Mapping),文档写入
    ElasticSearch时,会根据文档字段自动识别类型,这种机制称
    之为动态映射。
    B、静态映射
    在ElasticSearch中也可以事先定义好映射,包含文档的各个
    字段及其类型等,这种方式称之为静态映射。
    (3)创建文档映射(POST)
    注意:
    1、不能修改已经存在的文档的字段类型
    2、必须先创建索引,才能创建文档映射
    3、一个索引下只能有一个类型
    POST /mymayikt/_mapping/user
    {
    “user”:{
    “properties”:{
    “age”:{
    “type”:”integer”
    },
    “sex”:{
    “type”:”integer”
    },
    “name”:{
    “type”:”text”,
    “analyzer”:”ik_smart”,

    },
    “car”:{
    “type”:”keyword”
    }
    }
    }
    }

    16、ES类型支持
    (1)基本类型
    字符串:string,string类型包含 text 和 keyword。

    text:该类型被用来索引长文本,在创建索引前会将这些文本进行分
    词,转化为词的组合,建立索引;允许es来检索这些词,text
    类型不能用来排序和聚合。
    keyword:该类型不需要进行分词,可以被用来检索过滤、排序和聚
    合,keyword类型自读那只能用本身来进行检索(不可用
    text分词后的模糊检索)。
    注意: keyword类型不能分词,Text类型可以分词查询
    数指型:long、integer、short、byte、double、float
    日期型:date
    布尔型:boolean
    二进制型:binary
    数组类型(Array datatype)
    (2)复杂类型
    A、地理位置类型
    地理坐标类型(Geo-point datatype):geo_point 用于经纬度
    坐标
    地理形状类型(Geo-Shape datatype):geo_shape 用于类似于
    多边形的复杂形状
    B、特定类型
    Pv4 类型(IPv4 datatype):ip 用于IPv4 地址
    Completion 类型(Completion datatype):completion 提供自
    动补全建议
    Token count 类型(Token count datatype):token_count 用
    于统计做子标记的字段的index数目,该值会一直增加,不会因为过滤条件而减少
    mapper-murmur3 类型:通过插件,可以通过_murmur3
    来计算
    index的哈希值
    附加类型(Attachment datatype):采用mapper-attachments
    插件,可支持attachments索引,例如
    Microsoft office 格式,Open Documnet 格式,
    ePub,HTML等
    Elasticsearch - 图14

    17、ES如何解决高并发
    ES是一个分布式全文检索框架,隐藏了复杂的处理机制,核心内容 分
    片机制、集群发现、分片负载均衡请求路由。

    18、基本概念名词
    (1)Cluster
    代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
    (2)Shards
    代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
    (3)Replicas
    代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
    (4)Recovery
    代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

    19、ES为什么要集群
    ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本。通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题。不能运行的原因可能是内存也可能是存储。由于每个分片可以有多个副本,通过将副本分配到多个服务器,可以提高查询的负载能力。

    20、集群原理分析
    数据存储。
    1、每个索引会被分成多个分片shards进行存储,默认创建索引是分配
    5个分片进行存储。每个分片都会分布式部署在多个不同的节点上,
    该分片成为primary shards。
    注意:索引的主分片定义好后,后面不能做修改。
    2、为了实现高可用数据的高可用,主分片可以有对应的备分片,副分片
    承载了系统容错、以及请求的负载均衡。
    注意: 每一个主分片为了实现高可用,都会有自己对应的备分片,
    主分片对应的备分片不能存放同一台服务器上。,主分片
    可以和其他副分片存放在同一个node节点上。
    3、插入文档时,会根据路由算法计算,插入到对应的主分片中。查询时,
    如果该机器没有此主分片,es会自动帮我们转发到相应的机器中进行
    查询。
    路由算法:shard(分片数量)=hash(routing)%主分片数量
    routing(文档id)

    21、搭建集群环境(此处的主节点是内部选举出来的)
    (1)准备3台服务器
    (2)编辑config目录下的elasticsearch.yml文件
    1、cluster.name: myes ###保证三台服务器节点集群名称相同
    2、node.name: node-1 #### 每个节点名称不一样
    3、network.host: 192.168.212.180 #### 实际服务器ip地址
    4、discovery.zen.ping.unicast.hosts:
    [“192.168.212.184”, “192.168.212.185”,”192.168.212.186”]
    ##多个服务集群ip
    5、主节点的数量 discovery.zen.minimum_master_nodes: 1
    (3)验证集群效果
    Elasticsearch - 图15
    访问地址:ip地址:端口号/_cat/nodes?pretty
    Elasticsearch - 图16
    (3)节点的知识点
    ElasticSearch默认每个节点都是这样的配置:
    node.master=true,node.data=true
    含义:表示这个节点即有成为主节点的资格,又存储数据
    在测试环境下这样做没问题。实际工作中建议不要这样设置,因为这
    样相当于主节点和数据节点的角色混合到一块了。




    Project1—-模拟网盘搜索引擎
    1、编写实体类
    使用@Document(index=””,type=””)
    index:指定索引名称
    type: 指定类型名称
    使用@Id来指定主键
    2、编写Dao接口,继承ElasticsearchRepository<实体类,主键的数据类型>
    使用的是spring-data-elasticserch模块的方法进行查询
    3、编写Controlller
    (1)查询所有数据
    A、创建查询
    BoolQueryBuilder boolQuery=QueryBuilders.boolQuery();
    B、使用search()查询所有
    Iterable iterable=cloudDiskDao.search(boolQuery);
    C、返回数据

    (2)条件模糊查询(不带分页)
    当有多个条件进行查询,默认是and关系。
    A、创建查询
    BoolQueryBuilder boolQuery=QueryBuilders.boolQuery();
    B、条件模糊查询
    MatchQueryBuilder matchQuery=QueryBuilders
    .matchQuery(“name”, keyWord);
    C、添加模糊查询
    boolQuery.must(matchQuery);
    D、执行模糊查询
    Iterable iterable=cloudDiskDao
    .search(boolQuery);
    E、返回数据

    (3)分页查询
    访问时分页的参数为:page和size(value无效)
    参数:Pageable
    包: org.springframework.data.domain.Pageable
    属性:
    pageSize:每页显示的个数

    注解:@PageableDefault
    属性:
    page:页码 从0开始为第一页
    size/value:每页显示的个数

    对象:Page
    属性:
    totalElemetns:总个数

    (4)对关键字进行高亮
    此处使用字符串替换的方法进行高亮,此方法对分词无效。
    ${p.name?replace(keyword, ‘
    ${keyword}
    ‘)}

    (5)Freemarker进行分页
    <#list 1..totalPage is i></#list>

    含义:从1开始,到totalPage结束,并赋值给i。此处可以将整数
    变量当作list变量来循环输出


    Project2—-分布式日志收集
    1、传统系统的日志收集问题
    传统项目当中日志文件分散在多个不同服务器上进行存储,在搜索日志的
    时候非常繁琐。

    2、日志存储的位置
    重要、核心日志(支付日志等):数据库
    其余日志:本地日志文件(硬盘)
    还有的可以存放在MongoDB,redis中

    3、分布式日志收集ELK原理
    Elasticsearch - 图17
    细节:在每一台服务器上安装Logstash插件,该插件会将服务器集群的每
    个节点的日志以当天为索引输入到ES集群中(JSON格式),然后在
    使用Kibana插件对ES集群进行图形化界面展示ES数据。

    4、Logstach介绍
    核心流程:Logstash事件处理有三个阶段:inputs → filters → outputs
    是一个接收,处理,转发日志的工具。支持系统日志,webserver
    日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。


    5、Logstatsh原理
    Elasticsearch - 图18

    6、使用Logstash收集日志(此处收集Elasticsearch的启动日志)
    (1) 步骤:
    1、安装es
    2、安装Logstash
    (1)上传解压包
    (2)解压
    (3)启动(添加配置文件来启动)
    ./logstash –f ../config/配置文件
    3、安装kibana
    (2)添加配置文件,决定logstash对哪个日志文件进行输入
    Elasticsearch - 图19

    7、Logstash将日志文件推送到ES
    (1)添加配置
    Elasticsearch - 图20
    (2)启动Logstash
    ./logstash –f ../config/mayikt02.conf
    启动时,要先启动推送目的地ES。