内容概要

  • ES 基础介绍,重点是其中的核心概念。
  • 基础 API 实践操作。

1. 基础介绍

Elasticsearch (ES) 是一个数据库,提供了分布式的、准实时搜索和分析。

基于 Apache Lucene,可以操作结构化数据、非结构化数据、数字类型数据、地理空间数据。

数据存储使用松散结构的 JSON 文档。

主要特性

  • 轻量快速的全文搜索。
  • 安全分析和基础设施监控。
  • 支持海量规模,数千台服务器、PB级数据量。
  • 可以集成可视化数据分析工具,用于例如应用性能分析、日志监控、基础设施度量指标监控。
  • 可以用于机器学习,对数据实时进行自动化模型处理。

核心概念

  • Index 索引

关系数据库中的,存储文档。

6.0.0 版本之前,一个索引中可以存放不同类型的文档,例如 Car 和 Bike 这2种文档可以在一个索引中。

6.0.0 版本之后,不可以了,需要为每种类型的文档建立不同的索引。

  • Documents 文档

关系数据库中的

每个文档有一个唯一 _id

  • Fields 字段

关系数据库中的

  • 数据类型

1)字符串

有2种类型:textkeyword

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种类型:textkeyword

可以这样设置:

{
"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 开箱指南的更多相关文章

  1. Elasticsearch 权威指南

    Elasticsearch 权威指南 http://fuxiaopang.gitbooks.io/learnelasticsearch/content/index.html

  2. Elasticsearch 权威指南 NESTAPI地址

    Elasticsearch 权威指南:http://fuxiaopang.gitbooks.io/learnelasticsearch/content/index.html NEST:http://n ...

  3. 史上最全面的Elasticsearch使用指南

    Elasticsearch使用指南 Elasticsearch使用指南 前言 ES是什么 什么是全文检索 ES的应用场景 ES的存储结构 第一章:安装 1.下载 2.解压 3.配置 4.启动 5.查看 ...

  4. elasticsearch权威指南

    elasticsearch权威指南 https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/

  5. Elasticsearch: 权威指南(官方教程)

    <Elasticsearch 权威指南>中文版 序言 前言 基础入门 深入搜索 处理人类语言 聚合 地理位置 数据建模 管理.监控和部署

  6. 初识Elastic search—附《Elasticsearch权威指南—官方guide的译文》

    本文作为Elastic search系列的开篇之作,简要介绍其简要历史.安装及基本概念和核心模块. 简史 Elastic search基于Lucene(信息检索引擎,ES里一个index—索引,一个索 ...

  7. Elasticsearch权威指南(中文版)

    Elasticsearch权威指南(中文版) 下载地址: https://pan.baidu.com/s/1bUGJmwS2Gp0B32xUyXxCIw 扫码下面二维码关注公众号回复100010 获取 ...

  8. elasticsearch 权威指南入门阅读笔记(一)

    相关文档 esapi:https://es.xiaoleilu.com/010_Intro/10_Installing_ES.html     https://esdoc.bbossgroups.co ...

  9. Spring Data Elasticsearch 用户指南

    https://www.jianshu.com/p/27e1d583aafb 翻译自官方文档英文版,有删减. BioMed Central Development Team version 2.1.3 ...

随机推荐

  1. java 面试题之银行业务系统

    1.需求 模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. 有三种对应类型的客户:VIP客户,普通客户,快速客 ...

  2. WPF 托盘显示

    本文告诉大家如何在 WPF 实现在托盘显示,同时托盘可以右击打开菜单,双击执行指定的代码 NotifyIcon WPF 通过 Nuget 安装 Hardcodet.NotifyIcon.Wpf 可以快 ...

  3. linux /proc 接口

    无论何时一个硬件中断到达处理器, 一个内部的计数器递增, 提供了一个方法来检查设备 是否如希望地工作. 报告的中断显示在 /proc/interrupts. 下面的快照取自一个双处理 器 Pentiu ...

  4. dotnet 方法名 To 和 As 有什么不同

    在看到 dotnet 框架里面有很多方法里面用了 ToXx 和 AsXx 好像都是从某个类转换为另一个类,那么这两个方法命名有什么不同 在约定的方法命名里面,用 To 的方法表示从类 A 转为类 B ...

  5. How to parse version range

    Now we are making a solution that has to get the package reference. But the version of package refer ...

  6. springBoot从入门到源码分析

    先分享一个springBoot搭建学习项目,和springboot多数据源项目的传送门:https://github.com/1057234721/springBoot 1. SpringBoot快速 ...

  7. windows系统锁屏及修改密码项目开发经验记录

    改造windows开机.锁屏登录流程需要使用微软停供的Credential Providers工程,编译出来是dll,安装在C:\windows\system32目录下,然后注册注册表(运行工程生成的 ...

  8. Dubbo-本地Bean测试

    Dubbo本地测试API的Bean 一.建立一个测试类文件 二.测试API // 自己要测试的API public static final XxApi xxApi; 三.注入Bean static ...

  9. [Python之路] 内存管理&垃圾回收

    一.python源码 1.准备源码 下载Python源码:https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz 解压得到文件夹: 我们主要关 ...

  10. The first day of Crawler learning

    使用BeautifulSoup解析网页 Soup = BeautifulSoup(urlopen(html),'lxml') Soup为汤,html为食材,lxml为菜谱 from bs4 impor ...