📜  什么是 Elastic Stack 和 Elasticsearch?

📅  最后修改于: 2021-10-18 12:45:30             🧑  作者: Mango

Elastic Stack是一组产品,可以安全可靠地从任何来源以任何格式获取数据,然后对其进行实时搜索、分析和可视化。 Elasticsearch是一种分布式 RESTful 搜索和分析引擎,可以解决大量用例。也被视为 Elastic Stack 的核心,它集中存储用户数据以实现高效搜索、出色的相关性和高度可扩展的强大分析。

Elastic Stack 核心产品

下面列出了定义弹性堆栈的核心产品:

  • Elastic Search – 搜索和分析引擎。
  • Logstash – 数据处理管道。
  • Kibana – 用于可视化数据的仪表板。

所有这三个都有自己的意义,通过结合这三个,您将获得对数据的分析和分析。

为什么需要它?

根据调查,Facebook 每天生成 4 PB 数据,即 4000 万 GB。数据,现在是数据的世界。所以我们需要一个系统来分析我们的数据。有两个术语要理解:

  • 分析– 在分析部分,您将从过去的数据或现有数据中获得结果。
  • 分析– 当您想预测用户需求时,您需要基于图表的可视化以提高业务清晰度,并且还想了解数据模式。

因此,对于任何企业来说,这两个最重要的工具。您可以通过您的数据实现这些。在这两者的帮助下,您可以发展您的业务并明确业务洞察力。现在,它是如何?因为在更短的时间内分析这些大数据并不是一件容易的事。

挑战和解决方案:

  • 在非常大的公司中,您会从不同地方以不同格式获取数据。它可以是 JSON 或 XML。所以我们需要一种机制来在一个地方以一种格式获取整个数据。为此,我们使用 Logstash。
  • 现在当我们拿到数据时,我们需要将数据按照系统的顺序排列,这样我们就可以很容易地对事物进行评估。此外,我们要分析数据,在这种情况下,首先,非常快速地处理数据。为此,我们有 Elasticsearch。 Elasticsearch 是用Java开发的,并根据 Apache 许可条款作为开源发布。
  • 现在完成此操作后,我们需要一个可视化平台来展示我们的数据分析。 Kibana 出现在画面中。这就是整个 Elastic 堆栈的工作方式。获得更好的业务洞察力。

弹性搜索

设置 Elasticsearch、Logstash 和 Kibana

首先我们从各自的链接【elasticsearch】、【logstash】、【kibana】下载这三个开源软件。解压缩文件并将所有三个文件放在项目文件夹中。首先,在本地系统上设置 Kibana 和 Elasticsearch。我们在 Kibana 的 bin 文件夹中通过以下命令运行 Kibana。

  • bin\kibana

同样,Elasticsearch 设置如下:

bin\elasticsearch

现在,在两个独立的终端中,我们可以看到两个模块都在运行。为了检查服务是否正在运行,请打开 Kibana 的 localhost:5621 和 Elasticsearch 的 localhost:9600。

在这里,我们已准备好设置弹性堆栈。现在转到 localhost:5621 并在控制台中打开开发工具。这是您可以编写 Elasticsearch 查询的地方。这次我们将更多地讨论 Elasticsearch。现在我们将看看 Elasticsearch 是如何工作的。

弹性搜索的工作

在任何操作之前,我们必须索引我们的数据。一旦在 Elasticsearch 中建立索引,用户就可以对其数据运行复杂的查询,并使用聚合来检索其数据的复杂摘要。 Elasticsearch 将数据存储为 JSON 文档,并使用称为倒排索引的数据结构,旨在实现非常快速的全文搜索。倒排索引列出出现在任何文档中的每个唯一单词,并标识每个单词出现的所有文档。为了更好地理解,我们将 Elasticsearch 分成几个主题。

  • 管理文件
  • 映射
  • 分析
  • 搜索方法
  • 聚合和过滤器

弹性搜索架构:

  • 集群:在 Elasticserach 中,我们将数据存储在节点中,一台机器可以有 n 个节点。并且每个节点都与集群相关。所以集群是一组节点。
  • 文档:您将数据存储为 JSON 对象的文档。那么这些数据是如何组织在集群中的呢?答案是指数。在关系数据库的世界中,文档可以比作表中的一行。
  • 索引: Elasticsearch 索引是文档的逻辑分区,可以与关系数据库世界中的数据库进行比较。
  • 类型:每个索引都有一个或多个映射类型,用于将文档划分为一个逻辑组。它可以与关系数据库世界中的表进行比较。
    每个文档都存储为索引。您可以说的索引是文档的集合。例如,具有相似特征的部门将具有 A 索引,而员工具有 B 索引,即它们在逻辑上相关。
  • 分片
    a) Sharding 只是将索引分成更小的部分的一种方式。
    b)每一块被称为一个碎片。
    c) 分片是在索引级别完成的。
    Shard 就像一个索引。为了可扩展性。通过分片,您可以在一个索引中存储数十亿个文档。也有副本,但就目前而言,我们开始和了解 Elasticsearch 已经足够了。因此,让我们进一步转向构建和搜索引擎。

1. 管理文件

在此之前,获取 Elasticserach 包管理器。

npm -i elasticsearch 

第 1 步:按照以下步骤将您的应用程序链接到 Elasticsearch。

javascript
var elasticsearch = require('elasticsearch');
var client = new elasticsearch.Client({
  host: 'localhost:9200',
  log: 'trace',
  // use the same version
  // of your Elasticsearch instance
  apiVersion: '7.2', 
});
  
module.exports = client;


javascript
// Write Javascript code here
var client = require('./connection.js');
  
client.indices.create({  
  index: 'gov'
},function(err,resp,status) {
  if(err) {
    console.log(err);
  }
  else {
    console.log("create",resp);
  }
});


javascript
// Write Javascript code here
var client = require('./connection.js');
  
client.index({  
  index: 'gov',
  id: '1',
  type: 'constituencies',
  body: {
    "ConstituencyName": "Ipswich",
    "ConstituencyID": "E14000761",
    "ConstituencyType": "Borough",
    "Electorate": 74499,
    "ValidVotes": 48694,
  }
},function(err,resp,status) {
    console.log(resp);
});


javascript
var client = require('./connection.js');
  
client.indices.putMapping({  
  index: 'gov',
  type: 'constituencies',
  body: {
    properties: {
      'constituencyname': {
        // type is a required
        // attribute if index
        // is specified
        'type': 'string', 
        'index': false
      },
      'electorate': {  
        'type': 'integer'
      },
      'validvotes': {  
        'type': 'integer'
      }
    }
  }
},function(err,resp,status){
    if (err) {
      console.log(err);
    }
    else {
      console.log(resp);
    }
});


javascript
// Write Javascript code here
var client = require('./connection.js');
  
client.search({  
  index: 'gov',
  type: 'constituencies',
  body: {
    query: {
      match: { "constituencyname": "Harwich" }
    },
  }
},function (error, response,status) {
    if (error){
      console.log("search error: "+error)
    }
    else {
      console.log("--- Response ---");
      console.log(response);
      console.log("--- Hits ---");
      response.hits.hits.forEach(function(hit){
        console.log(hit);
      })
    }
});
  
  
client.search({  
    index: 'gov',
    type: 'petitions',  
    body: {
      query: {
        match: { 'action': 'Ipswich' }
      },
    },function (error, response,status) {
      if (error){
        console.log("search error: "+error)
      }
      else {
        console.log("--- Response ---");
        console.log(response);
        console.log("--- Hits ---");
        response.hits.hits.forEach(function(hit){
          console.log(hit);
        })
      }
  });


第 2 步:为 eg 创建索引 我们创建一个索引作为 gov。

javascript

// Write Javascript code here
var client = require('./connection.js');
  
client.indices.create({  
  index: 'gov'
},function(err,resp,status) {
  if(err) {
    console.log(err);
  }
  else {
    console.log("create",resp);
  }
});

第 3 步:现在我们将向索引 gov 添加文档,在索引 gov 中,有一种称为选区的类型。您可以关联,因为有一个名为 gov 的数据库,该表是选区。

javascript

// Write Javascript code here
var client = require('./connection.js');
  
client.index({  
  index: 'gov',
  id: '1',
  type: 'constituencies',
  body: {
    "ConstituencyName": "Ipswich",
    "ConstituencyID": "E14000761",
    "ConstituencyType": "Borough",
    "Electorate": 74499,
    "ValidVotes": 48694,
  }
},function(err,resp,status) {
    console.log(resp);
});

2. 映射

映射是定义文档及其字段的过程。就像在 RDBMS 中定义表模式一样。

第 4 步:现在我们将定义映射到索引 gov 类型的选区。

javascript

var client = require('./connection.js');
  
client.indices.putMapping({  
  index: 'gov',
  type: 'constituencies',
  body: {
    properties: {
      'constituencyname': {
        // type is a required
        // attribute if index
        // is specified
        'type': 'string', 
        'index': false
      },
      'electorate': {  
        'type': 'integer'
      },
      'validvotes': {  
        'type': 'integer'
      }
    }
  }
},function(err,resp,status){
    if (err) {
      console.log(err);
    }
    else {
      console.log(resp);
    }
});

三、分析

文本分析是将非结构化文本(例如电子邮件正文或产品说明)转换为针对搜索进行优化的结构化格式的过程。 Elasticsearch 在索引或搜索文本字段时执行文本分析。我们在映射中定义的。这是搜索引擎的关键因素。
默认情况下,Elasticsearch 使用标准分析器进行所有文本分析。标准分析器为您提供对大多数自然语言和用例的开箱即用支持。如果您选择按原样使用标准分析器,则无需进一步配置。您还可以创建自己的自定义分析器。

4. 搜索方法

您可以将不同类型的查询应用于 Elasticsearch。这样,您将获得相应的结果。在这里,我将给出一个查询的基本示例。最简单的查询,匹配所有文档。

javascript

// Write Javascript code here
var client = require('./connection.js');
  
client.search({  
  index: 'gov',
  type: 'constituencies',
  body: {
    query: {
      match: { "constituencyname": "Harwich" }
    },
  }
},function (error, response,status) {
    if (error){
      console.log("search error: "+error)
    }
    else {
      console.log("--- Response ---");
      console.log(response);
      console.log("--- Hits ---");
      response.hits.hits.forEach(function(hit){
        console.log(hit);
      })
    }
});
  
  
client.search({  
    index: 'gov',
    type: 'petitions',  
    body: {
      query: {
        match: { 'action': 'Ipswich' }
      },
    },function (error, response,status) {
      if (error){
        console.log("search error: "+error)
      }
      else {
        console.log("--- Response ---");
        console.log(response);
        console.log("--- Hits ---");
        response.hits.hits.forEach(function(hit){
          console.log(hit);
        })
      }
  });

5. 查询

  • 复合查询:复合查询包装其他复合或叶查询,以组合它们的结果和分数,改变它们的行为,或者从查询切换到过滤上下文。
    用于组合多个叶或复合查询子句的默认查询,如 must、should、must_not 或 filter 子句。 must 和 should 子句的分数相结合。
  • 全文查询:全文查询使您能够搜索分析的文本字段,例如电子邮件正文。使用在索引期间应用于字段的相同分析器处理查询字符串。它将分析您的输入。如果给定的输入不准确但仍然如此,您将得到一个结果。
  • 联接查询:在像 Elasticsearch 这样的分布式系统中执行完整的 SQL 样式联接是非常昂贵的。相反,Elasticsearch 提供了两种形式的连接,旨在水平扩展。
    a)嵌套查询
    b) has_childhas_parent查询
  • 专业查询:该组包含不适合其他组的查询,发现性质相似的文档,固定查询还有更多,请查看其文档。
  • 术语级查询:您可以使用术语级查询根据结构化数据中的精确值查找文档。结构化数据的示例包括日期范围、IP 地址、价格或产品 ID。
    与全文查询不同,词级查询不分析搜索词。相反,术语级查询与存储在字段中的确切术语相匹配。它将找到输入的完全匹配,而在全文中,首先将对其进行分析然后进行搜索,因此术语级别和全文查询之间存在很大差异。

6. 聚合和过滤器

在过滤器上下文中,查询子句回答“此文档是否与此查询子句匹配?”的问题。答案是一个简单的“是”或“否”——不计算分数。过滤上下文主要用于过滤结构化数据,例如

  • 这个时间戳是否在 2015 年到 2016 年的范围内?
  • 状态字段是否设置为“已发布”?

Elasticsearch 会自动缓存常用的过滤器,以提高性能。只要将查询子句传递给过滤器参数,例如 bool 查询中的 filter 或must_not参数、 constant_score查询中的过滤器参数或过滤器聚合,过滤器上下文就会生效。聚合更像是在 RDBMS 中,您会发现 Avg、Sum 和使用复杂查询的大量数据洞察。

Elastic Stack 是一项非常重要的学习技术。您将在您的任何项目中应用它,而 ELK Stack 最常用作日志分析工具。它的流行在于它提供了一种可靠且相对可扩展的方式来聚合来自多个来源的数据,还有很多事情要做,但是在此之后,您可以开始使用 Elasticsearch。