Elasticsearch

https://www.elastic.co/cn/

https://www.elastic.co/guide/cn/elasticsearch/guide/current/distributed-cluster.html

官方API文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html

Lucene

  • Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。
  • Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
  • Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库

Elasticsearch

一个采用Restful API标准的高扩展性高可用性实时数据分析的全文搜索工具

  • Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。

  • Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

  • 官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。

  • 根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene

RESTFul

  • API : 应用程序接口
  • XML: 可扩展标记语言,是一种程序与程序之间传输数据的标记语言
  • JSON: javascript object notation , 一种新型的轻量级数据交换格式

RESTFul含义

  • Representational State Transfer缩写
  • 中文意思 “表现层状态转化

RESTFUL特点包括:

  • 1、每一个URI代表1种资源;
  • 2、客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
  • 3、通过操作资源的表现形式来操作资源;
  • 4、资源的表现形式是XML或者HTML;
  • 5、客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息

搜索引擎数据库排行

在这里插入图片描述

  • solr 支持数据类型多
  • elasticsearch只支持json

Elastic Stack应用场景

  • 网站搜索、代码搜索等(例如生产环境的日志收集 ——格式化分析——全文检索——系统预警)
  • 日志管理与分析、应用系统性能分析、安全指标监控等

Elasticsearch架构

在这里插入图片描述

Elasticsearch 处理查询请求时节点工作流程

  • 请求被交给主节点;
  • 主节点接收请求,将请求广播到该索引在数据节点上的每个分片(shard);
  • 每个分片执行搜索请求,并将结果返回;
  • 分片的Result在主节点上进行合并,排序后返回给用户

基本概念

关系型数据库非关系型数据库(Elasticsearch)
索引 Index
表 table类型 Type
行 Row文档 Document
列 Column字段 Field

文档(Document)

Elasticsearch面向文档性,文档就是所有可搜索数据的最小单位。比如,一篇PDF中的内容,一部电影的内容等,文档会被序列化成JSON格式,保存在Elasticsearch中,必不可少的是每个文档都会有自己的唯一标识,可以自己指定,也可以由Elasticsearch帮你生成。类似数据库的一行数据

元数据(标注文档信息)

"_index" : "user",
"_type" : "_doc",
"_id" : "l0D6UmwBn8Enzbv1XLz0",
"_score" : 1.6943597,
"_source" : {
    "user" : "mj",
    "sex" : "男",
    "age" : "18"
}
  • _index:文档所属的索引名称。
  • _type:文档所属的类型名。
  • _id:文档的唯一标识。
  • _version:文档的版本信息。
  • _score:文档的相关性打分。
  • _source:文档的原始JSON内容。

索引(index)

索引是文档的容器,是一类文档的集合,类似关系数据库中的表,索引体现的是一种逻辑空间的概念,每个索引都应该有自己的Mapping定义,用于定义包含文档的字段名和字段类型。其中Shard(分片)体现的是物理空间的一种概念,就是索引中的数据存放在Shard上,因为有集群,要保证高可用,当其中一个机器崩溃中,保存在它上的分片数据也能被正常访问,因此,存在分片副本

索引中有两个重要的概念,Mapping和Setting

  • Mapping定义的是文档字段和字段类型
  • Setting定义的是数据的不同分布

类型(Type)

在7.0之前,一个index可以创建多个Type。
之后就只能一个index对应一个Type

列(Field)

Field是Elasticsearch的最小单位,相当于数据的某一列

节点(Node)

一个节点就是一个Elaseticsearch实例,本质就是一个JAVA进程。每一个节点启动后,默认就是一个master eligible节点。就是具备成为master资格的节点,你也可以狠心的指定它没有这个资格(node.master:false)

第一个节点启动后,他就选自己成为Master节点类,每一个节点上都保存了集群状态,但是,只有Master才能修改集群状态信息。集群状态信息就比如:

  • 所有的节点信息。
  • 所有的索引信息,索引对应的mapping信息和setting信息。
  • 分片的路由信息。

分片(shard)

将索引(index)分成若干份,每个部分就是一个shard

  • 主分片:用于解决数据的水平扩展问题,通过主分片就数据分布在集群内的不同节点上,主分片在创建索引的时候就指定了,后面就不允许修改,除非重新定义Index。

  • 副本(Replicas):用于解决高可用的问题,分片是主分片的拷贝。副本分片数可以动态的调整,增加副本数量可以在一定的程度上提高服务的可用性。关于主分片的理解可以如下图,看是怎样实现高可用的

在这里插入图片描述

"settings" : {
    "index" : {
        // 设置主分片数
        "number_of_shards" : "1",
        "auto_expand_replicas" : "0-1",
        "provided_name" : "kibana_sample_data_logs",
        "creation_date" : "1564753951554",
        // 设置副本分片数
        "number_of_replicas" : "1",
        "uuid" : "VVMLRyw6TZeSfUvvLNYXEw",
        "version" : {
            "created" : "7010099"
        }
    }
}

倒排索引

正排索引:就是文档ID到文档内容的索引,简单讲,就是根据ID找文档。

文档ID文档内容
1101Elasticsearch Study
1102Elasticsearch Server
1103master Elasticsearch

倒排索引:就是根据文档内容找文档。

倒排索引包含如下信息:

  • 单词词典:用于记录所有文档的单词,以及单词到倒排列表的关联关系。
  • 倒排列表:记录的是单词对应的文档集合,由倒排索引项组成,其中包含
    • 文档ID
    • 单词出现的次数,用于相关性的评分
    • 单词出现的位置
    • 偏移量,用于记录单词的开始位置和结束位置,用于单词的高亮显示
文档ID(Doc ID)出现次数(TF)位置(Position)偏移量(Offset)
110110<0,13>
110210<0,13>
110311<7,20>

Elasticsearch中的每一个字段都有自己的倒排索引,
也可以指定某些字段不做索引,可以节省存储空间,缺点就是不能被搜索到。

Analyzer分词

Analysis:文本分析,就是将文本转换为单词(term或者token)的过程,其中Analyzer就是通过Analysis实现的,Elasticsearch给我们内置很多分词器

  • Standard Analyzer:默认的分词器,按照词切分,并作大写转小写处理
  • Simple Analyzer:按照非字母切分(符号被过滤),并作大写转小写处理
  • Stop Anayzer:停用词(the、is)切分,并作大写转小写处理
  • Whitespace Anayzer:空格切分,不做大写转小写处理
  • IK:中文分词器,需要插件安装
  • ICU:国际化的分词器,需要插件安装
  • jieba:时下流行的一个中文分词器。安装方法见附录

PS:Elasticsearch 安装插件,./bin/elasticsearch-plugin install analysis-icu

查看已经安装的插件:./bin/elasticsearch-plugin list

Search API

在ES中,我们可以使用URL SearchRequest Body Search进行相关的查询操作

URL 查询

使用基本的查询
GET /user/_search?q=2012&amp;df=title&amp;sort=year:desc&amp;from=0&amp;size=10
{
    "profile": true
}
  • 使用q指定查询的字符串
  • 使用df指定查询的字段
  • 使用sort进行排序,使用from和size指定分页
  • 使用profile可以查询查询是如何进行查询的
指定所有字段的泛查询
GET /user/_search?q=2012
{
    "profile":"true"
}
指定字段的查询
GET /user/_search?q=title:2012&amp;sort=year:desc&amp;from=0&amp;size=10&amp;timeout=1s
{
    "profile":"true"
}
Term查询
GET /user/_search?q=title:Beautiful Mind
{
    "profile":"true"
}
  • 上例中的Beautiful和Mind就是两个Term,Term是查询中最小的单位。
  • Term查询是OR的关系,在上例中就是title字段包含Beautiful或者包含Mind都会被检索到。
Phrase查询
GET /user/_search?q=title:"Beautiful Mind"
{
    "profile":"true"
}
  • 使用引号表示Phrase查询
  • Phrase查询表示的不仅是And的关系,即Title字段中不仅要包含Beautiful Mind,而且。顺序还要一致。
分组查询
GET /user/_search?q=title:(Beautiful Mind)
{
    "profile":"true"
}
  • 使用中括号表示分组查询,一般使用Term查询的时候都会带上分组查询。
布尔查询
  • 使用 AND、OR、NOT或者||、&amp;&amp;、!
  • 还可以使用+(表示must),使用-(表示must_not)
  • 需要注意的是必须大写
GET /user/_search?q=title:(Beautiful NOT Mind)
{
    "profile":"true"
}
GET /user/_search?q=title:(Beautiful %2BMind)
{
    "profile":"true"
}

PS:%2B表示的就是+,上例子表示的就是title字段中既要包含Beautiful,也要包含Mind字段

范围查询
GET /user/_search?q=title:beautiful AND age:[2002 TO 2018%7D
{
    "profile":"true"
}
  • 使用[ ]表示闭区间,使用{ }表示开区间,例如age :[* TO 56]
  • 使用算术符表示范围,例如year :&gt;=2019 &amp;&amp; &lt;=1970

PS:URL Search还有很多查询方式。例如通配符查询,正则插叙,模糊匹配,相似查询,其中通配符查询不建议使用。

Request Body 查询

将查询的条件参数放在Request Body中,调用查询接口,就是Request Body查询

基本 的查询
POST /movies,404_idx/_search?ignore_unavailable=true
{
  "profile": true,
    "query": {
        "match_all": {}
    }
}
  • 使用gnore_unavailable=true可以避免索引404_idx不存在导致的报错
  • profile和URL Search查询一样,可以看到查询的执行方式
分页查询
POST /movies/_search
{
  "from":10,
  "size":20,
  "query":{
    "match_all": {}
  }
}
排序查询
POST /movies/_search
{
  "sort":[{"order_date":"desc"}],
  "query":{
    "match_all": {}
  }
}
过滤要查询的字段
POST /movies/_search
{
  "_source":["order_date"],
  "query":{
    "match_all": {}
  }
}
  • 如果一个文档中的字段太多,我们不需全部字段显示,就可以使用_source指定字段。可以使用通配符。
使用脚本查询
  • 将ES中的文档字段进行一定的处理后,再根据这个新的字段进行排序,
GET /movies/_search
{
  "script_fields": {
    "new_field": {
      "script": {
        "lang": "painless",
        "source": "doc['name'].value+'是大佬'"
      }
    }
  },
  "query": {
    "match_all": {}
  }
}
Term查询
POST /movies/_search
{
  "query": {
    "match": {
      "title": "last christmas"
    }
  }
}

POST movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "last christmas",
        "operator": "and"
      }
    }
  }
}
  • 使用match,表示的就是OR的关系
  • 使用operator,表示查询方式
Math_phrase查询
POST movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query": "one love",
         "slop": 4
      }
    }
  }
}

Dynamic Mapping

Mapping可以简单的理解为数据库中的Schema定义,用于定义索引中的字段的名称,定义字段的类型,字段的倒排索引,指定字段使用何种分词器等。Dynamic Mapping意思就是在我们创建文档的时候,如果索引不存在,就会自动的创建索引,同时自动的创建Mapping,ElasticSearch会自动的帮我们推算出字段的类型,当然,也会存在推算不准确的时候,就需要我们手动的设置。

常用的字段类型如下:

  • 简单类型:Text、Date、Integer、Boolean等
  • 复杂类型:对象类型和嵌套类型。

我们可以使用GET /shgx/_mapping查询索引的Mapping的设置,需要注意的是以下几点:

  • 当我们对索引中的文档新增字段时候,希望可以更新索引的Mapping就可以可以设置Dynamic:true。
  • 对于已经有数据的字段,就不再允许修改其Mapping,因为Lucene生成的倒排索引后就不允许修改。

Dynamic Mapping可以设置三个值,分别是:

  • true:文档可被索引,新增字段也可被索引,Mapping也会被更新。
  • false:文档可被索引,新增字段不能被索引,Mapping不会被更新。
  • strict:新增字段写入,直接报错

如何写Mapping

第一种方式是参考官方API,纯手工写,也可以先创建一个临时的Index让ElasticSearch自动当我们推断出基本的Mapping,然后自己在改吧改吧,最后把临时索引删掉就是啦。

下面列举一些常用的Mapping设置属性

  • index:可以设置改字段是否需要被索引到。设置为false就不会生成倒排索引,节省磁盘开销
  • null_value:可以控制NULL是否可以被索引
  • cope_to:将字段值放在一个新的字段中,可以使用新的字段- search,但这个字段不会出现在_source中。
  • anaylzer:指定字段的分词器
  • search_anaylzer:指定索引使用的分词器
  • index_options:控制倒排索引的生成结构,有四种情况
    • docs:倒排索引只记录文档ID
    • freqs:记录文档ID和Term
    • positions:记录文档ID、Term和Term Position
    • offsets:记录文档ID、Term、Term Position和offsets

PS:Text类型的字段默认的是Position,其它类型默认的是docs,记录的越多,占用的存储空间就越大

Aggregation聚合分析

ElasticSearch不仅仅是搜索强大,他的统计功能也是相当的强大的,聚合分析就是统计整个数据的一个分类数量等,例如武侯区有多少新楼盘。天府新区有多少新楼盘,通过聚合分析我们只需要写一条语句就可以得到。在加上Kibana的可视化分析,简直就是清晰,高效。

常用的集合有以下几种:

  • Bucket Aggregation:满足特定条件的一些集合,使用关键字terms
  • Metric Aggregation:简单的数学运算,对字段进行统计分析,使用关键字min、max、sum、avg等,使用关键字aggs
  • Pipeline Aggregation:二次聚合
  • Matrix Aggregation:对多个字段进行操作,提供一个结果矩阵

Bucket分析示例

GET kibana_sample_data_flights/_search
{
    "size": 0,
    "aggs":{
        "flight_dest":{
            "terms":{
                "field":"DestCountry"
            }
        }
    }
}

Metric分析示例

GET kibana_sample_data_flights/_search
{
    "size": 0,
    "aggs":{
        "flight_dest":{
            "terms":{
                "field":"DestCountry"
            },
            "aggs":{
                "avg_price":{
                    "avg":{
                        "field":"AvgTicketPrice"
                    }
                },
                "max_price":{
                    "max":{
                        "field":"AvgTicketPrice"
                    }
                },
                "min_price":{
                    "min":{
                        "field":"AvgTicketPrice"
                    }
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuxingge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值