内容简介:Elasticsearch (ES) 是一个数据库,提供了分布式的、准实时搜索和分析。基于 Apache Lucene,可以操作结构化数据、非结构化数据、数字类型数据、地理空间数据。数据存储使用松散结构的 JSON 文档。
内容概要
-
ES 基础介绍,重点是其中的核心概念。
-
基础 API 实践操作。
1. 基础介绍
Elasticsearch (ES) 是一个数据库,提供了分布式的、准实时搜索和分析。
基于 Apache Lucene,可以操作结构化数据、非结构化数据、数字类型数据、地理空间数据。
数据存储使用松散结构的 JSON 文档。
主要特性
-
轻量快速的全文搜索。
-
安全分析和基础设施监控。
-
支持海量规模,数千台服务器、PB级数据量。
-
可以集成可视化数据分析工具,用于例如应用性能分析、日志监控、基础设施度量指标监控。
-
可以用于机器学习,对数据实时进行自动化模型处理。
核心概念
-
Index 索引
关系数据库中的 表 ,存储文档。
6.0.0 版本之前,一个索引中可以存放不同类型的文档,例如 Car 和 Bike 这2种文档可以在一个索引中。
6.0.0 版本之后,不可以了,需要为每种类型的文档建立不同的索引。
-
Documents 文档
关系数据库中的 行 。
每个文档有一个唯一 _id 。
-
Fields 字段
关系数据库中的 列 。
-
数据类型
1)字符串
有2种类型: text 和 keyword 。
text
用户存储产品描述、文章内容之类的文本,可以根据关键字在其中查找。
ES 会把内容解析成一个字符串列表,然后创建倒排索引,描述每个单词都在哪些文档中出现了。
例如一个文档有一个字段 “ Description ”,值为 “This phone has dual sim capability”。
这个值会被解析为一个列表:
[“this”, “phone”, “has”, “dual”, “sim”, “capability”]
倒排索引中,会指出每个词所在的文档列表,如:
“this” -> doc_1,doc_3
Keyword
用于存储用户名、邮件地址、邮编这类的明确的内容。
这类内容不会被分割解析,适用于精确匹配。
2)数字
存储例如标识码、百分比、电话号等。
支持: long, integer, short, byte, double, float 。
3)日期
形式包括:“2015/01/01 12:10:30” 此类的字符串、微秒级 long 型数字、秒级 integer 型数字。
内部使用 UTC long 型存储。
4)布尔
5)IP
6)嵌入式
一个属性可以是一个 JSON 数组。
例如:
{
"name":"ABC United",
"homeGround":"Old Trafford",
"players":[
{
"firstName":"James",
"lastName":"Cohen",
"position":"Goal Keeper"
},
{
"firstName":"Paul",
"lastName":"Pogba",
"position":"Midfielder"
}
]
}
对于嵌入类型,每个数组对象都会被作为一个隐藏文档进行索引。
7)多类型
例如有一个字段 “ student_name ”,我们希望可以通过部分匹配的方式进行查找,也希望通过完全匹配的方式查找。
这就相当于同时有2种类型: text 和 keyword 。
可以这样设置:
{
"student_name":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword"
}
}
}
}
-
Mapping
用于定义一个索引的 schema。
定义索引中有哪些字段、字段类型,配置类型相关的元数据。
-
Setting
通过 Setting 可以自定义一些索引的行为,还允许我们自定义分析器和标准化器,以分析索引的不同文本字段。
重要的 Setting 例如:
1) number_of_shards :定义索引分片数量,默认为 1。
2) number_of_replicas :定义分片的副本数量,默认 1。
3) refresh_interval :用于指定文档索引的时间与可供搜索的时间之间的间隔,默认 1秒。
-
Shard 分片
一个分片是一个 Lucene 实例,是一个被 ES 自动管理的工作单元。
我们只需要指定分片及其副本的数量,无需对分片进行操作。
ES 自动在所有节点中分布所有分片,当节点故障时,会把分片移到其他节点,当有新节点添加进来时,也会自动把一些分片移过来。
-
Replicas 副本
主分片的拷贝,副本的作用:
1)当主分片故障后,其副本可以提升为主分片。
2)主分片及其副本都可以处理查询请求,可以提升性能。
-
Aliases 别名
用于指定索引或索引集的替代名称。
当我们想从多个索引中获取文档时非常有用。
-
Template 模板
用户对多个索引指定通用的 mapping 和 Setting。
每当创建与模板中定义的特定模式匹配的新索引时,模板将应用于该索引。
创建索引时特别定义的任何 mapping/Setting 都将优先于模板中的定义。
2. API 操作
测试环境搭建
使用的 ES 版本为 7.5.1 。
下面使用 docker 启动一个单节点环境:
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.5.1
测试:
$ curl -X GET "localhost:9200/_cat/nodes?v&pretty"
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
172.17.0.2 7 97 2 0.96 0.61 0.25 dilm * 245e340eba97
$ curl localhost:9200
{
"name" : "245e340eba97",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "mq_bxY5zTjCpmJU0xOLSbA",
"version" : {
"number" : "7.5.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96",
"build_date" : "2019-12-16T22:57:37.835892Z",
"build_snapshot" : false,
"lucene_version" : "8.3.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
参考文档:
https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docker.html
实践操作
-
创建索引
curl -X PUT "localhost:9200/traveler?pretty" -H 'Content-Type: application/json' -d'
{
"settings":{
"number_of_shards":5,
"number_of_replicas":2
},
"mappings":{
"properties":{
"name":{
"type":"keyword"
},
"age":{
"type":"integer"
},
"background":{
"type":"text"
},
"nationality":{
"type":"keyword"
}
}
}
}
'
-
插入文档
curl -X PUT "localhost:9200/traveler/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name":"John Doe",
"age":"23",
"background":"Born and brought up in California. Engineer by profession. Loves to cook",
"nationality":"British"
}
'
-
读取文档
curl -X GET "localhost:9200/traveler/_doc/1?pretty"
-
删除文档
curl -X DELETE "localhost:9200/traveler/_doc/1?pretty"
-
删除索引
curl -X DELETE "localhost:9200/traveler?pretty"
-
所有索引列表
curl -X GET "localhost:9200/_cat/indices"
-
查看集群健康情况
curl -X GET "localhost:9200/_cat/health?v"
-
查看某个索引的信息
# mapping + setting
curl -X GET "localhost:9200/traveler?pretty"
# mapping
curl -X GET "localhost:9200/traveler/_mapping?pretty"
# setting
curl -X GET "localhost:9200/traveler/_settings?pretty"
-
为索引设置别名
curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
"actions":[
{
"add":{
"index":"traveler",
"alias":"read_alias"
}
}
]
}
'
-
获取索引中的所有文档
curl -X GET "localhost:9200/traveler/_search?pretty"
结果中的关键项:
took- 此次查询耗时,毫秒。
timed_out- 查询是否超时。
_shards- 查询了分片的情况,如一共查询了几个分片、成功了几个。
hits- 查询结果。
hits.total- 结果文档数。
hits.hits- 结果数组,默认只显示前10个文档。
hits.max_score- 匹配度最高的文档的分值。
hits.hits._score- 此文档匹配度分值。
-
获取所有中的文档总数
curl -X GET "localhost:9200/traveler/_count?pretty"
-
匹配查询
curl -X GET "localhost:9200/traveler/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query":{
"match":{
"background":"brought up California Loves cook"
}
}
}
'
匹配条件是 "background",其值会被处理为数组:[“brought”, “up”, “california”, “loves”, “cook”]。
只要其中的某一个与文档中的 "background" 值相匹配,文档就会被返回。
-
term 查询
curl -X GET "localhost:9200/traveler/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query":{
"term":{
"name":{
"value":"John Doe"
}
}
}
}
'
这用于获取在提供的字段中包含确切术语的文档。
适用于 keyword, numeric, date, boolean 类型的字段。
-
terms 查询
curl -X GET "localhost:9200/traveler/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query":{
"terms":{
"name":[
"John Doe",
"Jack Ripper",
"Buzz Aldrin"
]
}
}
}
'
类似 IN 查询,匹配一个或多个。
-
前缀匹配查询
curl -X GET "localhost:9200/traveler/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query":{
"prefix":{
"name":"Joh"
}
}
}
'
-
正则查询
curl -X GET "localhost:9200/traveler/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query":{
"regexp":{
"name":{
"value":"J.*e"
}
}
}
}
'
-
单次多查询
在一个请求中执行多个查询操作。
curl -X GET "localhost:9200/_msearch?pretty" -H 'Content-Type: application/x-ndjson' -d'
{"index":"traveler"}
{"query":{"terms":{"name":["John Doe","Jack Ripper","Barack Obama"]}}}
{}
{"query":{"prefix":{"name":"Buzz"}}}
{"index":"traveler"}
{"query":{"match_all":{}}}
'
推荐阅读:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Elasticsearch 开箱指南
- 苹果的 AR 新工具 RealityComposer 开箱体验及操作指南
- Java 14 开箱,它真香香香香
- Java 14 开箱,它真香香香香
- 开箱即用的 WebRTC 开发环境
- 【开箱即食】命令行替你写表单
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Rationality for Mortals
Gerd Gigerenzer / Oxford University Press, USA / 2008-05-02 / USD 65.00
Gerd Gigerenzer's influential work examines the rationality of individuals not from the perspective of logic or probability, but from the point of view of adaptation to the real world of human behavio......一起来看看 《Rationality for Mortals》 这本书的介绍吧!