一、关于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,
"numbers_of_replicas": 0
}
}
搭建集群
- 启动三个节点
- 修改配置文件:config/elasticsearch.yml
cluster.name: dianping-app
node.name: node-1
network.host: 127.0.0.1
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"]