Elasticsearch入门总结

ELK技术栈

  • 概述
    • elk是一套通用的日志收集处理展现的一套技术解决方案。包括3个部分:日志采集系统,日志存储系统,可视化展现系统。

Lucene搜索技术

  • 概述

    • 全文检索引擎工具包
  • 检索方式

    • 顺序扫描
      • 按照顺序逐个扫描,没有索引情况的数据库记录
    • 倒排索引扫描(全文检索) – Lucene
      • 先创建索引的结构,通过索引结构定位位置,再提取数据
  • 传统查找

    • 先找到文档,然后看是否匹配
  • 倒排索引

    • 先找到词条,然后看看哪些文档包含这些词条
  • Field域(字段)类型

    • DoubleField、FloatField、IntField、LongField、StringField、TextField(需要分词)

    • 属性:Store.YES/NO代表存储/不存储,在搜索结果中也会展示/不展示出来

分词器

  • 分类

    • 标准分词器 StandardAnalyzer 中文支持不好
    • SmartChineseAnalyzer 英文支持不好
    • KAnalyzer 第三方中文分词器 2006年推出四个版本后,2012年12月稳定后没有更新
      支持中英文分词、支持扩展词、支持停用词
  • 引入

    1.引入坐标

        <dependency>
            <groupId>com.janeluo</groupId>
            <artifactId>ikanalyzer</artifactId>
            <version>2012_u6</version>
        </dependency>
    

    2.将ext.dic扩展词典、IKAnalyzer.cfg.xml配置文件、stopword.dic停用词典拷贝到resources

    3.将分词器StandardAnalyzer替换成IKAnalyzer即可

    4.重新运行createIndex方法生成索引库

ElasticSearch

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

  • ElasticSearch对比solr

    • Solr 利用 Zookeeper 进行分布式管理(zookeeper比较稳定),而 Elasticsearch 自身带有分布式协调管理功能(zen);
    • Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式
    • Solr 官方提供的功能更多(only one),而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
    • Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch
      • 传统搜索:数据量可控,搜的内容在一段时间内是静态的
      • 实时搜索:例如日志信息,实时会增加新的内容,日志信息量大
启动
  • elasticsearch集群
    • 当ElasticSearch的节点启动后,它会利用多播(multicast,一种网络广播方式)寻找集群中的其它节点,并与之建立连接。
  • 发现机制
    • Zen 发现机制是ElasticSearch中默认的用来发现新节点的功能模块,而且集群启动后默认生效。
    • Zen发现机制引入了第二种发现节点的方法:单播模式。
      • 多播发现机制可能会产生太多不必要的流量开销,这是不使用多播的一个充分理由
  • 集群配置
    • name: 主机名
    • cluster_name: 集群名
      • 该节点就会自动添加到与节点中集群名字(cluster.name)一样的集群
    • cluster_uuid: 集群UUID
核心概念
  • 概述
    • ElasticSearch是面向文档(document)的,意味着他可以存储整个对象或者文档,还会对文档的内容进行索引的创建,使文档可以被搜索到。
  • 核心概念
    • 接近实时的NRT
      • ES是一个近实时的搜索平台,也就是索引一个文档到这个文档能被搜索到会有轻微延迟(通常为1秒)。
        索引会先写入内存,然后在写入磁盘。
    • 集群 cluster
      • 一个集群就是由一个或多个节点组织在一起,他们共同持有整个数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”。集群的名字很重要,集群内的节点只能通过制定集群的名字来加入集群。
    • 节点 node(相当于数据库服务器)
      • 一个节点就是集群中的一个服务器,作为集群的一部分,节点存储数据,参与集群的索引和搜索功能。一个节点是由一个【节点名】来标识的,节点名一个随机字符串。默认情况下,节点名是由ElasticSearch服务在节点第一次启动的时候随机生成,之后这个节点就会一直使用这个节点名。
      • 节点通过配置集群名字来加入集群,默认情况下,节点会寻找集群名为“elasticSearch”的集群中。意味着:如果同一网络中启动了若干个节点,并且没有修改默认配置,那么这些节点可以互相发现彼此,并形成一个叫做“elasticSearch”的集群
    • 索引 index (相当于库) 名词
      • 一个索引实际上是一个“逻辑命名空间”,是文档的集合。一个索引由索引名字来标识,名字必须【小写字母】。我们在进行文档的索引(动词)、搜索、更新、删除的时候,都要用索引名。在一个集群中,可以定义多个索引
      • 索引存储在多个分片中,其中每一个分片都是一个独立的 Lucene Index。这就应该能提醒你,添加新 index 应该有个限度:每个 Lucene Index 都需要消耗一些磁盘,内存和文件描述符。因此,一个大的 index 比多个小 index 效率更高:Lucene Index 的固定开销被摊分到更多文档上了
      • 在搜索时,每个分片都需要搜索一次, 然后 ES 会合并来自所有分片的结果。例如,你要搜索 10 个 index,每个 index 有 5 个分片,那么协调这次搜索的节点就需要合并 5x10=50 个分片的结果。这也是一个你需要注意的地方:如果有太多分片的结果需要合并,或者你发起了一个结果巨大的搜索请求,合并任务会需要大量 CPU 和内存资源。
    • 类型 type (相当于表)
      • 在一个索引中,可以定义多个类型。类型是对文档的【逻辑】分类
        在ElasticSearch5.X的版本中支持一个索引下有多个type
    • 文档 document (相当于一条数据)
      • 文档是ElasticSearch的基本单位。在Es中文档以JSON格式来表示
    • 属性 field (相当于字段)
      • 属性是文档中的各个内容,需要对每一个属性定义索引和被搜索的方式
    • 数据类型
      • 字符串类型:string、text
      • 数值类型:字节(byte)、2字节(short)、4字节(integer)、8字节(long)、float、double;
      • 布尔类型:boolean,值是true或false;
      • 时间/日期类型:date,用于存储日期和时间;
      • 二进制类型:binary;
      • IP地址类型:ip,以字符串形式存储IPv4地址;
      • 特殊数据类型:token_count,用于存储索引的字数信息
    • 公共属性
      • index:该属性控制字段是否编入索引被搜索,该属性共有三个有效值:analyzed、no和not_analyzed:
        • analyzed:表示该字段被分析,编入索引,产生的token能被搜索到;
        • not_analyzed:表示该字段不会被分析,使用原始值编入索引,在索引中作为单个词;
        • no:不编入索引,无法搜索该字段;
      • 其中analyzed是分析,分解的意思,默认值是analyzed,表示将该字段编入索引,以供搜索。
      • store:指定是否将字段的原始值写入索引,默认值是no,字段值被分析,能够被搜索,但是,字段值不会存储,这意味着,该字段能够被查询,但是不会存储字段的原始值。
分片 和 复制
  • 分片:就是把索引数据切分成多个小的索引块,这些小的索引块能够分发到同一个集群中的不同节点。
    • lasticSearch集群通过把数据分发到多个存储Lucene索引的物理机上,达到能够存储超出单机容量的信息这一目的。这个分发的过程称为索引分片(Sharding)。
    • 在ElasticSearch集群中,索引分片(Sharding)是自动完成的,而且所有分片索引(Shard)是作为一个整体呈现给用户的。
    • 当你查询的索引分布在多个分片上时, Elasticsearch会把查询发送给每个相关的分片,并将结果【合并】在一起,而应用程序并不知道分片的存在。
    • 索引数据的操作只会发生在主分片上(primary shard)上,不会发生在分片的副本上。
  • 复制
    • Elasticsearch索引是由一个或多个分片组成的,每个分片包含了文档集的一部分。
    • 采用Elasticsearch默认设置时,索引结束后将得到5个分片及对应的副本。
    • “副本”(replica)意味着每一个分片都有自己的分片副本(copy),所以实际上有5个分片和5个相应分片副本。
mapping映射
  • apping定义了文档中的每一个field如何被索引和被查询到
IK分词器和ElasticSearch集成
  • 集成

    • 把IK分词器压缩包放在plugins中,解压缩并改名为ik
  • 分词方式

    • “ik_smart” 最小分词

    • “ik_max_word” 最大分词

    • POST _analyze
      {
        "analyzer": "ik_max_word", 	//“ik_smart”
        "text":     "我是中国人"
      }
      

Kibana 客户端

  • 概述(相当于SQLyog)

    • Kibana是一个基于Node.js的Elasticsearch索引库数据统计工具,可以利用Elasticsearch的聚合功能,生成各种图表,如柱形图,线状图,饼图等。
    • 而且还提供了操作Elasticsearch索引数据的控制台,并且提供了一定的API提示,非常有利于我们学习Elasticsearch的语法
  • 运行配置

    • 修改elasticsearch服务器的地址:

      elasticsearch.url: "http://127.0.0.1:9200"
      
    • 双击运行 kibana.bat

    • 监听端口是5601

    • DevTools菜单,即可进入控制台页面

聚合aggregations

  • **桶(bucket)**对比分组
    • Date Histogram Aggregation:根据日期阶梯分组,例如给定阶梯为周,会自动每周分为一组
    • Histogram Aggregation:根据数值阶梯分组,与日期类似,需要知道分组的间隔(interval)
    • Terms Aggregation:根据词条内容分组,词条内容完全匹配的为一组
    • Range Aggregation:数值和日期的范围分组,指定开始和结束,然后按段分组
  • **度量(metrics)**对比聚合函数
    • Avg Aggregation:求平均值
    • Max Aggregation:求最大值
    • Min Aggregation:求最小值
    • Percentiles Aggregation:求百分比
    • Stats Aggregation:同时返回avg、max、min、sum、count等
    • Sum Aggregation:求和
    • Top hits Aggregation:求前几
    • Value Count Aggregation:求总数

Logstash

  • 概念

    • 是elastic旗下的一款轻量级日志搜索处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置
  • 将MySQL数据导入Elasticsearch中

    • 在logstash-5.6.8目录下建立文件夹 mysqletc (文件夹名随意)

    • 在 mysqletc文件下创建 mysql.conf 文件 (名称随意)内容模板如下:

      input {
        jdbc {
      	  # mysql jdbc connection string to our backup databse
      	  jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/crawler?characterEncoding=UTF8"
      	  # the user we wish to excute our statement as
      	  jdbc_user => "root"
      	  jdbc_password => "admin"
      	  # the path to our downloaded jdbc driver  
      	  jdbc_driver_library => "F:\logstash\logstash-5.6.8\mysqletc\mysql-connector-java-5.1.46.jar"
      	  # the name of the driver class for mysql
      	  jdbc_driver_class => "com.mysql.jdbc.Driver"
      	  jdbc_paging_enabled => "true"
      	  jdbc_page_size => "2000"
      	  #以下对应着要执行的sql的绝对路径。
      	  #statement_filepath => ""
      	  statement => "select * from job_info"
      	  #定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新(测试结果,不同的话请留言指出)
            schedule => "* * * * *"
        }
      }
      
      output {
        elasticsearch {
      	  #ESIP地址与端口
      	  hosts => "127.0.0.1:9200" 
      	  #ES索引名称(自己定义的)
      	  index => "job"
      	  #自增ID编号,指定表ID列
      	  document_id => "%{id}"
      	  document_type => "jobInfo"
        }
        stdout {
            #以JSON格式输出
            codec => json_lines
        }
      }
      
    • 将模板中的 内容 指定完之后,就可以在 logstash-5.6.8 的bin目录下打开cmd窗口来运行 mysql.conf 文件了

      执行 logstash -f …/mysqletc/mysql.conf 命令! 等待执行结果…

    • 数据可以根据设置的更新corn表达式更新,所有新增修改可以更新,删除无法更新,但是删除可以改为逻辑删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值