ElasticSearch入门学习笔记

本文介绍了Elasticsearch的基本概念、应用案例、学习大纲和入门步骤,包括环境准备、RESTful和JSON、Postman客户端工具的使用。详细讲解了倒排索引、HTTP操作索引和文档的创建、查询、修改和删除,以及条件查询、分页、排序、全文检索、高亮查询和聚合查询等操作。同时,还阐述了映射数据的设置和查询,展示了如何在实践中应用Elasticsearch进行全文搜索和数据分析。
摘要由CSDN通过智能技术生成

ElasticSearch是什么

The ElasticSearch Stack, 包括Elasticsearch、Kibana、Beats和Logstash(也称为ELK Stack). 能够安全可靠的获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。

ElasticSearch,简称ES,ES是一个开源的高扩展的分布式全文搜索引擎,是整个ElasticStack技术栈的核心。

它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

elastic
英 [ɪˈlæstɪk] 美 [ɪˈlæstɪk]
n. 橡皮圈(或带);松紧带
adj. 橡皮圈(或带)的;有弹性的;有弹力的;灵活的;可改变的;可伸缩的

全文搜索引擎

Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。

一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段。进行全文检索需要扫描整个表,如果数据量大的话即使对 SQL 的语法优化,也收效甚微。建立了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新构建索引。

基于以上原因可以分析得出,在一些生产环境中,使用常规的搜索方式,性能是非常差的:

  • 搜索的数据对象是大量的非结构化的文本数据。
  • 文件记录量达到数十万或数百万个甚至更多。
  • 支持大量基于交互式文本的查询。
  • 需求非常灵活的全文搜索查询。
  • 对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可以满足。
  • 对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。为了解决结构化数据搜索和非结构化数据搜索性能问题,我们就需要专业,健壮,强大的全文搜索引擎 。

这里说到的全文搜索引擎指的是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

Elasticsearch 应用案例

  • GitHub: 2013 年初,抛弃了 Solr,采取 Elasticsearch 来做 PB 级的搜索。 “GitHub 使用Elasticsearch 搜索 20TB 的数据,包括 13 亿文件和 1300 亿行代码”。
  • 维基百科:启动以 Elasticsearch 为基础的核心搜索架构
  • 百度:目前广泛使用 Elasticsearch 作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部 20 多个业务线(包括云分析、网盟、预测、文库、直达号、钱包、 风控等),单集群最大 100 台机器, 200 个 ES 节点,每天导入 30TB+数据。
  • 新浪:使用 Elasticsearch 分析处理 32 亿条实时日志。
  • 阿里:使用 Elasticsearch 构建日志采集和分析体系。
  • Stack Overflow:解决 Bug 问题的网站,全英文,编程人员交流的网站。

学习大纲

  • 第1章 Elasticsearch概述
  • 第2章 Elasticsearch入门
  • 第3章 Elasticsearch环境
  • 第4章 Elasticsearch进阶
  • 第5章 Elasticsearch集成
  • 第6章 Elasticsearch优化
  • 第7章 Elasticsearch面试题

入门环境准备

Elasticsearch-7.12.1

Windows版的Elasticsearch压缩包,解压即安装完毕,解压后的Elasticsearch的目录结构如下:

目录 含义
bin 可执行的脚本目录
config 配置目录
jdk 内置jdk目录
lib 类库
logs 日志目录
modules 模块目录
plugins 插件目录

解压后,进入bin文件目录,点击elasticsearch.bat文件启动ES服务, 或者将加压后的bin所在目录加入系统环境变量,直接在cmd中输入elasticsearch.bat直接运行

注意:9300端口为Elasticsearch集群间组件的通信端口,9200端口为浏览器访问的http协议RESTful端口

打开浏览器,输入网址:http://localhost:9200,返回结果如下即正常

{
"name": "DESKTOP-DVSRSDT",
"cluster_name": "elasticsearch",
"cluster_uuid": "8-qGqNrUR-musJs5aYr-xA",
"version": {
"number": "7.12.1",
"build_flavor": "default",
"build_type": "zip",
"build_hash": "3186837139b9c6b6d23c3200870651f10d3343b7",
"build_date": "2021-04-20T20:56:39.040728659Z",
"build_snapshot": false,
"lucene_version": "8.8.0",
"minimum_wire_compatibility_version": "6.8.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Know, for Search"
}

入门-RESTful and JSON

REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。 Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。

在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI(Universal Resource Identifier) 得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、 PUT、 POST 和DELETE。

在 REST 样式的 Web 服务中,每个资源都有一个地址。资源本身都是方法调用的目 标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括 HTTP GET、 POST、PUT、 DELETE,还可能包括 HEAD 和 OPTIONS。简单的理解就是,如果想要访问互联网上的资源,就必须向资源所在的服务器发出请求,请求体中必须包含资源的网络路径, 以及对资源进行的操作(增删改查)。

REST 样式的 Web 服务若有返回结果,大多数以JSON字符串形式返回。

入门-Postman客户端工具

如果直接通过浏览器向 Elasticsearch 服务器发请求,那么需要在发送的请求中包含 HTTP 标准的方法,而 HTTP 的大部分特性且仅支持 GET 和 POST 方法。所以为了能方便地进行客户端的访问,可以使用 Postman 软件Postman 是一款强大的网页调试工具,提供功能强大的 Web API 和 HTTP 请求调试。

软件功能强大,界面简洁明晰、操作方便快捷,设计得很人性化。 Postman 中文版能够发送任何类型的 HTTP 请求 (GET, HEAD, POST, PUT, DELETE…),不仅能够表单提交,且可以附带任意类型请求体。

入门-倒排索引

  • 正排索引(传统)
id content
1001 my name is zhangsan
1002 my name is lisi
  • 倒排索引
keyword id
name 1001,1002
zhang 1001

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档。为了方便理解,将Elasticsearch里存储文档数据和关系型数据库MySQL存储数据的概念进行类比

Elasticsearch Index(索引) Type(类型) Document(文档) Fields(字段)
MySQL Database(数据库) Table(表) Row(行) Column(列)

ES里的Index可以看做一个库,而Types相当于表,Documents相当于表的行,这里的Types概念已经逐渐被弱化, Elasticsearch6.X中,一个index下已经只能包含一个type,Elasticsearch7.X中,Type的概念已经被删除了

入门-HTTP-索引-创建

对比关系型数据库,创建索引就等同于创建数据库。 在Postman中,向ES服务器发PUT请求:http://127.0.0.1:9200/shop 请求后,服务器返回响应:

{
    "acknowledged": true,   //响应结果
    "shards_acknowledged": true,    //分片结果
    "index": "shop" //索引名
}

后台日志

[o.e.c.m.MetadataCreateIndexService] [DESKTOP-DVSRSDT] [shop] creating index, cause [api], templates [], shards [1]/[1]

如果重复发PUT请求:http://127.0.0.1:9200/shop添加索引,会返回错误信息:

{
    "error": {
        "root_cause": [
            {
                "type": "resource_already_exists_exception",
                "reason": "index [shop/8OSZNjACTz2Q7MhcwjEkhw] already exists",
                "index_uuid": "8OSZNjACTz2Q7MhcwjEkhw",
                "index": "shop"
            }
        ],
        "type": "resource_already_exists_exception",
        "reason": "index [shop/8OSZNjACTz2Q7MhcwjEkhw] already exists",
        "index_uuid": "8OSZNjACTz2Q7MhcwjEkhw",
        "index": "shop"
    },
    "status": 400
}

入门-HTTP-索引-查询&删除

查看所有索引

在Postman中,向ES服务器发送GET请求:http://127.0.0.1:9200/_cat/indices?v 这里请求路径中的_cat表示查看的意思,indices表示索引,所以整体含义就是查看当前ES服务器中的所有索引, 就好像MySQL中的show tables的感觉,服务器响应结果如下:

health status index                           uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .kibana_7.12.1_001              BLhrsk0fQayC7_U03ozd9Q   1   0        207            1        3mb            3mb
yellow open   megacorp                        W_XNzyF3R2e7iTY5h_jS-A   1   1          1            0        6kb            6kb
yellow open   shop                            8OSZNjACTz2Q7MhcwjEkhw   1   1          0            0       208b           208b
...
表头 含义
health 当前服务器健康状态:green(集群完整)yellow(单点正常,集群不完整)red(单点不正常)
status 索引打开、关闭状态
index 索引名
uuid 索引统一编号
pri 主分片数量
rep 副本数量
docs.count 可用文档数量
docs.deleted 文档删除状态(逻辑删除)
store.size 主分片和副分片整体占空间大小
pri.store.size 主分片占空间大小

查看单个索引

  • 在Postman中,向ES服务器发GET请求:http://127.0.0.1:9200/shop/

返回结果如下:

{
    "shop": {   //索引名
        "aliases": {},  //别名
        "mappings": {}, //映射
        "settings": {   //设置
            "index": {  //设置-索引
                "routing": {    
                    "allocation": {
                        "include": {
                            "_tier_preference": "data_content"
                        }
                    }
                },
                "number_of_shards": "1",    //设置-索引-主分片数量
                "provided_name": "shop",    //设置-索引-名称
                "creation_date": "1621560874965",   //设置-索引-创建时间
                "number_of_replicas": "1",  //设置-索引-副分片数量
                "uuid": "8OSZNjACTz2Q7MhcwjEkhw",   //设置-索引-唯一标识
                "version": {    //设置-索引-版本
                    "created": "7120199"
                }
            }
        }
    }
}

删除索引

  • 在Postman中,向ES服务器发送DELETE请求:http://127.0.0.1:9200/shop

响应结果如下:

{
    "acknowledged": true    //响应结果
}

入门-HTTP-文档-创建

  • 假设shop索引已经创建好,接下来创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的格式为JSON格式
  • 在Postman中,向ES服务器发送POST请求:http://127.0.0.1:9200/shop/_doc

发送的json数据为:

{
    "title":"小米手机",
    "category":"小米",
    "images":"http://www.gulixueyuan.com/xm.jpg",
    "price":3999.00
}
  • 注意,此处发送请求的方式必须为POST,不能是PUT,否则会发生错误。 响应结果如下:
{
    "_index": "shop",   //索引
    "_type": "_doc",    //类型-文档
    "_id": "lljHjHkB-4BNhCS74TCp",  //唯一标识 可以类比为Mysql中的主键,随机生成
    "_version": 1,  //版本
    "result": "created",    //结果 这里的created表示创建成功
    "_shards": {
        "total": 2, //分片总数
        "successful": 1,    //分片成功
        "failed": 0 //分片失败
    },
    "_seq_no": 0,   
    "_primary_term": 2
}
  • 上面数据创建成功后,由于没有指定数据唯一性标识(ID),默认情况下,ES服务器会随机生成一个
  • 如果想要自定义唯一性标识,需要在创建时指定:http://127.0.0.1:9200/shop/_doc/1

请求体json内容为:

{
    "title":"小米手机",
    "category":"小米",
    "images":"http://www.gulixueyuan.com/xm.jpg",
    "price":3999.00
}

返回结果如下:

{
    "_index": "shop",
    "_type": "_doc",
    "_id": "1",     //自定义了唯一性标识
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 1,
    "_primary_term": 2
}
  • 此处需注意:如果增加数据是明确了数据的主键,那么请求方式也可以为PUT

入门-HTTP-查询-主键查询 & 全查询

  • 查看文档时,需要指明文档的唯一性标识,类似于mysql中数据的主键查询
  • 在Postman中,向ES服务器发送GET请求:http://127.0.0.1:9200/shop/_doc/1

返回结果如下:

{
    "_index": "shop",
    "_type": "_doc",
    "_id": "1",
    "_version": 1,
    "_seq_no": 1,
    "_primary_term": 2,
    "found": true,
    "_source": {
        "title": "小米手机",
        "category": "小米",
        "images": "http://www.gulixueyuan.com/xm.jpg",
        "price": 3999.00
    }
}
  • 查找不存在的内容,向ES服务器发送GET请求:http://127.0.0.1:9200/shop/_doc/1001

返回结果如下:

{
    "_index": "shop",
    "_type": "_doc",
    "_id": "1001",
    "found": false
}
  • 查看索引下所有数据,向ES服务器发GET请求:http://127.0.0.1:9200/shop/_doc/_search

返回结果如下:

{
    "took": 91,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 2,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "shop",
                "_type": "_doc",
                "_id": "lljHjHkB-4BNhCS74TCp",
                "_score": 1.0,
                "_source": {
                    "title": "小米手机",
                    "category": "小米",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 3999.00
                }
            },
            {
                "_index": "shop",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.0,
                "_source": {
                    "title": "小米手机",
                    "category": "小米",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 3999.00
                }
            }
        ]
    }
}

入门-HTTP-全量修改 & 局部修改 & 删除

全量修改

  • 和新增文档一样,输入相同的URL地址请求,如果请求体变化,会将原有的数据内容覆盖
  • 在Postman中,向ES服务器发POST请求:http://127.0.0.1:9200/shop/_doc/1

请求体JSON内容为:

{
    "title":"华为手机",
    "category":"华为",
    "images":"http://www.gulixueyuan.com/hw.jpg",
    "price":1999.00
}

修改成功后,服务器响应结果:

{
    "_index": "shop",
    "_type": "_doc",
    "_id": "1",
    "_version": 2,
    "result": "updated",    // updated 表示数据被更新了
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 2,
    "_primary_term": 2
}

局部修改

  • 修改数据时,也可以只修改某一条数据的局部信息
  • 在Postman中,向ES服务器发POST请求:http://127.0.0.1:9200/shop/_update/1

请求体JSON内容为:

{
    "doc":{
        "title":"小米手机",
        "category":"小米"
    }
}

返回结果如下:

{
    "_index": "shop",
    "_type": "_doc",
    "_id": "1",
    "_version": 3,
    "result": "updated",    // updated 表示数据被更新
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 3,
    "_primary_term": 2
}
  • 在Postman中,向ES服务器发GET请求:http://127.0.0.1:9200/shop/_doc/1

查询修改内容如下:

{
    "_index": "shop",
    "_type": "_doc",
    "_id": "1",
    "_version": 3,
    "_seq_no": 3,
    "_primary_term": 2,
    "found": true,
    "_source": {
        "title": "小米手机",
        "category": "小米",
        "images": "http://www.gulixueyuan.com/hw.jpg",
        "price": 1999.0
    }
}

删除

  • 删除一个文档不会立即从磁盘上移除,它只是被标识成已删除(逻辑删除)
  • 在Postman中,向ES服务器发DELETE请求:http://127.0.0.1:9200/shop/_doc/1

响应结果:

{
    "_index": "shop",
    "_type": "_doc",
    "_id": "1",
    "_version": 4,
    "result": "deleted",    //deleted 表示删除成功
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 4,
    "_primary_term": 2
}
  • 在Postman中,向ES服务器发GET请求:http://127.0.0.1:9200/shop/_doc/1

查看是否删除成功:

{
    "_index": "shop",
    "_type": "_doc",
    "_id": "1",
    "found": false
}

入门-HTTP-条件查询 & 分页查询 & 查询排序

条件查询

  • 假设有以下文档内容,在Postman中,向ES服务器发GET请求:http://127.0.0.1:9200/shop/_doc/_search
{
    "took": 858,
    "timed_out": false,
    "_shards": {
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值