抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

啥是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的搜索功能