本系列文章记录,摘要,总结 对Elasticsearch 的系统学习,基于官方文档 Elasticsearch 2.x 版本 , 内容可能过时
文章目录
- 1. Elasticsearch 基础概念
-
- 1.1 Elasticsearch 是什么
- 1.2 Elasticsearch 功能
- 1.3 与Elasticsearch交互
- 2. Elasticsearch 安装
- 3. 简单的案例介绍
-
- 3.1 分析需求
- 3.2 插入数据
- 3.3 查询单条数据
- 3.4查询得到属性解析
- 3.5 查询全部数据
- 3.6 查询属性解析
1. Elasticsearch 基础概念
1.1 Elasticsearch 是什么
Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库,但是很复杂.
Elasticsearch 使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但它使全文检索变得简单, 通过隐藏 Lucene 的复杂性,提供一套简单一致的 RESTful API。
1.2 Elasticsearch 功能
- 全文搜索引擎
- 一个分布式的实时文档存储,每个字段 可以被索引与搜索
- 一个分布式实时分析搜索引擎
- 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
1.3 与Elasticsearch交互
交互可以选择
- Java api 交互,其中包含两种客户端 (默认9300)
-
节点客户端(Node client)
节点客户端作为一个非数据节点加入到本地集群中。换句话说,它本身不保存任何数据,但是它知道数据在集群中的哪个节点中,并且可以把请求转发到正确的节点。
-
传输客户端(Transport client)
轻量级的传输客户端可以将请求发送到远程集群。它本身不加入集群,但是它可以将请求转发到集群中的一个节点上。
-
其中集群也是通过9300 通信
-
restful API交互
一般在es搭建之后会搭建一个可视化界面,有以下选择(也可以再搜索看看有没有更好的,或者自己造一个?):
- ElasticHD
- elasticsearch-head
- dejavu
- kibana
2. Elasticsearch 安装
下载较慢 , 官方下载地址包含
当前版本是
Version: 7.7.1
, 可以使用yum , apt-get , docker , zip 等方式安装在Linux或Windows , 官方有详细的下载安装步骤
此处应该与你的Java 客户端jar包版本对应 , 并且如果需要安装kibana logstash 等也是需要版本对应
此时,你可以打开你的主机+端口 访问你的es , 如果出现es 信息则说明成功!
如果要和Java 客户端交互 需要注意9300 端口是否打开 9200 只是http端口
如果后面需要对中文分词还需要安装中文分词器插件,下载对应版本后解压到es/plugins/
3. 简单的案例介绍
首先,在es中有
文档
的概念,相当于sql中的表 ,在es中对整个文档(相当于一条记录)进行索引,排序,过滤,
而不是像sql那样针对一列建立索引,并且这里有 倒排索引 后面有详细讲解,并且使用
作为文档的序列化格式
JSON
这里从一个简单的案例介绍
文档
索引
搜索
聚合
等基础概念 :
我们受雇于 Megacorp 公司,作为 HR 部门新的 “热爱无人机” (“We love our drones!”)激励项目的一部分,我们的任务是为此创建一个员工目录。该目录应当能培养员工认同感及支持实时、高效、动态协作,因此有一些业务需求:
- 支持包含多值标签、数值、以及全文本的数据
- 检索任一员工的完整信息
- 允许结构化搜索,比如查询 30 岁以上的员工
- 允许简单的全文搜索以及较复杂的短语搜索
- 支持在匹配文档内容中高亮显示搜索片段
- 支持基于数据创建和管理分析仪表盘
3.1 分析需求
那么,首先我们应该存储
员工
数据,才能进行后续的操作,我们将
员工
以
文档
形式存储,
一个文档代表一个员工
, 存储数据到es的行为叫做
索引
(动词,索引一个文档就是存储一个文档到索引中),但,在索引一个文档前,需确定存储到哪个
索引
(名词,类似于关系数据库中的
数据库
概念)
所以
一个es集群
可以包含很
多个索引
(名词),
每个索引
(名词)可以包含很
多个类型
(类似于表),
每个类型
可以存储
多个文档
,
每个文档
又有
多个属性
所以我们应该做以下操作:
- 每个员工索引一个文档,文档包含员工所有信息
- 每个文档都是
类型employee
- 该类型位于索引
内megacorp
- 该索引保存在我们的es集群中
至此,我们应该能够分清楚每一步具体在做什么,尽管步骤有点多,但是很简单,那么我们可以通过一条语句完成:
3.2 插入数据
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
解释以下这条语句
这是cUrl 格式语句,发送put的http请求到指定
localhost:9200/megacorp/employee/1?pretty
格式,并包含请求内容
json
路径
/megacorp/employee/1
包含了:
megacorp
索引名称
employee
类型名称
1
员工的id
请求内容则包含了该名员工的信息
在我们发送请求时,没有索引es会自动创建
索引
类型
属性
再增加几条数据
PUT /megacorp/employee/2
{
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ]
}
PUT /megacorp/employee/3
{
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets",
"interests": [ "forestry" ]
}
将 HTTP 命令由 PUT 改为 GET 可以用来检索文档,同样的,可以使用 DELETE 命令来删除文档,以及使用 HEAD 指令来检查文档是否存在。如果想更新已存在的文档,只需再次 PUT 。
3.3 查询单条数据
GET /megacorp/employee/1
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
}
3.4查询得到属性解析
可以看到所属
索引
类型
id
(如果多次提交put就会覆盖,就会自动更新版本,当前是1)
版本
foud 状态标识
数据
_source
3.5 查询全部数据
GET /megacorp/employee/_search
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 1,
"hits": [
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_score": 1,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
},
{
"_index": "megacorp",
"_type": "employee",
"_id": "2",
"_score": 1,
"_source": {
"first_name": "Jane",
"last_name": "Smith",
"age": 32,
"about": "I like to collect rock albums",
"interests": [
"music"
]
}
},
{
"_index": "megacorp",
"_type": "employee",
"_id": "3",
"_score": 1,
"_source": {
"first_name": "Douglas",
"last_name": "Fir",
"age": 35,
"about": "I like to build cabinets",
"interests": [
"forestry"
]
}
}
]
}
}
3.6 查询属性解析
{
"took": 花费时间,
"timed_out": 是否查询超时,
"_shards": {
"total": 分片总数,
"successful": 分片成功数,
"failed": 分片失败数
},
"hits": {
"total": 本次搜索,返回几条结果,
"max_score": 本次搜索的所有结果中,最大的相关度分数是多少,每一条document对于search的相关度,越相关,_score分数越大,排位越靠前,
"hits": [数据]
}}
至此,简单的插入,查询已经完成,下一节我们通过查询表达式搜索