Elasticsearch简介及入门

一、Elasticsearch

此文为官方文档翻译和学习基于7.x版本

官网文档地址

1、简介

Elasticsearch是用于搜索和分析的

Elasticsearch是Elastic Stack核心的分布式搜索和分析引擎。Logstash和Beats有助于收集,聚合和丰富您的数据并将其存储在Elasticsearch中。使用Kibana,您可以交互式地探索,可视化和共享对数据的见解,并管理和监视堆栈。Elasticsearch是建立索引,搜索和分析逻辑的地方。

Elasticsearch为所有类型的数据提供实时搜索和分析。无论您是结构化文本还是非结构化文本,数字数据或地理空间数据,Elasticsearch都能以支持快速搜索的方式有效地对其进行存储和索引。您不仅可以进行简单的数据检索,还可以汇总信息来发现数据中的趋势和模式。随着数据和查询量的增长,Elasticsearch的分布式特性使您的部署可以随之无缝地增长。

虽然并非每个问题都是搜索问题,但是Elasticsearch可以提供速度和灵活性来处理各种用例中的数据:

  • 将搜索框添加到应用或网站
  • 存储和分析日志,指标和安全事件数据
  • 使用机器学习自动实时建模数据行为
  • 使用Elasticsearch作为存储引擎来自动化业务工作流程
  • 使用Elasticsearch作为地理信息系统(GIS)管理,集成和分析空间信息
  • 使用Elasticsearch作为生物信息学研究工具来存储和处理遗传数据

人们使用搜索的新颖方式使我们不断感到惊讶。但是,无论您的用例与其中之一相似,还是您正在使用Elasticsearch解决新问题,在Elasticsearch中处理数据,文档和索引的方式都是相同的。

2、文档和索引

Elasticsearch是一个分布式文档存储。Elasticsearch不会将信息存储为列数据的行,而是存储已序列化为JSON文档的复杂数据结构。当集群中有多个Elasticsearch节点时,存储的文档会分布在整个集群中,并且可以从任何节点立即访问

存储文档时,将在1秒内几乎实时地对其进行索引和完全搜索。Elasticsearch使用称为倒排索引的数据结构,该结构支持非常快速的全文本搜索。反向索引列出了出现在任何文档中的每个唯一单词,并标识了每个单词出现的所有文档。

索引可以认为是文档的优化集合,每个文档都是字段的集合,这些字段是包含数据的键值对。默认情况下,Elasticsearch对每个字段中的所有数据建立索引,并且每个索引字段都具有专用的优化数据结构。例如,文本字段存储在倒排索引中,数字字段和地理字段存储在BKD树中。使用按字段数据结构组合并返回搜索结果的能力使Elasticsearch如此之快。

Elasticsearch还具有无模式的能力,这意味着可以为文档建立索引,而无需明确指定如何处理文档中可能出现的每个不同字段。启用动态映射后,Elasticsearch自动检测并将新字段添加到索引。这种默认行为使索引和浏览数据变得很容易-只需开始建立索引文档,Elasticsearch就会检测布尔值,浮点数和整数值,日期和字符串并将其映射到适当的Elasticsearch数据类型。

但是,最终,您比Elasticsearch更了解您的数据以及如何使用它们。您可以定义规则以控制动态映射,并显式定义映射以完全控制字段的存储和索引方式。

定义自己的映射使您能够:

  • 定义自己的映射使您能够:
  • 执行特定于语言的文本分析
  • 优化字段以进行部分匹配
  • 使用自定义日期格式
  • 使用无法自动检测到的 数据类型,例如geo_point和geo_shape

为不同的目的以不同的方式对同一字段建立索引通常很有用。例如,您可能希望将一个字符串字段索引为全文搜索的文本字段,以及作为排序或汇总数据的关键字字段。或者,您可能选择使用多个语言分析器来处理包含用户输入的字符串字段的内容。

在搜索时也会使用在索引期间应用于全文字段的分析链。当您查询全文字段时,对查询文本进行相同的分析,然后再在索引中查找术语。

3、搜索和分析

虽然您可以将Elasticsearch用作文档存储并检索文档及其元数据,但真正的强大之处在于能够轻松访问基于Apache Lucene搜索引擎库构建的全套搜索功能

Elasticsearch提供了一个简单,一致的REST API,用于管理您的集群以及索引和搜索数据。为了进行测试,您可以直接从命令行或通过Kibana中的开发者控制台轻松提交请求。在您的应用程序中,您可以将 Elasticsearch客户端 用于您选择的语言:Java,JavaScript,Go,.NET,PHP,Perl,Python或Ruby。

3.1、搜索数据

Elasticsearch REST API支持结构化查询,全文查询以及结合了两者的复杂查询。结构化查询类似于您可以在SQL中构造的查询类型。例如,您可以搜索索引中的gender和age字段,employee然后按hire_date字段对匹配项进行排序。全文查询会找到所有与查询字符串匹配的文档,并按相关性对它们进行归还-它们与您的搜索词的匹配程度如何。

除了搜索单个术语外,您还可以执行短语搜索,相似性搜索和前缀搜索,并获得自动完成建议。

是否要搜索地理空间或其他数字数据?Elasticsearch在支持高性能地理和数字查询的优化数据结构中索引非文本数据。

您可以使用Elasticsearch全面的JSON样式查询语言(Query DSL)访问所有这些搜索功能。您还可以构造SQL样式的查询,以在Elasticsearch内部本地搜索和聚合数据,并且JDBC和ODBC驱动程序使范围广泛的第三方应用程序可以通过SQL与Elasticsearch进行交互。

3.2、分析数据

Elasticsearch聚合使您能够构建数据的复杂摘要,并深入了解关键指标,模式和趋势。通过汇总,您不仅可以找到众所周知的“大海捞针”,还可以回答以下问题:

  • 大海捞针有多少根?
  • 大海捞针有多少根?
  • 针头的中位长度是多少,由制造商细分?
  • 在过去六个月的每个月中,有多少根针被添加到干草堆中?

您还可以使用聚合来回答更细微的问题,例如:

  • 您最受欢迎的针头制造商是哪些?
  • 是否有异常或异常的针团?

由于聚合利用了用于搜索的相同数据结构,因此它们也非常快。这使您可以实时分析和可视化数据。您的报告和仪表板会随着数据的更改而更新,因此您可以根据最新信息采取措施。

而且,聚合与搜索请求一起运行。您可以在单个请求中同时对相同数据搜索文档,过滤结果并执行分析。而且由于聚合是在特定搜索的上下文中计算的,因此您不仅显示了所有70针大小的针数,而且还显示了符合用户搜索条件的70针大小的针数-例如,所有尺寸的70 个不粘绣针。

3.3、还有更多功能

是否想自动分析您的时间序列数据?您可以使用 机器学习功能在数据中创建正常行为的准确基准,并识别异常模式。通过机器学习,您可以检测到:

  • 与值,计数或频率的时间偏差有关的异常
  • 统计稀有度
  • 人口成员的异常行为

最好的部分是?您无需指定算法,模型或其他与数据科学相关的配置即可执行此操作。

4、可拓展性和弹性:集群,节点和碎片

Elasticsearch旨在始终可用,并可以根据您的需求进行扩展。它是通过自然分布来实现的。您可以将服务器(节点)添加到集群以增加容量,Elasticsearch会自动在所有可用节点之间分配数据和查询负载。无需大修您的应用程序,Elasticsearch知道如何平衡多节点集群以提供扩展性和高可用性。节点越多越好。

这是如何运作的?在幕后,Elasticsearch索引实际上只是一个或多个物理碎片的逻辑分组,其中每个碎片实际上是一个独立的索引。通过在多个分片之间的索引中分配文档,并在多个节点之间分配这些分片,Elasticsearch可以确保冗余,这既可以防止硬件故障,又可以在将节点添加到集群中时提高查询能力。随着集群的增长(或收缩),Elasticsearch会自动迁移碎片以重新平衡集群。

分片有两种类型:主数据库和副本数据库。索引中的每个文档都属于一个主分片。副本分片是主分片的副本。副本可提供数据的冗余副本,以防止硬件故障并增加处理读取请求(如搜索或检索文档)的能力。

创建索引时,索引中主碎片的数量是固定的,但是副本碎片的数量可以随时更改,而不会中断索引或查询操作。

这取决于... ...

在分片大小和为索引配置的主分片数量方面,存在许多性能方面的考虑和权衡取舍。分片越多,维护这些索引的开销就越大。分片大小越大,当Elasticsearch需要重新平衡集群时,分片移动所需的时间就越长。

查询很多小的分片会使每个分片的处理速度更快,但是更多的查询意味着更多的开销,因此查询较小数量的大分片可能会更快。简而言之...要视情况而定。

作为起点:

  • 旨在将平均分片大小保持在几GB到几十GB之间。对于具有基于时间的数据的用例,通常会看到20GB到40GB范围内的碎片。
  • 避免庞大的碎片问题。节点可以容纳的分片数量与可用堆空间成比例。通常,每GB堆空间中的分片数量应少于20。

确定用例最佳配置的最佳方法是通过 使用自己的数据和查询进行测试

4.1、容灾

出于性能原因,群集内的节点必须位于同一网络上。跨不同数据中心中的节点在群集中平衡碎片的时间太长了。但是高可用性架构要求您避免将所有鸡蛋都放在一个篮子里。如果一个位置发生重大故障,则另一个位置的服务器需要能够接管。无缝地。答案?跨集群复制(CCR)。

CCR提供了一种方法,可以自动将索引从主群集同步到可以用作热备份的辅助远程群集。如果主群集发生故障,则辅助群集可以接管。您还可以使用CCR创建辅助群集,以接近地理位置的方式向用户提供读取请求。

跨集群复制是主动-被动的。主群集上的索引是活动的领导者索引,并处理所有写请求。复制到辅助群集的索引是只读跟随者。

4.2、监控

与任何企业系统一样,您需要工具来保护,管理和监视Elasticsearch集群。集成到Elasticsearch中的安全性,监视和管理功能使您可以将Kibana 用作控制中心来管理集群。类似的特征数据汇总和指标生命周期管理 可帮助您明智随着时间的推移管理您的数据。

二、Elasticsearch入门

1、数据导入

下载accounts.json样本数据集。此随机生成的数据集中的文档代表具有以下信息的用户帐户:

curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@accounts.json"
curl "localhost:9200/_cat/indices?v"

如果是单节点,先设置副分片为0

PUT /bank/_settings
{
  "settings":{
     "number_of_replicas": 0
  }
}

2、开始搜索

将一些数据摄取到Elasticsearch索引后,您可以通过向_search端点发送请求来搜索它。要访问全套搜索功能,请使用Elasticsearch Query DSL在请求正文中指定搜索条件。您可以在请求URI中指定要搜索的索引的名称。

例如,以下请求检索bank 按帐号排序的索引中的所有文档:

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ]
}

默认情况下,hits响应部分包括符合搜索条件的前10个文档:

{
  "took" : 63,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
        "value": 1000,
        "relation": "eq"
    },
    "max_score" : null,
    "hits" : [ {
      "_index" : "bank",
      "_type" : "_doc",
      "_id" : "0",
      "sort": [0],
      "_score" : null,
      "_source" : {"account_number":0,"balance":16623,"firstname":"Bradshaw","lastname":"Mckenzie","age":29,"gender":"F","address":"244 Columbus Place","employer":"Euron","email":"[email protected]","city":"Hobucken","state":"CO"}
    }, {
      "_index" : "bank",
      "_type" : "_doc",
      "_id" : "1",
      "sort": [1],
      "_score" : null,
      "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"[email protected]","city":"Brogan","state":"IL"}
    }, ...
    ]
  }
}

该响应还提供有关搜索请求的以下信息:

  • took – Elasticsearch运行查询所需的时间(以毫秒为单位)
  • timed_out – 搜索请求是否超时
  • _shards – 搜索了多少个分片,以及成功,失败或跳过了多少个分片。
  • max_score – 找到的最相关文件的分数
  • hits.total.value - 找到了多少个匹配的文档
  • hits.sort - 文档的排序位置(不按相关性得分排序时)
  • hits._score - 文档的相关性得分(使用时不适用match_all)

每个搜索请求都是独立的:Elasticsearch在请求中不维护任何状态信息。要翻阅搜索结果,请在您的请求中指定from和size参数。

例如,以下请求的匹配数为10到19:

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ],
  "from": 10,
  "size": 10
}

现在,您已经了解了如何提交基本的搜索请求,可以开始构建比match_all更有趣的查询了

要在字段中搜索特定术语,可以使用match查询。例如,以下请求搜索该address字段以查找地址包含mill或的客户lane:

  • 指查询出来的内容,address包含mill或则lane都会被查询出来
GET /bank/_search
{
  "query": {
    "match": {
      "address": "mill lane都会被查询出来"
    }
  }
}

要执行词组搜索而不是匹配单个词,请使用 match_phrase代替match。例如,以下请求仅匹配包含短语的地址mill lane:

  • 词组查询,指address包含这个(mill lane)这个词组的文档会被查询出来
GET /bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill lane"
    }
  }
}

返回

{
  "took" : 9,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 9.507477,
    "hits" : [
      {
        "_index" : "bank",
        "_type" : "_doc",
        "_id" : "136",
        "_score" : 9.507477,
        "_source" : {
          "account_number" : 136,
          "balance" : 45801,
          "firstname" : "Winnie",
          "lastname" : "Holland",
          "age" : 38,
          "gender" : "M",
          "address" : "198 Mill Lane",
          "employer" : "Neteria",
          "email" : "[email protected]",
          "city" : "Urie",
          "state" : "IL"
        }
      }
    ]
  }
}

要构造更复杂的查询,可以使用bool查询来组合多个查询条件。您可以根据需要(必须匹配),期望(应该匹配)或不期望(必须不匹配)指定条件。

例如,以下请求在bank索引中搜索属于40岁客户的帐户,但不包括居住在爱达荷州(ID)的任何人:

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}

布尔查询中的每个must,should和must_not元素称为查询子句。文档满足每个条款must或 should条款的标准的程度有助于文档的相关性得分。分数越高,文档就越符合您的搜索条件。默认情况下,Elasticsearch返回按这些相关性分数排名的文档。

must_not子句中的条件被视为过滤器。它影响文件是否包含在结果中,但不会影响文件的评分方式。您还可以根据结构化数据显式指定任意过滤器以包括或排除文档。

例如,以下请求使用范围过滤器将结果限制为余额在20,000美元到30,000美元(含)之间的帐户。

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match_all": {}}
      ]
      , "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

3、使用聚合分析结果

Elasticsearch聚合使您能够获取有关搜索结果的元信息,并回答诸如“德克萨斯州有多少个帐户持有人?”之类的问题。或“田纳西州的平均帐户余额是多少?” 您可以在一个请求中搜索文档,过滤命中并使用汇总分析结果。

例如,以下请求使用terms汇总将bank索引中的所有帐户按状态分组,并按降序返回帐户数量最多的十个州:

GET /bank/_search
{
  "size": 0, 
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword",
        "size": 10
      }
    }
  }
}

buckets里面响应的是state字段的值,doc_count展示的是每个state字段的值在这个索引里面的数量,例如你可以看到state=ID的在该索引下总共有27个文档有,因为设置了size=0,所以响应仅包含聚合结果。

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1000,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_state" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 743,
      "buckets" : [
        {
          "key" : "TX",
          "doc_count" : 30
        },
        {
          "key" : "MD",
          "doc_count" : 28
        },
        {
          "key" : "ID",
          "doc_count" : 27
        },
        {
          "key" : "AL",
          "doc_count" : 25
        },
        {
          "key" : "ME",
          "doc_count" : 25
        },
        {
          "key" : "TN",
          "doc_count" : 25
        },
        {
          "key" : "WY",
          "doc_count" : 25
        },
        {
          "key" : "DC",
          "doc_count" : 24
        },
        {
          "key" : "MA",
          "doc_count" : 24
        },
        {
          "key" : "ND",
          "doc_count" : 24
        }
      ]
    }
  }
}

您可以组合聚合以构建更复杂的数据汇总。例如,以下请求将一个avg聚合嵌套在先前的 group_by_state聚合中,以计算每个状态的平均帐户余额。


GET /bank/_search
{
  "size": 0, 
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      }
      , "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

您可以通过指定terms聚合内的顺序来使用嵌套聚合的结果进行排序,而不是按计数对结果进行排序:

GET /bank/_search
{
  "size": 0, 
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword",
        "order": {
          "average_balance": "desc"
        }
      }
      , "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

除了这些基本的存储桶和指标聚合外,Elasticsearch还提供了专门的聚合,用于在多个字段上操作并分析特定类型的数据,例如日期,IP地址和地理数据。您还可以将单个聚合的结果馈送到管道聚合中,以进行进一步分析。

聚合提供的核心分析功能可启用高级功能,例如使用机器学习来检测异常。

猜你喜欢

转载自www.cnblogs.com/zlandlsy/p/12897424.html
今日推荐