啥是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格式表示。
1 2 3 4 5
| { "name": "小明", "age": 18, "sex": "男" }
|
基本操作
新建记录
不指定文档的ID
1 2 3 4 5 6 7 8
| 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": "埃克尔" }'
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "_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
1 2 3 4 5 6 7 8
| 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": "埃克尔" }'
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "_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的文档
1
| curl --location --request GET 'http://localhost:9200/blog/doc/1'
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| { "_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的文档
1
| curl --location --request GET 'http://localhost:9200/blog/doc/2'
|
1 2 3 4 5 6
| { "_index": "blog", "_type": "doc", "_id": "2", "found": false }
|
返回结果字段解释
- found:代表是否查询到了
- _source:如果查询到了,该字段代表文档的内容
更改文档
1 2 3 4 5 6 7 8
| 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": "埃克尔" }'
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "_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的文档
1
| curl --location --request GET 'http://localhost:9200/blog/doc/1'
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| { "_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里的内容已经更改了。
删除文档
1
| curl --location --request DELETE 'http://localhost:9200/blog/doc/1'
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "_index": "blog", "_type": "doc", "_id": "1", "_version": 3, "result": "deleted", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 3, "_primary_term": 1 }
|
从result字段可以看到该文档已被删除了
下一个
Elasticsearch的搜索功能