ElasticSearch

  • Elasticsearch(ES)是一个基于 Lucene 构建的开源、分布式、RESTful 接口的全文搜索引擎
  • Elasticsearch 还是一个分布式文档数据库 ,其中每个字段均可被索引,而且每个字段的数据均可被搜索,ES能够横向扩展至数以百计的服务器存储以及处理PB级的数据。可以在极短的时间内存储、搜索和分析大量的数据。
  • 通常作为具有复杂搜索场景情况下的核心发动机。

Elasticsearch概述

分类

  • 结构化数据(关系型数据库,比如 mysql,表结构,索引,方便管理和查询,难扩展)
  • 非结构化数据(比如二维表,视频,图片,服务器日志,报表等。存储和查询难度大,一般保存在 nosql 中,mongodb、redis、hbase 等,用kv结构保存)
  • 半结构化数据(数据的结构和内容混在一起,没有明显区分,xml/html等,这样的数据一般也保存在mongodb,redis,hbase等。缺点是查询内容不容易)

es数据存储

  • es数据存储用的 json 格式(JavaScript object notation)
  • json字符串:网络中传递的字符串的格式符合 json 格式。

URI

http://192.168.172.101:9200/test/test.txt

请求方法

GET,POST,PUT,DELETE,HEAD

是Elastic Stack的核心

Elaticsearch 是一个分布式、restful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 elastic stack 的核心,它集中存储数据,帮助发现意料之外的情况。

The Elastic Stack, 包括 Elasticsearch、Kibana、Beats 和 Logstash(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。
Elaticsearch,简称为ES,ES是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

全文搜索引擎

全文搜索引擎(Full-Text Search Engine)是一种能够在大量文本数据中快速查找和检索相关内容的系统 。它通过将文档(如网页、文章、数据库记录等)中的文本内容进行索引和分析,允许用户在其中进行高效的查询和检索。其核心目的是提供对大规模文本数据的快速、准确的查询能力。

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

工作原理

计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

Elasticsearch 与 Solr

  • 与 Solr 相比,Elasticsearch 易于安装且非常轻巧 。但是,如果 Elasticsearch 管理不当,这种易于部署和使用可能会成为一个问题。基于JSON的配置很简单,但如果要为文件中的每个配置指定注释,它不适合。总的来说,如果应用使用的是JSON,那么 Elasticsearch 是一个更好的选择。否则,请使用 Solr,因为它的 schema.xmlsolrconfig.xml 都有很好的文档记录。

  • Solr 拥有更大,更成熟的用户,开发者和贡献者社区。ES虽拥有的规模较小但活跃的用户社区以及不断增长的贡献者社区。Solr 贡献者和提交者来自许多不同的组织,而 Elasticsearch 提交者来自单个公司

  • Solr 更成熟,但 ES 增长迅速,更稳定。

  • Solr 是一个非常有据可查的产品,具有清晰的示例和API用例场景。Elasticsearch 的文档组织良好,但它缺乏好的示例和清晰的配置说明。

选择

  • 由于易于使用,Elasticsearch 在新开发者中更受欢迎。一个下载和一个命令就可以启动一切。

  • 如果除了搜索文本之外还需要它来处理分析查询,Elasticsearch 是更好的选择。

  • 如果需要分布式索引,则需要选择Elasticsearch。对于需要良好可伸缩性和以及性能分布式环境,Elasticsearch 是更好的选择。

  • Elasticsearch 在开源日志管理用例中占据主导地位,许多组织在 Elasticsearch 中索引它们的日志以使其可搜索。

  • 如果监控和指标,则使用 Elasticsearch,因为相对于 Solr,Elasticsearch 暴露了更多的关键指标。

Elasticsearch入门

目录及含义解释

注意:

  • 9300端口为 elasticsearch 集群间组件的通信端口,
  • 9200端口为浏览器访问 http协议 restful 端口。

基本操作

RESTful

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

在服务器端,应用程序状态和功能可以分为各种资源。

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

在REST样式的Web服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括HTTP GET、POST、PUT、DELETE,还可能包括HEAD 和 OPTIONS。

简单的理解就是,如果想要访问互联网上的资源,就必须向资源所在的服务器发出请求,请求体中必须包含资源的网络路径,以及对资源进行的操作(增删改查)。

数据格式

Elasticsearch是面向文档型的数据库,一条数据在这里就是一个文档。

将Elasticsearch里存储文档数据和关系型数据库Mysql存储数据的概念进行类比:

sql 复制代码
Elasticsearch   Index(索引)    Type(类型)   Documents(文档)   Fields(字段)
     |               |               |              |                  |
     |               |               |              |                  |
   Mysql        Database(数据库) Table(表)     Row(行)         Column(列)
  • Elasticsearch 6.X中,一个index下已经只能包含一个type;
  • Elasticsearch 7.X中, Type的概念已经被删除了。

ES6用JSON作为文档序列化的格式,比如一条用户信息:

json 复制代码
{
    "name" : "John",
    "sex" : "Male",
    "age" : 25,
    "birthDate": "1990/05/01",
    "about" : "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}

HTTP操作

索引操作

  • 1> 创建index索引 (相当于创建mysql中的库)
    对比关系型数据库,创建索引就等同于创建数据库
    在Postman中,向ES服务器发PUT请求。
bash 复制代码
请求:
PUT http://192.168.172.101:9200/shopping
请求后:服务器返回响应
{
    "acknowledged"【响应结果】: true,   # true 操作成功
    "shards_acknowledged"【分片结果】: true, # 分片操作成功
    "index"【索引名称】: "shopping"
}
# 注意:在7.0.0之前的版本中,分片默认5片;7.x版本中创建索引库的分片数默认1片
由于PUT具有幂等性,重复创建索引会出问题,返回错误信息,即索引已存在
POST不具有幂等性
  • 2> 查看所有索引
    在Postman中,向ES服务器发GET请求
lua 复制代码
GET http://192.168.172.101:9200/_cat/indices?v
这里请求路径中的_cat表示查看的意思,indices表示索引,所以整体含义就是查看当前ES服务器中的所有索引,就好像Mysql中的show databases的感觉,服务器响应结果如下:
health status index    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   shopping 0zSBa88FSfuzGmEGyVZWig   5   1          0
  • 3> 查看单个索引
    在postman中,向ES服务器发GET请求
bash 复制代码
GET http://192.168.172.101:9200/shopping
查看索引向ES服务器发送的请求路径和创建索引是一致的。但是HTTP方法不一致。这里可以体会一下Restful的意义。
请求后,服务器响应的结果如下:
{
    "shopping"【索引名】: {
        "aliases"【别名】: {},
        "mappings"【映射】: {},
        "settings"【设置】: {
            "index"【设置-索引】: {
                "creation_date"【设置-索引-创建时间】: "1650791220128",
                "number_of_shards"【设置-索引-主分片数量】: "5",
                "number_of_replicas"【设置-索引-副分片数量】: "1",
                "uuid"【设置-索引-唯一标识】: "0zSBa88FSfuzGmEGyVZWig",
                "version"【设置-索引-版本】: {
                    "created": "6050499"
                },
                "provided_name"【设置-索引-名称】: "shopping"
            }
        }
    }
}
  • 4> 删除索引
    在postman中,向ES服务器发DELETE请求
bash 复制代码
DELETE http://192.168.172.101:9200/shopping

{
    "acknowledged": true
}

删除成功后,重新访问索引时,服务器返回响应:索引不存在
GET http://192.168.172.101:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
已经没有索引了