C/C++教程

Elasticsearch

本文主要是介绍Elasticsearch,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

 

  • 1. ELK技术栈说明

Elastic有一条完整的产品线:Elasticsearch、Logstash、Kibana等,即ELK技术栈(开源实时日志分析平台)。

 

 

  • Logstash 的作用就是一个数据收集器,将各种格式各种渠道的数据通过它收集解析之后格式化输出到Elasticsearch ,最后再由Kibana 提供的比较友好的 Web 界面进行汇总、分析、搜索。
  • ELK 内部实际就是个管道结构,数据从 Logstash 到 Elasticsearch 再到 Kibana 做可视化展示。这三个组件各自也可以单独使用,比如 Logstash 不仅可以将数据输出到Elasticsearch ,也可以到数据库、缓存等
  • Elasticsearch的作用:展现高速、扩展性、最相关的搜索结果
    • 分布式的搜索引擎:百度、Google、站内搜索
    • 全文检索:提供模糊搜索等自动度很高的查询方式,并进行相关性排名,高亮等功能
    • 数据分析引擎(分组聚合):电商网站—一周内手机销量Top10
    • 对海量数据进行近乎实时处理:水平扩展,每秒钟可处理海量事件,同时能够自动管理索引和查询在集群中的分布方式,以实现极其流畅的操作
    • 分布式:节点对外表现对等,每个节点都可以作为入门,加入节点自动负载均衡
    • JSON:输入输出格式是JSON
    • Restful风格,一切API都遵循Rest原则,容易上手
    • 近实时搜索,数据更新在Elasticsearch中几乎是完全同步的,数据检索近乎实时
    • 安装方便:没有其它依赖,下载后安装很方便,简单修改几个参数就可以搭建集群
    • 支持超大数据:可以扩展到PB级别的结构化和非结构化数据

1.1 安装Elasticsearch

  • 解压文件并修改配置

 

 

 

path.data: d:\class\es\data
# #Path to log files:
# 
path.logs: d:\class\es\log
  • Elasticsearch如果启动失败,需要修改虚拟机内存的大小
    • 找到jvm.options文件
    • Xms 是指设定程序启动时占用内存大小。一般来讲,大点,程序会启动的快一点,但是也可能会导致机器暂时间变慢。
    • Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。
  • 绑定了两个端口:9300:集群节点间通讯接口,接收tcp协议;9200:客户端访问接口,接收Http协议,浏览器中访问:http://127.0.0.1:9200 有json数据表明启动成功

 

 

 1.2 安装kibana

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

  • Kibana依赖于node,需要在windows下先安装Node.js,双击运行课前资料提供的node.js的安装
  • 解压并修改配置文件

 

 

elasticsearch.url: "http://127.0.0.1:9200
  • kibana的监听端口是5601,双击bat文件运行访问端口
  • 选择左侧的DevTools菜单,即可进入控制台页面

 

 1.3 安装ik分词器

  Lucene的IK分词器早在2012年已经没有维护了,我们使用维护的升级版本Elasticsearch的集成插件了,与Elasticsearch一起维护升级,版本也保持一致

  • 解压elasticsearch-analysis-ik-6.2.4.zip后,将解压后的文件夹拷贝到elasticsearch-6.2.4\plugins下,并重命名文件夹为ik
  • 重新启动ElasticSearch,即可加载IK分词器

 

1.4安装Head插件

elasticsearch-head是一个界面化的集群操作和管理工具,可以对集群进行傻瓜式操作。你可以通过插件把它集成到es(首选方式),也可以安装成一个独立webapp。

es-head主要有三个方面的操作:

  • 显示集群的拓扑,并且能够执行索引和节点级别操作
  • 搜索接口能够查询集群中原始json或表格格式的检索数据
  • 能够快速访问并显示集群的状态

安装:直接下载压缩包,地址:https://files.cnblogs.com/files/sanduzxcvbnm/elasticsearch-head.7z并解压,在谷歌浏览器中点击“加载已解压的压缩程序”,找到elasticsearch-head文件夹,点击打开即可进行安装

2.kibana对索引库操作

2.1 基本概念

  • 节点 (node):一个节点是一个Elasticsearch的实例。在服务器上启动Elasticsearch之后,就拥有了一个节点。如果在另一台服务器上启动Elasticsearch,这就是另一个节点。甚至可以通过启动多个Elasticsearch进程,在同一台服务器上拥有多个节点
  • 集群(cluster):多个协同工作的Elasticsearch节点的集合被称为集群。在多节点的集群上,同样的数据可以在多台服务器上传播。这有助于性能的稳定性,每个分片至少有一个副本分片,在任何一个节点宕机后,Elasticsearch依然可以进行服务,返回所有数据。但必须确定节点之间能够足够快速地通信,并且不会产生脑裂效应(集群的2个部分不能彼此交流,都认为对方宕机了)。
  • 分片 (shard):索引可能会存储大量数据,这些数据可能超过单个节点的硬件限制,Elasticsearch提供了将索引细分为多个碎片的功能。创建索引时,只需定义所需的分片数量即可。每个分片本身就是一个功能齐全且独立的“索引”,可以托管在群集中的任何节点上。它允许您水平分割/缩放内容量,跨碎片(可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量
  • 分片如何分布以及其文档如何聚合回到搜索请求中的机制完全由Elasticsearch管理,并且对您作为用户是透明的。在随时可能发生故障的网络/云环境中,强烈建议使用故障转移机制,以防碎片/节点因某种原因脱机或消失。为此,Elasticsearch允许您将索引分片的一个或多个副本制作为所谓的副本分片(简称副本)。
  • 副本(replica):分片处理允许用户推送超过单机容量的数据至Elasticsearch集群。副本则解决了访问压力过大时单机无法处理所有请求的问题。
  • 分片可以是主分片,也可以是副本分片,其中副本分片是主分片的完整副本。副本分片用于搜索,或者是在原有的主分片丢失后成为新的主分片。
  • 可以在任何时候改变每个分片的副本分片的数量,因为副本分片总是可以被创建和移除的。
  • 在创建索引之前,必须决定主分片的数量。过少的分片将限制可扩展性,但是过多的分片会影响性能。默认设置5份
  • 文档 (document):Elasticsearch是面向文档的,这意味着索引和搜索数据的最小单位是文档。
    • 它是自我包含的。一篇文档同时包含字段和它们的取值。
    • 它可以是层次的。文档中还包含新的文档,字段还可以包含其他字段和取值。例如,“location”字段可以同时包含“city”和“street“两个字段。
    • 它拥有灵活的结构。文档不依赖于预先定义的模式。并非所有的文档都需要拥有相同的字段,它们不受限于同一个模式。
  • 类型 (type):类型是文档的逻辑容器,类似于表格是行的容器。在不同的类型中,最好放入不同结构的文档。
  • 索引 (index):索引是映射类型的容器。一个Elasticsearch索引是独立的大量的文档集合。 每个索引存储在磁盘上的同组文件中,索引存储了所有映射类型的字段,还有一些设置
  • 映射(mapping):所有文档在写入索引前都将被分析,用户可以设置一些参数,决定如何将输入文本分割为词条,哪些词条应该被过滤掉,或哪些附加处理有必要被调用(比如移除HTML标签),存储分析链所需的所有信息。

Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的

 

 

索引库
(indices)
indices是index的复数,代表许多的索引,
类型(type) 类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引(目前
6.X以后的版本只能有一个类型),类似数据库中的表概念。数据库表中有表
结构,也就是表中每个字段的约束信息;索引库的类型中对应表结构的叫做 映
射(mapping) ,用来定义每个字段的约束。
文档
(document)
存入索引库原始的数据。比如每一条商品信息,就是一个文档
字段(field) 文档中的属性
映射配置
(mappings)
字段的数据类型、属性、是否索引、是否存储等特性


2.1 索引库

Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求

  • 创建、获取、删除
  • 请求方式:PUT、GET、DELETE 
  • 请求路径:/索引库名  
  • 请求参数:json格式:

 

{
"settings": {
"属性名": "属性值"
}
}

settings:就是索引库设置,其中可以定义索引库的各种属性

 2.2 类型及映射操作

字段的约束信息,叫做字段映射(mapping),包括但不限于:字段的数据类型;是否要存储;是否要索引;是否分词;分词器是什么

  • 创建字段映射

  

    • 类型名称:就是前面将的type的概念,类似于数据库中的表
    • 字段名:任意填写,下面指定许多属性,例如:
      • type:类型,可以是text、keyword、long、short、date、integer、object等
      • index:是否索引,默认为true
      • store:是否存储,默认为false
      • analyzer:分词器,这里的 ik_max_word 即使用ik分词器
  • 查看映射关系

  

 

 

 

 

 

 

  • 映射属性详解
    • String类型:
      • text:使用文本数据类型的字段,它们会被分词,文本字段不用于排序,很少用于聚合,如文章标题、正文。
      • keyword:关键字数据类型,用于索引结构化内容的字段,不会被分词,必须完整匹配的内容,如邮箱,身份证号。支持聚合
    • Numerical:数值类型
      • 基本数据类型:long、interger、short、byte、double、float、half_float,double 双精度64位,float 单精度32位,half_float 半精度16位,
      • 浮点数的高精度类型:scaled_float,带有缩放因子的缩放类型浮点数,依靠一个 long 数字类型通过一个固定的( double 类型)缩放因数进行缩放.需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
    • Date:日期类型 :elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
    • Array:数组类型:进行匹配时,任意一个元素满足,都认为满足,排序时,如果升序则用数组中的最小值来排序,如果降序则用数组中的最大值来排序
字符串数组:["one", "two"]
整数数组:[1,2]
数组的数组:[1, [2, 3]],等价于[1,2,3]
对象数组:[ { "name": "Mary", "age": 12 }, { "name": "John", "age": 10 }]
    • Object:对象,JSON文档本质上是分层的:文档包含内部对象,内部对象本身还包含内部对象。
{
    "region": "US",
    "manager.age": 30,
    "manager.name ": "John Smith"
}
 索引方法如下:
{
"mappings": {
    "properties": {
        "region": { "type": "keyword" },
        "manager": {
            "properties": {
                    "age": { "type": "integer" },
                    "name": { "type": "text" }
                            }
                    }
            }
}            
    • ip地址
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"ip_addr": {
"type": "ip"
}
}
}
}
}

PUT my_index/_doc/1
{"ip_addr": "192.168.1.1"
}


GET my_index/_search
{
"query": {
"term": {
"ip_addr": "192.168.0.0/16"
}
}
}
    • index:true:字段会被索引,则可以用来进行搜索过滤。默认值就是true,只有当某一个字段的index值设置为true时,检索ES才可以作为条件去检索。index的默认值就是true
    • store:是否将数据进行额外存储。
      • 在lucene时,我们知道如果一个字段的store设置为false,那么在文档列表中就不会有这个字段的值,用户的搜索结果中不会显示出来。
      • 在Elasticsearch中,即便store设置为false,也可以搜索到结果。原因是Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做 _source 的属性中。而且我们可以通过过滤 _source 来选择哪些要显示,哪些不显示。
      • 而如果设置store为true,就会在 _source 以外额外存储一份数据,多余,因此一般我们都会将store设置为false,事实上,store的默认值就是false。
      • 在某些情况下,这对 store 某个领域可能是有意义的。例如,如果您的文档包含一个 title ,一个date 和一个非常大的 content 字段,则可能只想检索the title 和the date 而不必从一个大 _source字段中提取这些字段
    • boost:网站权重:网站权重是指搜索引擎给网站(包括网页)赋予一定的权威值,对网站(含网页)权威的评估评价。一个网站权重越高,在搜索引擎所占的份量越大,在搜索引擎排名就越好。提高网站权重,不但利于网站(包括网页)在搜索引擎的排名更靠前,还能提高整站的流量,提高网站信任度,默认 boost 值为 1.0,提升仅适用于Term查询(不提升prefix,range和模糊查询)。
    • 一次创建索引库和类型

2.3 kibana对文档操作

  • 新增文档,显示为created 说明创建成功,请求为post
    • 自动生成id
    • 自定义ID:POST /索引库名/类型/id值

       
  • 查询文档
    • _source :源文档信息,所有的数据都在里面。
    • _id :这条文档的唯一标示:自动生成的id,长度为20个字符,URL安全,base64编码,GUID(全局唯一标识符),分布式系统并行生成时不可能会发生冲突,在实际开发中不建议使用ES生成的ID,太长且为字符串类型,检索时效率低。建议:将数据表中唯一的ID,作为ES的文档ID

       

       

  • 删除文档,DELETE /索引库名/类型名/id值,显示为deleted
  • 更新文档
    • PUT:修改文档,把新增的请求方式改为PUT,就是修改,修改必须指定id,
      • id对应文档存在,则修改,显示updated
      • id对应文档不存在,则新增,显示created

         

  • 智能判断,Elasticsearch非常智能,你不需要给索引库设置任何mapping映射,它也可以根据你输入的数据来判断类型,动态添加数据映射

 

 

 title是String类型数据,ES无法智能判断,它就会存入两个字段subtitle: text类型和subtitle.keyword:keyword类型

  • 动态模板
    • 模板名称,随便起
    • 匹配条件,凡是符合条件的未定义字段,都会按照这个规则来映射
    • 映射规则,匹配成功后的映射规则

 

 

 未知的string类型数据就不会被映射为text和keyword并存,而是统一以keyword来处理

 

 

  

2.4 查询操作

  • 基本查询
    GET /索引库名/_search
    {
        "query":{
            "查询类型":{
                "查询条件":"查询条件值"
                }
            }
    }
    • 查询所有match_all

       

      • took:查询花费时间,单位是毫秒
      • time_out:是否超时
      • _shards:分片信息
      • hits:搜索结果总览对象
      • total:搜索到的总条数
      • max_score:所有结果中文档得分的最高分
      • hits:搜索结果的文档对象数组,每个元素是一条搜索到的文档信息
      • _index:索引库
      • _type:文档类型
      • _id:文档id
      • _score:文档得分,排序依据,相关度
      • _source:文档的源数据
    • 匹配查询
      • match 类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系
      • 查询条件切分词之后的关系变成 and ,加上operator

       

    • 词条匹配:term 查询被用于精确值 匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串,keyword类型的字符串 ,效果类似于:select * from tableName where colName='value'

     

    • 布尔组合:bool 把各种其它查询通过 must (与)、 must_not (非)、 should (或)的方式进行组合
    • 范围查询:range 查询找出那些落在指定区间内的数字或者时间
    • 模糊查询:fuzzy 查询是 term 查询的模糊等价,很少直接使用它

       

       

  • 结果过滤:默认情况下,elasticsearch在搜索的结果中,会把文档中保存在 _source 的所有字段都返回;只想获取其中的部分字段,可以添加 _source 的过滤
    • 直接指定字段
    • 指定includes和excludes
  • 过滤:
    • 使用查询(query)语句来进行 全文 搜索或者其它任何需要影响 相关性得分 的搜索。除此以外的情况都使用过滤(filters)

     

    • 如果一次查询只有过滤,没有查询条件,不希望进行评分,我们可以使用 constant_score 取代只有filter 语句的 bool 查询,提高查询简洁性和清晰度

     

     

  • 排序:sort 可以让我们按照不同的字段进行排序,并且通过 order 指定排序的方式

 

 

 

 

  • 分页:Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回,指定from:目标数据的偏移值(开始位置),默认from为0,size:每页大小

 

 

  • 高亮:服务端搜索数据,得到搜索结果,把搜索结果中,搜索关键字都加上约定好的标签,前端页面提前写好标签的CSS样式,即可高亮 。
    • 在使用match查询的同时,加上一个highlight属性
    • pre_tags:前置标签
    • post_tags:后置标签
    • fields:需要高亮的字段
    • title:这里声明title字段需要高亮

     

     

     

 

 

 

这篇关于Elasticsearch的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!