docker pull docker.elastic.co/elasticsearch/elasticsearch:6.2.3
调整你的docker daemon memory limit to 6gb
git clone git@git.realestate.com.au:cheng-li/elasticsearch-demo.git
安装chrome插件-postman
在postman里import collection with link - https://www.getpostman.com/collections/b1d7e094d1d4c5af79ee
搜索引擎
封装成为service并提供RESTful API
NoSQL数据库风格的存储方式
提供分布式支持
Term | Document # | Frequence | Position |
---|---|---|---|
Crazy | 1,2 | [2],[1] | [3,10],[1] |
World | 3 | [1] | [5] |
Hello | 3 | [4] | [1],[20],[55],[100] |
ES6.0之前按照elastic的官方描述,索引可以类比成关系数据库中的数据库。。。
反向索引表
类型映射
文
档
文
档
文
档
ES6.0之前, 按照elastic的官方描述,类型可以类比成关系数据库中的表,映射可以类比成表的schema
ES6.0之后, elastic官方已经修正了类型类比成数据库的说法
反向索引表
类型映射
文
档
文
档
类型映射
文
档
文
档
ELASTICSEARCH中的映射主要描述了3个信息
一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters。
POST /chathistories/messages
{
"content": "A Pretty cool guy!",
"date": "2018-04-18"
}
{
"chathistories": {
"mappings": {
"messages": {
"properties": {
"content": {
"type": "text",
"analyzer": "standard_analyzer"
}
}
}
}
}
}
Standard Analyzer
Standard Token Filter
A Pretty cool guy!"
["Pretty", "cool", "guy"]
Lower Case Filter
["pretty", "cool", "guy"]
1
2
3
4
5
可以类比成关系型数据库中的row/record/记录
Mappings
结点发现与选举
在ELASTICSEARCH中默认使用ZEN DISCOVERY作为发现模块,并提供单播及多播2种模式
当有新的结点准备就绪时,这个新结点应该可以加入到cluster并被其他结点发现。
当有结点出现故障,自动发现机制会从cluster移除这个结点并且通知其他结点不要在和这个结点通讯。
单播配置下,可以通过提供一个主机列表作为路由列表,向指定的主机发送单播请求,配置如下:
discovery.zen.ping.unicast.hosts:["IP1:PORT1","IP2:PORT2"]
Gossip算法如其名,灵感来自办公室八卦,只要一个人八卦一下,在有限的时间内所有的人都会知道该八卦的信息,这种方式也与病毒传播类似,因此Gossip有众多的别名“闲话算法”、“疫情传播算法”、“病毒感染算法”、“谣言传播算法”。
当新的结点就绪时,它会发送一个多播的ping请求到网段中,该请求只是用来通知所有能连接到节点和集群它已经准备好加入到集群中。
discovery.zen.ping.multicast.group: 224.2.2.4
discovery.zen.ping.multicast.port:54328
discovery.zen.ping.multicast.ttl:3
discovery.zen.ping.multicast.enabled:true
一般存在两个故障检测过程。第一个是主节点周期性的ping其他节点。第二就是其他节点周期的ping主节点。
分片(SHARD)是数据弥散的单位,当有新的结点加入时,SHARD会flat的弥散到各个结点
Node 1
Shard 1
Shard 2
Shard 3
Node 1
Node 2
Shard 1
Shard 3
Shard 2
Node 1
Node 2
Shard 1
Shard 2
Node 3
Shard 3
ELASTICSEARCH的冗余是通过复制分片来实现的,一个主分片可以有多分复制分片。你可以在创建索引的时候设定主分片和复制分片的数量。注意:在索引被创建后主分片的数量不可以再更改,但是复制分片的数量还可以更改。
PUT http://localhost:9200/webstore/
{
"settings": {
"index": {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
}
Node 1
P0
P1
Node 2
R0
R2
Node 3
P2
R1
Node 1
P0
R0
Node 2
R0
R2
Node 3
P2
R1
Node 1
P0
P1
Node 2
P0
R2
Node 3
P2
P1
Node 1
R0
R1
Node 2
P0
R2
Node 3
P2
P1
当你索引一个文档的时候,文档会被ELASTICSEARCH存放在单一主分片中, 然而ELASTICSEARCH如何决定应该将文档存放在哪个分片中呢?当你利用好路由功能,你可以大大加速你的检索速度,因为你不必要遍历所有的分片去检索你需要的文档。
乐观并发控制 VS 悲观并发控制
全文检索