大型网站架构分布式&高可用Java技术升华

ElasticSearch(提高篇)

2019-08-09  本文已影响73人  Waldeinsamkeit4

前言

Elasticsearch的简单入门请参考之前写的一篇文章Elasticsearch简单入门篇,这篇简单介绍啦Elasticsearch的基本安装、Docker安装方法、基本的概念,以及如何使用Java代码实现对ElasticsearchCRUD操作等入门知识。

内容摘要

Elastic Search分享

1.1.Elastic Stack应用场景

1.2.Elastic Stack技术架构

Elastic static家族产品

image-20190802210856808

高级架构

Elastic的技术架构可以简单,也可以高级,它是很具有扩展性的,最简单的技术架构就是使用Beats进行数据的收集,Beats是一种抽象的称呼,具体的可以是使用FileBeat收集数据源为文件的数据或者使用TopBeat来收集系统中的监控信息,可以说类似Linux系统中的TOP命令,当然还有很多的Beats的具体实现,再使用logstash进行数据的转换和导入到Elasticsearch中,最后使用Kibana进行数据的操作以及数据的可视化等操作。

当然,在生产环境中,我们的数据可能在不同的地方,例如关系型数据库Postgre,或者MQ,再或者Redis中,我们可以统一使用Logstash进行数据的转换,同时,也可以根据数据的热度不同将ES集群架构为一种冷温热架构,利用ES的多节点,将一天以内的数据称谓热数据,读写频繁,就存放在ES热节点中,七天以内的数据称之为温数据,就是偶尔使用的数据存放在温节点中,将极少数会用到的数据存放在冷节点中

image-20190802212002520

1.3.ES基本概念回顾

文档(Document)

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

元数据(标注文档信息)

"_index" : "user",
"_type" : "_doc",
"_id" : "l0D6UmwBn8Enzbv1XLz0",
"_score" : 1.6943597,
"_source" : {
    "user" : "mj",
    "sex" : "男",
    "age" : "18"
}

索引(index)

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

索引中有两个重要的概念,MappingSettingMapping定义的是文档字段和字段类型,Setting定义的是数据的不同分布。

类型(Type)

节点(Node)

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

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

分片(shard)

image-20190802231314640
"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"
        }
    }
}

1.4.倒排索引

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

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

倒排索引包含如下信息:

举例说明什么是正排索引倒排索引,其中正排索引如下:

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

讲上例Elasticsearch单词修改为倒排索引,如下:

文档ID(Doc ID) 出现次数(TF) 位置(Position) 偏移量(Offset)
1101 1 0 <0,13>
1102 1 0 <0,13>
1103 1 1 <7,20>

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

1.5.Analyzer分词

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

PS:Elasticsearch安装插件,[root@34d02ff9d16c elasticsearch]# bin/elasticsearch-plugin install analysis-icu

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

1.6.Search API

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

URL 查询

使用基本的查询

GET /user/_search?q=2012&df=title&sort=year:desc&from=0&size=10
{
    􏲽profile􏲿: true
}

指定所有字段的泛查询

GET /user/_search?q=2012
{
    "profile":"true"
}

指定字段的查询


GET /user/_search?q=title:2012&sort=year:desc&from=0&size=10&timeout=1s
{
    "profile":"true"
}

Term查询

GET /user/_search?q=title:Beautiful Mind
{
    "profile":"true"
}

Phrase查询

GET /user/_search?q=title:"Beautiful Mind"
{
    "profile":"true"
}

分组查询

GET /user/_search?q=title:(Beautiful Mind)
{
    "profile":"true"
}

布尔查询

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"
}

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

Request Body 查询

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

基本 的查询

POST /movies,404_idx/_search?ignore_unavailable=true
{
  "profile": true,
    "query": {
        "match_all": {}
    }
}

分页查询

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": {}
  }
}

使用脚本查询

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"
      }
    }
  }
}

Math_phrase查询

POST movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query": "one love",
         "slop": 4
      }
    }
  }
}

1.7.Dynamic Mapping

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

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

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

如何写Mapping

第一种方式是参考官方API,纯手工写,也可以先创建一个临时的IndexElasticSearch自动当我们推断出基本的Mapping,然后自己在改吧改吧,最后把临时索引删掉就是啦。下面列举一些常用的Mapping设置属性:

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

1.8.Aggregation聚合分析

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

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"
                    }
                }
            }
        }
    }
}

附录一

相关阅读

更多文章,更好的阅读体验,请前往个人网站查看 码酱博客

上一篇 下一篇

猜你喜欢

热点阅读