ElasticSearch

一、学习路径:

1、核心知识
2、高手进阶

3、大型集群运维优化
4、大型项目架构
5、ELK深入浅出

二、ElasticSearch简介

分布式,高可用,高性能,可伸缩的搜索和分析系统

1、应用
互联网:电商,新闻,招聘...
IT系统:OA软件,办公自动化软件,会议管理,日程管理,项目管理,员工管理...

2、数据库做搜索
效果不佳,速度较慢

3、全文检索,倒排索引
Lucene:jar包,提供了建立倒排索引,搜索的功能

4、ElasticSearch:
(1)、基于Lucene
(2)、自动维护多个节点索引建立
(3)、搜索分布到多个节点执行
(4)、自动维护数据的冗余副本

三、ElasticSearch功能

1、分布式搜索引擎和数据分析引擎
​ 分布式,搜索,数据分析
2、全文检索,结构化检索,数据分析
3、对海量数据进行近实时处理

ES分布式存储海量数据 - Lucene单机应用
近实时(秒级) - 离线批处理

四、ElasticSearch适用场景

1、维基百科
2、新闻网站,用户行为日志(点击,浏览,收藏,评论)
3、Stack Overflow问题搜索
4、github代码搜索
5、电商搜索
6、日志数据分析
7、商品价格监控网站
8、BI系统,商业智能
9、站内搜索(电商,招聘,门户...)
10、IT系统(OA,CRM,ERP...)
11、数据分析(热门)

五、ElasticSearch特点

1、分布式,也可以单机
2、ES = 全文检索 + 数据分析 + 分布式技术
3、开箱即用,简单
4、数据库(事务)ES作为补充

六、ElasticSearch核心概念

Lucene:
最先进,功能强大的搜索库,api复杂

ES:
分布式,
文档存储,
搜索引擎,
分析引擎,
PB级数据

核心概念
1、Near Realtime NRT 近实时(延迟1s)
2、Cluster 集群,包含多个节点
3、Node 节点
4、Document 文档 es中的最小数据单元 json结构,包含多个field字段
5、Index 索引
6、Type 类型 index中的一个逻辑分类
7、Shard(primary shard) 分片 一个index会被分成多片,存放到台态服务器
​ (1)横向扩展
​ (2)并行分布式执行,提升吞吐量和性能
​ (3) 默认5个,建立时设置,不能修改
8、Replica(replica shard) 副本
​ (1)高可用,一个shard宕机,服务可用
​ (2)提升搜索请求吞吐量
​ (3)默认1个,随时修改
​ 5个shard 对应 5个副本,最小高可用配置2台服务器

和mysql对比:
es - mysql
index - database
type - table
document - row

七、ElasticSearch安装

安装
Java -version >= 1.8

1、下载解压
官网:
https://www.elastic.co/

注意版本要匹配version 5.2.0

搜索下载es 和 kibana
https://www.elastic.co/cn/downloads/past-releases

或者直接下载
elasticsearch 5.2.0 32.0 MB:
https://www.elastic.co/cn/downloads/past-releases/elasticsearch-5-2-0
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.0.tar.gz

kibana 5.2.0 35.2 MB:
https://www.elastic.co/cn/downloads/past-releases/kibana-5-2-0

https://artifacts.elastic.co/downloads/kibana/kibana-5.2.0-windows-x86.zip
https://artifacts.elastic.co/downloads/kibana/kibana-5.2.0-darwin-x86_64.tar.gz
https://artifacts.elastic.co/downloads/kibana/kibana-5.2.0-linux-x86_64.tar.gz

2、启动es

./bin/elasticsearch

查看启动情况
http://127.0.0.1:9200/?pretty

##  节点名称
name: "node-1",

##  集群名称
cluster_name: "elasticsearch",

修改配置文件
config/elasticsearch.yml

3、启动kibana

./bin/kibana

访问
http://127.0.0.1:5601

进入Dev Tools
查看健康状态

GET _cluster/health

八、文档CRUD

面向文档的搜索分析引擎

Document文档格式 json格式

1、简单的集群管理
cat api

参数

?v 显示标题
?pretty

(1)检查集群健康状况

GET _cat/health
status primary shard replica shard
green active active
yellow active 部分不可用
red 部分有数据丢失 -

启动了一个es进程,只有一个node,当前只有一个index,
默认配置一个index分配5个primary shard和 5 个replica shard
而且 primary shard 和 replica shard不能在同一台机器上(为了容错)

kibana自己建立的index是一个primary shard 和 1个replica shard
当前就一个node,只分配了primary shard 没有第二台机器分配replica shard

只要再启动一个es,就会变成green

(2)查看集群中索引

GET _cat/indices

(3)创建索引

PUT /<index_name>

(4)删除索引

DELETE /<index_name>

2、文档操作(增删改查)
(1)新增文档

PUT /index/type/id
{
    <data>
}

es会自动建立index和type,不需要提前创建
而且默认会对document的每个field都建立倒排索引,以便搜索

eg:

PUT /web/product/1
{
    "name": "bat baidu",
    "price": 30,
    "tags": ["tieba", "baike"]
}

PUT /web/product/2
{
    "name": "bat tencent",
    "price": 40,
    "tags": ["qq", "weixin"]
}

PUT /web/product/3
{
    "name": "bat alibaba",
    "price": 60,
    "tags": ["taobao", "tianmao"]
}

(2)查找文档

GET /web/product/1

(3)替换文档

PUT /web/product/1
{
    "name": "baidu",
    "price": 35,
    "tags": ["tieba", "baike"]
}

替换方式必须带上所有信息才能进行修改,会整个文档替换

(4)更新文档

POST /web/product/1/_update
{
  "doc": {
    "price": 306
  }
}

只会更新部分字段,不会全部替换

(5)删除文档

DELETE /web/product/1

九、多种搜索方式

1、query string search
(1)查询所有

GET /web/product/_search

返回参数

took 耗费时间毫秒
time_out 是否超时
_shard 几个shard处理了搜索请求
hits.total 查询结果数量
hits.max_score 相关度匹配分数,越大越相关 (0-1]
hits.hits 搜索匹配的详细数据

(2)查询name包含'bat' 按照price降序排列

GET /web/product/_search?q=name:bat&sort=price:desc

几乎很少用query string search,难以构建复杂查询

2、query DSL
DSL:Domain Specified Language 特定领域的语言
http request body请求,用json构建查询

(1)查询所有

GET /web/product/_search
{
  "query":{
    "match_all": {}
  }
}

(2)排序查询
查询name包含 'bat' 按照price降序排列

GET /web/product/_search
{
  "query": {
    "match": {
      "name": "bat"
    }
  },
  "sort": [
    {
      "price": "desc"
    }
  ]
}

(3)分页查询
第1个开始,取1条数据,实际取出第2条数据(form从0开始计数)

GET /web/product/_search
{
  "query": {
    "match_all": {}
  }, 
  "from": 1,
  "size": 1
}

(4)指定字段
只取部分字段

GET /web/product/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["name", "price"]
}

3、query filter 数据过滤
(1)查询name中包含“bat”,price>25

GET /web/product/_search
{
    "query":{
        "bool":{
            "must":{
                "match":{
                    "name":"bat"
                }
            },
            "filter":{
                "range":{
                    "price":{
                        "gt":35
                    }
                }
            }
        }
    }
}

4、full-text search 全文检索
name字段会被拆解,建立倒排索引

关键字 id
bat 1,2,3
baidu 1
tencent 2
alibaba 3

搜索时会将搜索串拆解开,去倒排索引一一匹配,只要匹配任意一个就会作为结果返回
命中越多,分数值越高

GET /web/product/_search
{
  "query":{
    "match":{
      "name": "bat baidu"
    }
  }
}

5、phrase search 短语搜索
输入搜索串必须完全匹配,才能作为结果返回

GET /web/product/_search
{
  "query":{
    "match_phrase":{
      "name": "bat baidu"
    }
  }
}

6、highlight search 高亮搜索结果
将name字段匹配的内容做上高亮标志

GET /web/product/_search
{
  "query":{
    "match":{
      "name": "bat baidu"
    }
  },
  "highlight": {
    "fields": {
      "name":{}
    }
  }
}

十、聚合操作 aggregations

聚合示例使用的文档数据

PUT /taobao/product/1
{
  "name": "red dog",
  "age": 2,
  "tags": [
    "red", "dog"
    ]
}

PUT /taobao/product/2
{
  "name": "green dog",
  "age": 3,
  "tags": [
    "green", "dog"
    ]
}

PUT /taobao/product/3
{
  "name": "yellow dog",
  "age": 5,
  "tags": [
    "yellow", "dog"
    ]
}

1、简单聚合
(1)设置feild的fielddata属性为true

PUT /taobao/_mapping/product
{
  "properties": {
    "tags":{
      "type": "text",
      "fielddata": true
    }
  }
}

(2)通过标签分组计算数量

GET /taobao/product/_search
{
  "aggs":{
    "group_by_tag":{
      "terms":{
        "field": "tags"
      }
    }
  }
}

(3)设置 "size": 0不显示查询结果

GET /taobao/product/_search
{
  "size": 0,   
  "aggs":{
    "group_by_tag":{
      "terms":{
        "field": "tags"
      }
    }
  }
}

2、先搜索再聚合

GET /taobao/product/_search
{
  "size": 0,
  "query": {
    "match": {
      "name": "red"
    }
  },
  "aggs": {
    "group_by_tag": {
      "terms": {
        "field": "tags"
      }
    }
  }
}

3、先分组,再平均

GET /taobao/product/_search
{
  "size": 0,
  "aggs": {
    "group_by_tag": {
      "terms": {
        "field": "tags"
      },
      "aggs": {
        "avg_age": {
          "avg": {"field": "age"}
        }
      }
    }
  }
}

4、先分组,再平均,再降序排序

GET /taobao/product/_search
{
  "size": 0,
  "aggs": {
    "group_by_tag": {
      "terms": {
        "field": "tags",
        "order": {
          "avg_age": "desc"
        }
      },
      "aggs": {
        "avg_age": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  }
}

5、指定年龄范围分组,再按照组内标签分组,最后计算每组平均价格

GET /taobao/product/_search
{
  "size": 0,
  "aggs": {
    "group_by_age": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 0,
            "to": 3
          },
          {
            "from": 1,
            "to": 5
          }
        ]
      },
      "aggs": {
        "group_by_tag": {
          "terms": {
            "field": "tags"
          },
          "aggs": {
            "avg_age": {
              "avg": {
                "field": "age"
              }
            }
          }
        }
      }
    }
  }
}