一、关于ElasticSearch
ElasticSearch是什么
- 独立的网络上的一个或一组进程节点,可以理解为一个可独立部署的应用程序,一个中间件
- 对外提供搜索服务(http或transport协议)
- 对内就是一个搜索数据库
名词定义
- 索引=数据库
- 类型=表,es7中逐步废除类型定义
- 文档=行数据
- 关系型数据库和ES名词对比图解:
Relational database | ElasticSearch |
---|---|
Database | Index |
Table | Type |
Row | Document |
Column | Field |
Schema | Mapping |
Index | Everything is indexed |
SQL | Query DSL |
SELECT * FROM Table … | GET http://… |
UPDATE Table Set | PUT http://… |
索引
- 搜索中的数据库或表定义
- 构建文档时候的索引创建
分词
- 搜索是以词为单位做最基本的搜索单元
- 依靠分词器构建分词
- 用分词构建倒排索引
搜索引擎处理过程图解
倒排索引
- 正向索引:遍历所有document,遍历每个document下的所有字段,才能确定是否是目标记录
- 倒排索引:以词为单位,根据词能找到所有包含该词的文档,所以并不需要遍历所有文档,而只需要遍历所有的词
TF-IDF打分
- 试想根据某个词查找,查找出一堆文档,那到底是哪个匹配度更高呢,这时候就需要打分的逻辑
- TF:词频,这个document文档包含了多少个这个词,包含越多表明越相关
- DF:文档频率,包含该词的文档总数目
- IDF:DF取倒数
- 打分常用计算公式:TF * IDF
二、ElasticSearch安装
ElasticSearch
- 介绍:是一个基于Json的分布式搜索和分析引擎
- 点击这里下载
Kibana
- 介绍:对ElasticSearch进行可视化操作窗口
- 点击这里下载
三、分布式原理
分片
- 分片是依托于一个索引的,假设一个索引是倒排索引加文档的结构,当索引加文档数量超过了一台机器磁盘的上限,因此要进行一个分片处理,默认创建索引是分配一个分片,所有的文档都会在这个分片做索引
主从
- 一个主分片对应一个从分片
路由
- 主分片和从分片需要一个路由信息
- numbers_of_shards:定义一个主分片数量,用于响应写操作(也可响应读)
- numbers_of_replicas:定义索引备份分片数量,用于响应读操作
- 读请求可不经过主节点,直接发生在从节点上,若对应节点无分片则路由到有分片的节点中
举例
PUT /test
{
"settings": {
"numbers_of_shards": 1, // 表示生成1个主分片
"numbers_of_replicas": 0 // 表示生成0个从分片
}
}
搭建集群
- 启动三个节点
- 修改配置文件:config/elasticsearch.yml
cluster.name: dianping-app # 相同集群的所有节点配置一样
node.name: node-1 # 同一个集群下的每个node.name唯一
network.host: 127.0.0.1 # 当前节点启动在哪个IP上面,如果在一台机器上的话可以用端口区分
http.port: 9200 # 端口
transport.tcp.port: 9300 # 做集群之间的指令通信,三个节点之间通过对方的这个端口做集群协商以及指令传输
http.cors.enabled: true # 允许前端做跨域访问
http.cors.allow-origin: "*"
discovery.seed_hosts: ["127.0.0.1:9300", "127.0.0.1:9301", "127.0.0.1:9302"] # 用来发现对应的集群节点
cluster.initail_master_nodes: ["127.0.0.1:9300", "127.0.0.1:9301", "127.0.0.1:9302"] # 竞选主节点