Elasticsearch

ELK Stack

Elasticsearch(存储+检索+分析),简称ES
Logstash(日志收集)
Kibana(可视化)

在这里插入图片描述

Elasticsearch简介

基于Lucene的开源分布式搜索引擎,大幅降低了PB级海量数据存储、检索、分析门槛

特点

分布式实时文件存储、检索、分析
零配置、集群自动发现
索引自动分片、副本机制
RESTful风格接口
多数据源
自动搜索负载

安装Elasticsearch

请看博文
http://blog.csdn.net/sanjiang521/article/details/108612188

ES数据模型

Index:索引,由多个Document组成
Type:索引类型,6.x中仅支持一个,以后将逐渐被移除
Document:文档,由多个Field组成
Field:字段,包括字段名与字段值
在这里插入图片描述

文档(Document)管理

文档是ES最小数据单元

原始数据

_source:原始JSON格式文档

文档元数据

_index:索引名
_type:索引类型
_id:文档编号
_version:文档版本号用于并发控制
_score:在搜索结果中的评分

PUT/POST/GET/DELETE http://ip:端口/索引名称/类型/主键

注:
put:更新或创建
post:创建
get:查看
delete:删除

批量操作bulk文件

PUT _bulk
{"index/create/update/delete":{"_index":"...","_type":"...","_id":"..."}}
{"field1":"value1",……}

例:

{"create":{"_index":"stu","_type":"doc","_id":"1"}}
{"id": 1, "studentNo": "TH-CHEM-2016-C001", "name": "Jonh Smith", "major":"Chemistry", "gpa": 4.8, "yearOfBorn": 2000, "classOf": 2016,  "interest": "soccer, basketball, badminton, chess"}
{"create":{"_index":"stu","_type":"doc","_id":"2"}}
{"id": 2, "studentNo": "TH-PHY-2018-C001", "name": "Isaac Newton", "major":"Physics", "gpa": 3.6, "yearOfBorn": 2001, "classOf": 2018,  "interest": "novel, soccer, cooking"}

批量读取文档

GET stu/doc/_mget
{"docs":[{"_id":"1"},{"_id":"2"}]}
GET stu/_mget
{"docs":[{"_type":"doc","_id":"1"},{"_type":"doc","_id":"2"}]}
GET _mget
{"docs":[{"_index":"stu","_type":"doc","_id":"1"},{"_index":"stu","_type":"doc","_id":"2"}]}

索引(Index)管理

创建索引

索引名称规范

只支持小写字母
不包括“\ / * ? " < > | ` (空格) , #”
“:”在7.0前支持
不能以“- _ +”开头
不能为“.”或“…”
不超过255字节

PUT http://ip:端口/索引名称

注:在不存在的索引中创建文档会自动创建索引

PUT demo.123	//创建索引
GET demo.123	//查看索引

带参数创建索引

主分片数量,默认5
副本数量,默认1

PUT demo.1234
{
    "settings" : {
        "index" : {
            "number_of_shards" : 2, 
            "number_of_replicas" : 2 
        }
    }
}

索引的映射

定义字段名、字段类型(text、keyword、date、long、double、boolean、ip、completion、geo_point……)
定义索引规则

PUT demo.12345
{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "_doc" : {
            "properties" : {
                "field1" : { "type" : "text" }
            }
        }
    }
}

注:
_type:_doc
字段名:field1
字段类型:text
字段指定类型为text,会被分词(standard analyzer)
字段指定类型为keyword,不会被分词

查看索引映射

GET demo.12345/_mapping

删除索引

DELETE demo.12345

ES分布式架构

节点

在这里插入图片描述
节点数量:3
索引名称:demo.1234
number_of_shards:2 number_of_replicas:2

注意

一个集群由多个节点组成,每个节点指定相同的cluster.name

主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等

一个节点是一个ES实例,默认每个节点都可为候选主节点与数据节点,即:
node.master: true
node.data: true

通过路由计算:hash(routing) % number_of_primary_shards

索引分片

分片

索引是指向一个或多个分片的逻辑命名空间
最小级别的工作单元,一个Lucene实例(倒排索引)

主分片

静态不可变
索引首先被存储在主分片中,然后复制相应的副本分片

主分片分配

在这里插入图片描述

副本分片

动态可修改
用于故障转移,一旦主分片失效,副本分片晋升为主分片

分片检索

文档能够从主分片或任意一个副本分片被检索
在这里插入图片描述

1.客户端给node 1发送get请求,node1节点就成了 coordinating node(协同节点),该节点使用路由算法算出文档所在的 primary shard;协调节点把请求转发给 primary shard ,也可以转发给 replica shard(使用轮询调度算法 [ Round-Robin Scheduling,把请求平均分配至 primary shard 和 replica shard ] ,场景在于多个相同请求进入时)。
2.节点使用文档的_id确定文档属于分片0。分片0对应的复制分片在三个节点上都有。此时,它转发请求到node 2。
3.node 2返回文档(document)给node 1然后返回给客户端。

查询阶段

查询被向索引中的每个分片(原本或副本)广播,返回待检索数据的定位

在这里插入图片描述

取回阶段

根据待检索数据的定位,发送一个mget的请求给相关分片

在这里插入图片描述

倒排索引(Inverted Index)

文章1:
Tom lives in Guangzhou,I live in Guangzhou too.
文章2:
He once lived in Shanghai.
在这里插入图片描述
注:倒排索引表,词条全小写

ES搜索方式

主要包括两种

URI Search:简易方式,可临时使用,不适合构建复杂查询

GET stu,demo*/_search?q=name:john&sort=classOf:desc
GET stu/_count

Query DSL(Domain Specific Language)

基于JSON的查询语言

叶查询子句(Leaf query clauses)
用于在特定字段中查找特定值

match查询
term查询
range查询

复合查询子句(Compound query clauses)
可以包含叶子或者其它的复杂查询语句

bool查询

match_all:返回所有文档
GET stu/_search
{
    "query": {
        "match_all": {}
    }
}
match:布尔匹配查询

对查询字符串进行分词,根据分词结果构造布尔查询

GET stu/_search
{
    "query": {
        "match": {
          "name":"John Kerry"
        }
    }
}

分词结果为john和kerry两个单词,只要name字段值中包含有其中任意一个,那么返回该文档

match_phrase:短语匹配查询

对查询字符串进行分词,字段值必须依次匹配所有分词,注意各分词位置不能改变

GET stu/_search
{
    "query": {
        "match_phrase": {
          "name":"John Kerry"
        }
    }
}

分词结果为john和kerry两个单词,如果name字段值中依次包含所有分词,那么返回该文档

match_phrase_prefix:短语前缀匹配查询

类似match_phrase,但最后一个分词作为前缀匹配

GET stu/_search
{
    "query": {
        "match_phrase_prefix": {
          "name":"John Ke"
        }
    }
}

最后一个分词作为前缀匹配

multi_match:多字段匹配查询
GET stu/_search
{
    "query": {
        "multi_match": {
          "query": "John like cooking",
          "fields": ["name","interest"]
        }
    }
}
term:词条查询

按照存储在倒排索引中的确切字词,对字段进行匹配

GET stu/_search
{
    "query": {
        "term":{
          "name":"john"
        }
    }
}
terms:多词条查询

按照存储在倒排索引中的确切字词,对字段进行多词条匹配

GET stu/_search
{
    "query": {
        "terms":{
          "name":["john","da"]
        }
    }
}
range:范围查询
GET stu/_search
{
    "query": {
        "range" : {
            "yearOfBorn" : {
                "gte" : 1995,
                "lte" : 2000
            }
        }
    }
}
bool:布尔查询

查询喜欢“cooking”且不在1995-2000间出生的学生

GET stu/_search
{
    "query": {
      "bool": {
        "must": {
            "match": { "interest": "cooking"} },
        "must_not": {
            "range": { "yearOfBorn": { "gte": 1995, "lte": 2000 }}}
      }
    }
}

分页

from+size浅分页

GET stu/_search?size=5
GET stu/_search?size=5&from=5
GET stu/_search
{
  "query": {
    "match_all": {}
  },
  "size": 5,
  "from": 0
}

scroll深分页

保存结果快照,需要分页时,直接从结果中获取

GET stu/_search?scroll=5m
{
  "from": 0,
  "size": 5,
  "query": {"match_all": {}}
}

返回scroll_id与第一页内容,scroll_id 5分钟有效

GET _search/scroll
{
  "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAANy……",
  "scroll": "5m"
}
根据scroll_id不断获取下一页内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值