EdenChanIy的博客


  • 首页

  • 标签

  • 归档

  • 关于

  • 搜索

Elasticsearch介绍

发表于 2019-10-27

什么是Elasticsearch?

Elasticsearch是对Apache开源库Lucene的封装,提供了RESTful API的操作接口,开箱即用

Elasticsearch是一个分布式实时文件存储,每个字段都被索引并可被搜索

Elasticsearch是一个分布式的实时分析搜索引擎,可以扩展到上百台服务器,处理PB级结构化或非结构化的数据

Elastic Stack

核心是Elasticsearch,提供数据存储;向上是Kibana,提供可视化管理;向下是Beats和Logstash,采集来自应用和基础设施的指标以及从第三方数据存储库中提取数据

Elastic Stack提供一系列企业级解决方案,包括日志、指标、应用性能监控和安全等

ElasticSearch的特点

  • 可扩展
  • 实时
  • 开发者友好
  • 多样的存储
  • 搜索和聚合
  • 倒排索引

Elasticseach基础概念

  • 索引:含有相同属性的文档集合

  • 类型:索引可以定义一个或多个类型,文档必须属于一个类型

  • 文档:可被索引的基本单位

与MySQL的对应关系(参考理解,并不是严格对应,具体有区别):

索引 —— 数据库

类型 —— 表

文档 —— 行

字段 —— 列

RESTful API

发送请求

1
curl -X<VERB> '<PORTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY-STRING>' -d '<BODY>'

VERB——Http方法:GET、POST、PUT、HEAD、DELETE

PROTOCOL——Http或Https协议

HOST——Elasticsearch集群中任何一个节点的主机名,如果在本地就是localhost

PORT——Elasticsearch服务所在端口,默认为9200

PATH——API路径,如-search;PATH可以包含多个组件

QUERTY-STRING——一些可选的查询参数

BODY——一个JSON格式的请求主体

一个简单的请求

1
2
3
4
5
6
curl -XGET 'http://localhost:9200/articles/_count?pretty' -d '
{
"query": {
"match_all": {}
}
}'

这个命令搜索articles索引下的文档个数,在Kibana的控制台中可以简写为:

1
2
3
4
5
6
GET /articles/_count
{
"query": {
"match_all": {}
}
}

Elasticsearch中的文档

Elasticsearch可以面向更为复杂的应用对象,比如包含日期、地理位置、另一个对象或者数组。因为Elasticsearch是面向文档的,意味着它可以存储整个对象或文档,并索引每个文档的内容使之可以被搜索

JSON——Elasticsearch使用JSON作为文档序列化格式

基本的CRUD操作

  • 索引(插入)

    1
    PUT /<index>/_doc/<num> {Body}
  • 搜索

    1
    GET /<index>/_doc/<num>
  • 更新

    1
    POST /<index>/_update/<num> {Body}
  • 删除

    1
    DELETE /<index>/_doc/<num>
  • Bulk API:支持上述四种类型的批量操作,一般包含两行,其中删除操作只需一行

    1
    2
    3
    POST /_bulk
    {"<operation>":{"_index":"<index>","_id":"<id>"}}
    {"<field>":"<value>"}
  • mget:批量读取

    1
    GET /_mget
  • msearch

    1
    POST /<index>/_msearch

Elasticseach的其他特性

  • 分词器分词
  • Mapping(映射)
  • Template
  • 聚合分析(文档相关性算分)
  • ……

Elasticsearch集群

  • 一个节点是一个运行Elasticsearch实例的Java进程
  • 一个集群由一到多个节点共同组成,每个节点担任不同角色
  • 一个主分片是一个Lucene实例,索引部分或全部数据
  • 一个副分片是一个主分片的拷贝
  • 索引是指向同一个或多个物理分片的逻辑命名空间

Elasticsearch的分布式特性

Elasticseach尽可能屏蔽了分布式系统的复杂性,在后台自动提供一些功能

  • 自动分配文档到不同分片中,文档可以存储在一个或多个节点
  • 按集群节点均衡分配分片,从而实现索引和搜索过程的负载均衡
  • 复制分片以实现数据冗余,防止硬件故障带来的数据缺失
  • 基础扩容是无缝整合新节点,重新分配分片

Elasticsearch利用分片将数据分发到集群内的各处。分片是数据的容器,文档保存在分片中,分片又被分配到集群的各个节点中,当集群规模变化时,Elasticsearch自动在各节点中分配迁移分片,使数据均匀分布

SpringBoot继承Elasticseach的几种方式

  • Transport Client(新版本弃用)
  • Jest —— 一个Elasticsearch的Java Http Rest Client

    • 提供Restful API
    • 支持不同版本的Elasticsearch集群
    • 安全——可在Http层添加安全代理
  • Spring Data —— Elasticseach Template

  • Spring Data Elasticsearch Repository —— 对Elasticseach Template的封装

几本书的读书笔记

发表于 2019-08-01

《谈美》

  1. 看待事物要从多种角度,同时每个人都会用自己的角度去感知事物

  2. 由此而知事物的形象不是一成不变的,而是顺应观者,反映观者的内心

  3. 用实用,科学和美感的角度看待事物

  1. “人常是不满意自己的境遇而羡慕他人的境遇”

  2. 事物越与观者产生交集,观者越不容 易察觉它的美

  1. “我们常把自己所得的感受外射到物的本身上去”

  2. “移情作用是和美感经验有密切关系的。移情作用不一定就是美感经验,而美感经验却常含有移情作用”

  3. 观者会不知觉模仿物的形象,所以美感经验有陶冶性情的功效

  1. 高等感官感受美感,低等感官感受快感
  1. 艺术不能离开联想,联想并不等同于艺术

《批判性思维工具》

成为公正的思考者

  • 成为公正的思考者可以避免思维影响自身,并以同样的标准对待所有观点
  • 公正的思考者需要思维谦逊,充满勇气,懂得换位思考,正直,坚毅……

人类大脑的三个基本机制

  • 思维 - 观察力
  • 感受 - 感知力
  • 需求 - 驱动力

批判性思维的元素

  • 目的
  • 问题
  • 信息
  • 推理
  • 概念
  • 假设
  • 结果和意义
  • 观点

《麦肯锡方法》

思考问题

运用MECE原则。MECE(me-see)原则代表“相互独立,完全穷尽”,在分解问题时相互独立,完全穷尽,这是麦肯锡解决问题的必要原则

分析问题的法则

  • 80/20规则:着重关注带来更大利润的那一部分
  • 不要试图分析所有问题,找出事情的优先顺序
  • 发现关键驱动因素
  • 电梯测验:将工作量或解决方案浓缩成短时间可以解释的重点
  • 先解决一部分问题
  • 每天绘制一张图表
  • 一次只做一件事
  • 以大局为重
  • 对任何问题要有自己看法,不要“没什么概念”

解决企业问题的麦肯锡工作法

  • 组成团队
  • 处理好等级结构
  • 做研究
  • 进行走访
  • 头脑风暴

麦肯锡人的生存之道

  • 给自己找一个好的导师

  • 做好出差计划

  • 找到一个好助手

  • 每个人都会成为团队的管理者

  • 工作之外拥有更好的私生活

    ​ — 一周安排一天不要工作

    ​ — 不要把工作带回家

    ​ — 事前做好计划

设计模式浅谈

发表于 2019-07-28

一些思考

发表于 2018-11-13

高追求

千万不要停下对更高层次的追求;当一个人安于现状的时候,就表示他没有办法再进行提高了;要保持对更高层次的渴望,包括知识,生活,追求;在追求的过程中自己的能力也会慢慢得到提高;

复盘很重要

一定要每隔一段时间就对自己这段时间的工作,学习或者是生活进行总结和思考,看到自己做的好和做的不好的地方;做的好的地方思考如何保持,做的不好的地方思考如何改进;每复盘一次其实就是对自己的一次提升;

主动尝试

在完成既定目标的前提下尽可能去接触更多的知识,去尝试更多的机会;或许在这个过程中不会得到很多,但是对自身能力的广度和天花板的拓展而言是个契机;

随笔1

发表于 2018-11-08

——今天看到一句非常有韵味的句子:

——“捣麝成尘香不灭,拗莲作寸丝难绝”

——若是用粤语来念更佳

Java集合框架的理解

发表于 2018-07-01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
常用集合框架
└── Iterator接口
├── Collection接口
├── List接口
├── LinkedList类
├── ArrayList类
└── Vector类
└── Stack类
└──Set接口
├── HashSet类
└── TreeSet类
└── Map接口
├── TreeMap类
├── HashMap类 ──── ConcurrentMap类
└── HashTable类

Iterator

  • Iterator提供iterator方法用于遍历集合元素,提供了对当前集合的三种操作:判断集合中是否有下一个元素,获取下一个元素以及移除当前元素
  • fail-fast机制(快速失败机制):在实现了Iterator接口的集合类中,都会实现一种fail-fast机制,其目的是让集合在并发操作时,如果一个线程对集合类实例进行了结构性修改(remove,add,clear等操作),另一个线程在迭代时出现错误能够立即抛出异常。其实现原理是通过定义一个modCount变量记录当前集合被操作的次数,然后在每次使用itr对集合进行操作的时候调用checkForComodification方法比较expectedModCount和modCount的值是否相等,不相等的话就代表出现了脏数据,这个时候就会抛出ConcurrentModificationException错误

Collection

  • Collection接口继承了Iterator接口,在此基础上添加了一些方法,如返回集合大小,判断集合是否为空,在集合中添加元素等等

Vector

  • Vector类是可以动态增长和收缩的存储对象。Vector类继承了AbstractList类并且实现了List接口,支持随机访问,可以被克隆和序列化
    • 底层数据结构为数组,支持随机访问,可以动态扩展
    • 查询复杂度O(1),添加和删除的复杂度O(n)
    • 默认容量大小为10,默认扩容大小为原来的2倍
    • 线程安全,使用synchronized关键字来实现

Stack

  • Stack类继承了Vector类,但是对元素的访问和插入做了一定限制,只能在数组尾部添加或删除元素,这体现了一个后进先出(LIFO)的特性

ArrayList

  • ArrayList类和Vector类的构造和功能相似
    • 底层数据结构为数组,支持随机访问,可以动态扩展
    • 查询复杂度O(1),添加和删除的复杂度O(n)
    • 默认容量大小为10,默认扩容大小为原来的1.5倍
    • 线程不安全
  • ArrayList和Vector的异同
    • 底层数据结构相同
    • 默认容量相同
    • 扩容机制不同
    • 前者线程不安全,后者线程安全

LinkedList

  • LinkedList是继承了AbstractSequentialList的双向链表并且实现了Deque接口,可以被当作堆栈、队列或双向队列进行处理,可以被克隆和序列化
    • 底层数据结构为双向链表,不支持高效的随机访问,可以动态扩展
    • 查询复杂度O(n^2),查找时分两半查找,添加和删除的复杂度O(1)
    • 默认容量为0
    • 线程不安全

Hashtable

  • Hashtable类是一个key-value映射的哈希表,实现Map接口,继承Directionary类,可被克隆和序列化
    • 底层数据结构为单链表数组(Entry[]数组),每个数组元素中的单链表存放的是键值对(Entry对象)
    • 查找,添加和删除复杂度O(1)(理想状态下)
    • 默认容量大小为11,默认负载因子为0.75(到达负载因子对应的容量时进行扩容),默认扩容大小为原来的2倍加1
    • 使用拉链法解决哈希冲突(即在两个元素的哈希值相等的情况下将两个元素放在同一个位置的链表中)
    • 不能接受null键值和值
    • 线程安全

HashMap

  • 与Hashtable相似是一个key-value映射的散列表,继承AbstractMap类,实现了Map接口,可被克隆和序列化
    • 底层数据结构为单链表数组或红黑树数组
    • 查找,添加和删除复杂度O(1)(理想状态下)
    • 默认容量大小为16,默认负载因子为0.75,默认扩容大小为原来的2倍
      • 为什么要扩容为原来的2倍?因为HashMap关注中hash的计算效率问题,在取模计算时,如果模数是2的幂,那么可以直接使用位运算来得到结果,效率要高于除法。不过这会导致哈希分布不均匀的问题
    • 当单个桶(单链表数组中每一个数组位置称为一个桶)大小大于8并且当前集合中键值对总数量大于64的时候,就会将数组位置中的单链表转换成红黑树(特点是查询时间缩短为O(logn))
      • 单链表是如何转换成红黑树的?使用哈希值作为树的分支变量,如果两个哈希值不等,但指向同一个桶的话,较大的那个会插入到右子树里。如果哈希值相等,HashMap希望key值最好是实现了Comparable接口的,这样它可以按照顺序进行插入
    • 查询或者是插入的过程是先对比hashCode方法得出的hash值(根据键值对计算出来的哈希值)是否相等,相等的情况下再调用equals方法(直接对比两个对象中的值)进行对比,两者都相等的时候才说明这两个对象相等
    • 线程不安全
      • 多线程下出现的问题?在多线程情况下重新调整HashMap中个元素的值的时候会存在条件竞争的问题,会出现死循环。所以多线程环境下不建议使用HashMap,可以转而使用ConcurrentHashMap
    • 常使用String,Integer等包装类作为键
      • 为什么包装类适合作为键?因为放入Map中的对象要保证遵守equals和hashCode方法的定义规则,并且要保证对象存取过程中hash值不会变;而String等包装类是不可变的,使用final修饰,其内存地址始终指向于同一块地址
  • 在JDK1.8后对HashMap的改进有以下几处:
    • 使用红黑树进行扩展
    • hashCode值的扰动函数减少运算次数
    • 扩容为之从重新调用hash函数计算新的位置变为通过(e.hash&oldCapicity)==0来确定节点新位置是位于扩容前的角标还是之前的2倍角标位置

HashMap和Hashtable的区别

  • 继承的父类不同:HashMap继承AbstractMap类,而Hashtable继承Dictionary类
  • 对null键值支持不同,HashMap支持null键和null值,Hashtable不支持
  • HashMap线程不安全,Hashtable线程安全
  • 初始容量大小和每次扩容大小不同,HashMap默认大小是16,每次扩容容量变为16或是链表转化为红黑树;Hashtable默认大小是11,每次扩容,容量变为原来的2n+1
  • 计算hash值的方法不同,Hashtable直接使用对象的hashCode,hashCode是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值,然后再使用除留余数法来获取最终位置;因为HashMap扩容使用2倍会导致哈希分布不均匀的问题,所以HashMap会使用使用一些简单的位处理减少哈希冲突

ConcurrentHashMap

  • 由一个个Segment组成,Segment也被称为分段锁。所以ConcurrentHashMap实际上是一个Segment数组,Segment通过继承ReentrantLock来进行加锁,保证了每个Segment是线程安全的,从而实现全局的线程安全。ConcurrentHashMap中有一个concurrencyLevel变量,默认为16,就是说ConcurrentHashMap默认有16个Segment,而每一个Segment中有类似HashMap结构的单链表数组,只不过在这基础上实现了线程安全

TreeMap

  • TreeMap的内部基于红黑树实现的,线程不安全

Set

  • Set类整体依赖于Map类,即HashSet使用一个HashMap的实例实现,而TreeSet使用一个TreeMap实例实现
  • HashSet和HashMap的区别
    • 实现的接口不同,HashSet实现Set接口,HashMap实现Map接口
    • HashSet仅存储值,HashMap存储键值对
    • 增加元素使用的方法名不同,HashSet使用add方法,HashMap使用put方法
    • 计算hashcode的对象不同,HashSet使用成员对象,HashMap使用键对象
  • TreeSet是一个有序集合,它的作用是提供有序的Set集合。继承AbstractSet类,实现了NavagableSet接口,可以被克隆和序列化,支持一系列的导航方法(查找与指定目标最匹配值等)
    • TreeSet支持两种排序方式:自然排序和Comparator排序
      • 自然排序(元素具备比较性):让元素所属的类实现Comparable接口
      • 比较器排序(集合具备比较性):让集合接受一个Comparator的实现类对象

vue使用axios和qs完成向后台发出post请求

发表于 2018-06-19

Vue.js使用axios向后台发出post请求和获取数据一样,可以直接调用函数

1
2
//在需要交互的.vue文件中添加引用
import axios from 'axios';
1
2
3
4
5
6
7
8
9
10
11
12
13
//然后在methods使用post方法发出请求
methods: {
postData(){
axios.post('url', {
id: '1',
name: 'user1'
}).then((response)=>{
//do something with the response
}).catch((error)=>{
console.log(error);
})
}
}

但是有时候使用这种方法后台有可能接收不到数据,因为数据没有序列化,所以这个时候可以使用qs插件地址库对数据进行编码,将axios发送的数据格式转换为form-data格式

1
2
3
//安装axios的时候会默认安装qs
//在需要交互的.vue文件中添加引用
import qs from 'qs';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//然后在methods使用post方法发出请求
methods: {
postData(){
var data = qs.stringify({
id: '1',
name: 'user1'
});
axios.post('url', data}).then((response)=>{
//do something with the response
}).catch((error)=>{
console.log(error);
})
}
}

vue使用axios获取后台数据

发表于 2018-06-18

在使用Vue.js进行前端开发的时候,有时候需要从后台获取数据,在这里我是用的是axios的方法。

1
2
//在需要交互的.vue文件中添加引用
import axios from 'axios';
1
2
3
4
5
6
7
8
9
10
//然后在methods中使用get方法对数据进行获取
methods: {
getData(){
axios.get('url').then((response)=>{
//do something with the response
}).catch((response)=>{
console.log(response);
})
}
}

Welcome

发表于 2018-06-14

欢迎来到我的博客,这里将会分享一些我日常遇到的问题或是趣事

EdenChanIy

EdenChanIy

我们拼尽全力,过着平凡的一生

9 日志
7 标签
© 2019 EdenChanIy
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4