什么是Elasticsearch?
Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。
Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确地形容:
- 一个分布式的实时文档存储,每个字段可以被索引与搜索;
- 一个分布式实时分析搜索引擎;
- 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。
一、安装
1、下载地址
elasticsearch下载地址:https://www.elastic.co/cn/downloads/elasticsearch
2、启动
elasticsearch-7.15.1\bin\elasticsearch.bat
注:需要jdk8环境
3、检查是否启动成功
{
"name" : "DESKTOP-5M45G7D",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "YlJXQXUrS9WLtmBhRHN3hA",
"version" : {
"number" : "7.15.1",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "83c34f456ae29d60e94d886e455e6a3409bba9ed",
"build_date" : "2021-10-07T21:56:19.031608185Z",
"build_snapshot" : false,
"lucene_version" : "8.9.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
注:name:node名称
cluster_name:集群名称
version:版本相关信息
4、elasticsearch.yml
修改集群名称查找cluster.name
默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以修改 Elastic 安装目录的config/elasticsearch.yml
文件,去掉network.host
的注释,将它的值改成0.0.0.0
,然后重新启动 Elastic。
network.host: 0.0.0.0
上面代码中,设成0.0.0.0
让任何人都可以访问。线上服务不要这样设置,要设成具体的 IP。
5、使用kibana的开发界面去操作elasticsearch
启动kibana的方法:kibana-7.15.1-windows-x86_64\bin\kibana.bat
访问地址:http://localhost:5601/app/dev_tools#/console
二、基本概念
2.1 Node 与 Cluster
Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
2.2 Index
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
下面的命令可以查看当前节点的所有 Index。
GET /_cat/indices?v
2.3 Document
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
Document 使用 JSON 格式表示,下面是一个例子。
{
"user": "张",
"title": "工程师",
"desc": "数据库"
}
同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。
2.4 Type
Document 可以分组,比如weather
这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。
不同的 Type 应该有相似的结构(schema),举例来说,id
字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如products
和logs
)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。
下面的命令可以列出每个 Index 所包含的 Type。
GET /_mapping?pretty=true
根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。
6、命令
一个Elasticsearch请求和任何 HTTP 请求一样,都由若干相同的部件组成:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
返回的数据格式为JSON,因为Elasticsearch中的文档以JSON格式储存。其中,被 < >
标记的部件:
部件 | 说明 |
---|---|
VERB | 适当的 HTTP 方法 或 谓词 : GET 、 POST 、 PUT 、 HEAD 或者 DELETE 。 |
PROTOCOL |
http 或者 https (如果你在 Elasticsearch 前面有一个 https 代理) |
HOST | Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。 |
PORT | 运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。 |
PATH | API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。 |
QUERY_STRING | 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读) |
BODY | 一个 JSON 格式的请求体 (如果请求需要的话) |
对于HTTP方法,它们的具体作用为:
HTTP方法 | 说明 |
---|---|
GET | 获取请求对象的当前状态 |
POST | 改变对象的当前状态 |
PUT | 创建一个对象 |
DELETE | 销毁对象 |
HEAD | 请求获取对象的基础信息 |
(1)、检查是否健康 :GET /_cat/health
green:活跃状态
(2)、插入数据
首先创建index为test, 创建type为event, 插入id为1的第一条数据,只需运行下面命令就行:
PUT /test/event/1
{
"host": "test",
"title": "Elasticsearch",
"description": "Elasticsearch",
"attendees": ["Daveee"],
"date": "2021-11-10",
"reviews": 3
}
(3)、删除数据
DELETE /test/event/5 删除id为5的数据
如果想删除整个event类型,可输入命令:
DELETE /test/event
如果想删除整个test索引,可输入命令:
DELETE /test
(4)、修改数据
修改数据的命令为POST
修改 id为1中的host字段
POST /test/event/1/_update
{
"doc": {"host": "test"}
}
(5)、查询
查询数据的命令为GET,查询命令也是Elasticsearch最为重要的功能之一。比如我们想查询test中event里面id为1的数据,运行命令如下:
GET /test/event/1
如果想要搜索test中event里面所有的文档,运行命令如下:
GET /test/_search
当然,Elasticsearch 提供更加丰富灵活的查询语言叫做 查询表达式 , 它支持构建更加复杂和健壮的查询。利用查询表达式,我们可以检索出conference中event里面所有host为123的文档,命令如下:
match :只要含有其中一个词就可以 match_phrase:严格含有所有词
GET /test/event/_search
{
"query" : {
"match" : {
"host" : "123"
}
}
}
Elastic 默认一次返回10条结果,可以通过size
字段改变这个设置。
GET /test/event/_search
{
"query" : { "match" : { "desc" : "管理" }},
"size": 1
}
上面代码指定,每次只返回一条结果。
还可以通过from
字段,指定位移。
GET /test/event/_search
{
"query" : { "match" : { "desc" : "管理" }},
"from": 1,
"size": 1
}
上面代码指定,从位置1开始(默认是从位置0开始),只返回一条结果。