📜  什么是Elastic Stack和Elasticsearch?

📅  最后修改于: 2021-04-17 02:20:38             🧑  作者: Mango

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

弹性堆叠的核心产品

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

  • 弹性搜索–搜索和分析引擎。
  • Logstash –数据处理管道。
  • Kibana –显示数据的仪表板。

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

为什么需要它?

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

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

因此,这两个最重要的工具适用于任何企业。您可以通过数据来实现这些目标。借助这两个功能,您可以发展您的业务并获得清晰的业务见解。现在,这是怎么回事?因为要用更少的时间分析大量数据并不是一件容易的事。

挑战与解决方案:

  • 在大型公司中会发生什么,您会从不同地方以不同格式获取数据。可以是JSON或XML。因此,我们需要一种机制来以一种位置和一种格式获取整个数据。因此,我们使用Logstash。
  • 现在,当我们获取数据时,我们需要按系统的顺序排列数据,以便我们可以非常轻松地评估事物。另外,我们要分析数据,在这种情况下,首先,非常快速地处理数据。为此,我们有Elasticsearch。 Elasticsearch是用Java开发的,并根据Apache许可的条款作为开源发布。
  • 现在,完成此操作后,我们需要一个可视化平台,在该平台上可以显示我们的数据分析。那里有Kibana进入图片。这就是整个弹性堆栈的工作方式。以获得更好的业务见解。

弹性搜索

设置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)分片只是将索引分成较小部分的一种方法。
    b)每一块被称为碎片。
    c)分片在索引级别完成。
    分片就像一个索引。为了可扩展性。使用分片,您可以在一个索引中存储数十亿个文档。也有副本服务器,但就目前而言,对于我们来说,开始并理解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:现在,我们将文档添加到index gov,并且在index 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);
    }
});

3.分析

文本分析是将非结构化文本(例如电子邮件的正文或产品说明)转换为针对搜索优化的结构化格式的过程。当索引或搜索文本字段时,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_not或filter子句)。 “必须”和“应该”子句的得分结合在一起。
  • 全文查询:全文查询使您可以搜索已分析的文本字段,例如电子邮件的正文。使用在索引期间应用于字段的同一分析器来处理查询字符串。它将分析您的输入。如果给定的输入不准确,但仍然可以得到结果。
  • 连接查询:在像Elasticsearch这样的分布式系统中执行完整的SQL风格的连接非常昂贵。相反,Elasticsearch提供了两种形式的连接,这些连接被设计为水平缩放。
    a)嵌套查询
    b) has_childhas_parent查询
  • 特殊查询:该组包含的查询不适合其他组,发现本质上相似的文档,固定查询也有更多查询,请查看其文档。
  • 术语级查询:您可以使用术语级查询根据结构化数据中的精确值查找文档。结构化数据的示例包括日期范围,IP地址,价格或产品ID。
    与全文查询不同,术语级查询不分析搜索词。而是,术语级查询与存储在字段中的确切术语匹配。它会找到输入的确切匹配项,而首先是全文本,然后将对其进行分析,然后进行搜索,因此这在术语级查询和全文本查询之间有很大的不同。

6.聚合和过滤器

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

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

常用的过滤器将由Elasticsearch自动缓存,以提高性能。每当将查询子句传递到过滤器参数(例如bool查询中的filter或must_not参数, constant_score查询中的filter参数或过滤器聚合)时,过滤器上下文即生效。与聚合类似,在RDBMS中,您会发现使用复杂查询的平均,总和和大量数据洞察力。

弹性堆栈是一项非常重要的技术。您将在您的任何项目中应用此方法,并且ELK Stack最常用作日志分析工具。它的受欢迎程度在于它提供了一种可靠且相对可扩展的方式来聚合来自多个源的数据,仍然存在很多事情,但是在此之后,您可以从Elasticsearch开始。