持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
啥是Elasticsearch
ElasticSearch是一个高度可扩展的开源搜索引擎并使用REST API,底层是开源库 Lucene。
Elasticsearch优点
- 横向可扩展性: 作为大型分布式集群,很容易就能扩展新的服务器到ES集群中;也可运行在单机上作为轻量级搜索引擎使用。
- 更丰富的功能: 与传统关系型数据库相比,ES提供了全文检索、同义词处理、相关度排名、复杂数据分析、海量数据的近实时处理等功能。
- 高可用: 提供副本(Replica)机制,一个分片可以设置多个副本,即使在某些服务器宕机后,集群仍能正常工作。
- 开箱即用: 提供简单易用的 API,服务的搭建、部署和使用都很容易操作。
基本概念
Node与Cluster
Elasticsearch本质上是一个分布式的数据库,它可以多台服务器协同工作,运行多个多个实例。 单个实例被称为一个节点(Node),一组节点就被成为Cluster
Index
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
Document
Index里面单条的记录称为 Document(文档)。许多条Document构成了一个Index, Document使用JSON格式表示。
{
"name": "小明",
"age": 18,
"sex": "男"
}
基本操作
新建记录
不指定文档的ID
curl --location --request POST 'http://localhost:9200/blog/doc' \
--header 'Content-Type: application/json' \
--data-raw '{
"title": "java编程思想",
"price": 99.99,
"description": "本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性(深入的面向对象概念、多线程、自动项目构建、单元测试和调试等),本书都能逐步指导你轻松掌握。",
"author": "埃克尔"
}'
{
"_index": "blog",
"_type": "doc",
"_id": "jV3J-HIBNIzRDJgGMzQj",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
指定文档的ID
curl --location --request POST 'http://localhost:9200/blog/doc/1' \
--header 'Content-Type: application/json' \
--data-raw '{
"title": "java编程思想(第二版)",
"price": 109.99,
"description": "本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性(深入的面向对象概念、多线程、自动项目构建、单元测试和调试等),本书都能逐步指导你轻松掌握。",
"author": "埃克尔"
}'
{
"_index": "blog",
"_type": "doc",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
返回结果字段解释:
- _index:文档所在的索引名
- _type:文档所在的类型名
- _id:文档对应的ID
- _version:文档版本号
- _result:代表创建
- _shards: _shards表示索引操作的复制过程的信息
查询文档
存在查询ID的文档
curl --location --request GET 'http://localhost:9200/blog/doc/1'
{
"_index": "blog",
"_type": "doc",
"_id": "1",
"_version": 1,
"_seq_no": 1,
"_primary_term": 1,
"found": true,
"_source": {
"title": "java编程思想(第二版)",
"price": 109.99,
"description": "本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性(深入的面向对象概念、多线程、自动项目构建、单元测试和调试等),本书都能逐步指导你轻松掌握。",
"author": "埃克尔"
}
}
不存在查询ID的文档
curl --location --request GET 'http://localhost:9200/blog/doc/2'
{
"_index": "blog",
"_type": "doc",
"_id": "2",
"found": false
}
返回结果字段解释
- found:代表是否查询到了
- _source:如果查询到了,该字段代表文档的内容
更改文档
curl --location --request PUT 'http://localhost:9200/blog/doc/1' \
--header 'Content-Type: application/json' \
--data-raw '{
"title": "java编程思想(第二版)",
"price": 109.99,
"description": "从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作。本书共22章,包括操作符、控制执行流程、访问权限控制、复用类、多态、接口、通过异常处理错误、字符串、泛型、数组、容器深入研究、JavaI/O系统、枚举类型、并发以及图形化用户界面等内容。这些丰富的内容,包含了Java语言基础语法以及高级特性,适合各个层次的Java程序员阅读,同时也是高等院校讲授面向对象程序设计语言以及Java语言的绝佳教材和参考书。",
"author": "埃克尔"
}'
{
"_index": "blog",
"_type": "doc",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
从返回结果我们可以看到,result字段变成updated,version也从1变成2了。这时候我们再来查询一下ID为1的文档
curl --location --request GET 'http://localhost:9200/blog/doc/1'
{
"_index": "blog",
"_type": "doc",
"_id": "1",
"_version": 2,
"_seq_no": 2,
"_primary_term": 1,
"found": true,
"_source": {
"title": "java编程思想(第二版)",
"price": 109.99,
"description": "从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作。本书共22章,包括操作符、控制执行流程、访问权限控制、复用类、多态、接口、通过异常处理错误、字符串、泛型、数组、容器深入研究、JavaI/O系统、枚举类型、并发以及图形化用户界面等内容。这些丰富的内容,包含了Java语言基础语法以及高级特性,适合各个层次的Java程序员阅读,同时也是高等院校讲授面向对象程序设计语言以及Java语言的绝佳教材和参考书。",
"author": "埃克尔"
}
}
可以看到文档的description里的内容已经更改了。
删除文档
curl --location --request DELETE 'http://localhost:9200/blog/doc/1'
{
"_index": "blog",
"_type": "doc",
"_id": "1",
"_version": 3,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
从result字段可以看到该文档已被删除了