MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

ElasticSearch API通用选项概述

2024-03-024.4k 阅读

一、请求参数通用选项

在 Elasticsearch 的 API 调用中,请求参数包含了众多通用选项,这些选项为我们在与 Elasticsearch 交互时提供了极大的灵活性,能够满足不同场景下对数据操作的需求。

1.1 pretty参数

pretty参数用于使 Elasticsearch 的响应结果以更易读的格式返回。在开发和调试过程中,这一参数非常实用,因为 Elasticsearch 返回的 JSON 数据结构可能较为复杂,经过格式化后能让人更清晰地理解响应内容。 例如,我们使用curl命令获取索引信息:

curl -X GET "localhost:9200/_cat/indices?v&pretty"

上述命令中,pretty参数使得返回的索引列表以一种格式化的表格形式呈现,各列信息清晰明了,方便我们查看索引的名称、健康状态、文档数量等详细信息。

1.2 human参数

human参数主要用于将一些数值类型的响应结果以人类可读的格式展示。比如存储大小、时间间隔等数值,默认情况下 Elasticsearch 可能以字节数、毫秒数等原始格式返回,使用human参数后,会将其转换为更直观的单位。 假设我们要获取集群的健康状态,并希望以人类可读的格式查看存储大小信息:

curl -X GET "localhost:9200/_cluster/health?human"

在返回结果中,存储大小会以诸如10GB500MB这样的形式显示,而不是具体的字节数值,极大地方便了我们对数据规模的直观感知。

1.3 error_trace参数

当 Elasticsearch 操作出现错误时,error_trace参数能提供详细的错误追踪信息。这对于定位和解决问题至关重要,特别是在复杂的集群环境或对性能要求较高的应用场景中。 例如,我们尝试对一个不存在的索引执行删除操作:

curl -X DELETE "localhost:9200/nonexistent_index?error_trace"

响应结果中会包含错误发生的详细堆栈信息,如哪个模块抛出了异常,异常的具体原因等,帮助开发人员快速定位问题根源,进行针对性的修复。

1.4 filter_path参数

filter_path参数允许我们从 Elasticsearch 的响应中提取特定的部分,而不是获取完整的响应内容。这在我们只关心响应中的某些关键信息时非常有用,可以有效减少网络传输的数据量,提高响应速度。 比如,我们只想获取索引的文档数量信息,而不关心其他索引相关的详细内容:

curl -X GET "localhost:9200/my_index/_count?filter_path=count"

这样,响应结果将只包含索引的文档数量,避免了返回大量不必要的数据,对于大规模数据的查询操作,能显著提升效率。

二、请求体通用选项

除了请求参数的通用选项外,在 Elasticsearch 的请求体中也存在一些通用选项,这些选项进一步丰富了我们对数据操作的方式和控制力度。

2.1 refresh选项

refresh选项用于控制索引的刷新机制。在 Elasticsearch 中,数据写入后并不会立即被搜索到,而是会先存储在内存缓冲区中,经过一定时间或满足一定条件后才会刷新到磁盘,形成可搜索的段。通过设置refresh选项,我们可以即时将数据刷新到磁盘,使其立即可搜索。 例如,当我们向索引中插入一条新文档后,希望能马上搜索到该文档,可以这样设置:

POST my_index/_doc
{
  "title": "New Document",
  "content": "This is a new document added to Elasticsearch",
  "refresh": "wait_for"
}

这里的refresh设置为wait_for,表示请求会等待数据刷新完成后才返回,确保新插入的文档能立即被搜索到。不过需要注意的是,频繁使用refresh会对性能产生一定影响,因为刷新操作涉及磁盘 I/O,所以应根据实际业务需求合理使用。

2.2 routing选项

routing选项在 Elasticsearch 的数据路由过程中起着关键作用。Elasticsearch 是一个分布式搜索引擎,数据会分布在多个节点上,routing选项允许我们指定数据存储或检索时所使用的路由值。通过自定义路由规则,我们可以实现数据的特定分布,比如将特定类型的数据集中存储在某些节点上,以提高查询效率。 假设我们有一个电商应用,根据商品类别来进行数据路由。当插入一个电子产品的文档时:

POST products/_doc
{
  "product_name": "Smartphone",
  "category": "Electronics",
  "routing": "Electronics"
}

这里将routing设置为Electronics,Elasticsearch 会根据这个路由值将该文档存储到特定的分片和节点上,当我们查询电子产品相关数据时,可以通过同样的路由值快速定位到这些文档所在的位置,提升查询性能。

2.3 op_type选项

op_type选项用于指定操作的类型,主要在文档的创建和更新操作中使用。它有两个主要取值:createindex。 当op_type设置为create时,只有在文档不存在的情况下才会执行创建操作,如果文档已存在,则会返回错误。例如:

PUT my_index/_doc/1?op_type=create
{
  "title": "First Document",
  "content": "This is the first document in the index"
}

如果索引my_index中已经存在id1的文档,上述操作会返回错误,提示文档已存在。而当op_type设置为index时,无论文档是否存在,都会执行操作。如果文档存在,会更新文档内容;如果不存在,则创建新文档。这一选项在不同的业务场景下有不同的应用,比如在数据初始化阶段,我们可能更倾向于使用create来确保数据的唯一性创建;而在数据更新频繁的场景下,index则更为合适。

三、与索引相关的通用选项

索引是 Elasticsearch 存储和管理数据的核心结构,围绕索引操作也有一系列通用选项,这些选项影响着索引的创建、配置以及数据的存储和检索方式。

3.1 ignore_unavailable选项

在 Elasticsearch 集群环境中,可能会出现部分索引不可用的情况,比如某个节点故障导致相关索引分片无法访问。ignore_unavailable选项允许我们在执行索引操作(如删除索引、获取索引信息等)时,忽略这些不可用的索引,而不会导致整个操作失败。 例如,当我们尝试删除多个索引,其中部分索引可能由于节点故障等原因不可用时:

curl -X DELETE "localhost:9200/index1,index2,index3?ignore_unavailable=true"

这样,即使index2不可用,对index1index3的删除操作仍会继续执行,而不会因为index2的问题导致整个删除请求失败,提高了操作的容错性。

3.2 include_unloaded_segments选项

在 Elasticsearch 中,为了提高性能,一些不经常访问的索引段可能会被卸载到磁盘以释放内存。include_unloaded_segments选项用于在获取索引相关信息(如文档数量、段信息等)时,是否包含这些已卸载的索引段。 比如,我们想获取一个索引的详细段信息,包括已卸载的段:

curl -X GET "localhost:9200/my_index/_segments?include_unloaded_segments=true"

通过这种方式,我们可以全面了解索引的存储状态,对于性能调优和故障排查非常有帮助,特别是在分析索引占用空间和查询性能时,需要考虑已卸载段对整体的影响。

3.3 expand_wildcards选项

在 Elasticsearch 中,我们经常会使用通配符来匹配多个索引进行操作。expand_wildcards选项用于控制通配符匹配的范围和方式。它有几个取值:openclosednoneall。 当取值为open时,表示只匹配开放状态的索引(开放状态意味着索引可读写)。例如,我们要对所有开放的索引执行某个操作:

curl -X POST "localhost:9200/open_index_*/_refresh?expand_wildcards=open"

这样只会对名称以open_index_开头且处于开放状态的索引执行刷新操作。取值为closed时,则只匹配关闭状态的索引;none表示不允许通配符匹配;all则匹配所有索引,无论其开放或关闭状态。合理使用expand_wildcards选项可以确保操作只作用于符合特定状态的索引,避免对不需要的索引进行误操作,保证数据的安全性和集群的稳定性。

四、搜索相关通用选项

搜索是 Elasticsearch 的核心功能之一,为了满足各种复杂的搜索需求,提供了一系列搜索相关的通用选项,这些选项可以对搜索的范围、精度、性能等方面进行细致的控制。

4.1 search_type选项

search_type选项用于指定搜索的类型,不同的搜索类型适用于不同的场景,影响着搜索的执行方式和性能。常见的搜索类型有query_then_fetchdfs_query_then_fetch等。 query_then_fetch是默认的搜索类型。在这种类型下,搜索过程分为两个阶段:首先,在所有分片上执行查询(query阶段),每个分片返回与查询条件匹配的文档的id和排序值等元数据信息;然后,协调节点根据这些元数据信息,从相关分片中获取实际的文档内容(fetch阶段)。这种方式在大多数情况下性能较好,适用于一般性的搜索需求。 而dfs_query_then_fetchquery_then_fetch的基础上,增加了一个分布式词频统计(dfs)的步骤。在查询之前,先在所有分片中统计词频信息,这有助于提高查询的相关性得分准确性,特别是在处理大规模文本数据且对相关性要求较高的场景中。例如:

GET my_index/_search
{
  "search_type": "dfs_query_then_fetch",
  "query": {
    "match": {
      "content": "important keyword"
    }
  }
}

通过设置search_typedfs_query_then_fetch,可以让 Elasticsearch 在计算文档与查询条件的相关性时,考虑到更全面的词频信息,从而返回更符合用户期望的搜索结果。

4.2 fromsize选项

fromsize选项用于控制搜索结果的分页。from指定从结果集的第几项开始返回,size指定返回的结果数量。这在处理大量搜索结果时非常有用,可以避免一次性返回过多数据导致性能问题和网络传输压力。 例如,我们要获取搜索结果的第 11 到 20 条数据:

GET my_index/_search
{
  "from": 10,
  "size": 10,
  "query": {
    "match_all": {}
  }
}

上述请求中,from设置为10(因为索引从 0 开始计数,所以实际从第 11 条开始),size设置为10,表示返回 10 条数据,这样就实现了分页功能。需要注意的是,当from值较大时,查询性能可能会受到影响,因为 Elasticsearch 需要跳过前面的大量数据,此时可以考虑使用滚动搜索(scroll)等更适合大数据量分页的方式。

4.3 sort选项

sort选项用于对搜索结果进行排序。我们可以根据文档的某个字段进行升序或降序排列,也可以根据多个字段进行复杂排序。这在需要按照特定顺序展示搜索结果时非常重要,比如按照时间戳排序以获取最新或最旧的文档,或者按照价格排序以筛选出符合价格范围的商品。 例如,我们要对一个博客索引按照发布时间进行降序排序:

GET blog_index/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "published_date": {
        "order": "desc"
      }
    }
  ]
}

上述示例中,通过在sort字段中指定published_date字段,并设置orderdesc,表示按照published_date字段的值进行降序排列,这样返回的搜索结果将是按照发布时间从新到旧的顺序展示。如果需要按照多个字段排序,可以在sort数组中依次添加排序规则,先按照第一个字段排序,对于相同值的文档再按照第二个字段排序,以此类推。

五、集群相关通用选项

在 Elasticsearch 集群环境中,对集群的管理和监控操作涉及到一些通用选项,这些选项有助于我们更好地了解集群状态、配置集群参数以及协调节点之间的操作。

5.1 master_timeout选项

master_timeout选项用于设置等待主节点响应的超时时间。在 Elasticsearch 集群中,主节点负责处理集群级别的操作,如创建或删除索引、分配分片等。当我们执行一些需要主节点参与的操作时,如果主节点在指定的master_timeout时间内没有响应,操作将失败并返回相应的超时错误。 例如,当我们创建一个新索引时,可以设置master_timeout

curl -X PUT "localhost:9200/new_index?master_timeout=30s"

上述命令中,将master_timeout设置为30s,表示等待主节点响应的最长时间为 30 秒。如果在这个时间内主节点没有完成索引创建操作并返回响应,请求将失败。合理设置master_timeout可以避免因主节点负载过高或网络问题导致的长时间等待,提高操作的效率和可靠性。

5.2 wait_for_active_shards选项

wait_for_active_shards选项用于控制在执行某些操作(如索引创建、文档写入等)时,等待多少个分片处于活动状态才继续执行。Elasticsearch 中的索引由多个分片组成,这些分片分布在不同的节点上以实现高可用性和分布式存储。通过设置wait_for_active_shards,我们可以确保在操作执行前,有足够数量的分片处于可用状态,从而保证数据的安全性和一致性。 比如,我们希望在索引创建时,只有当至少 2 个主分片和所有副本分片都处于活动状态时才继续:

curl -X PUT "localhost:9200/my_index?wait_for_active_shards=2"

这里设置wait_for_active_shards2,意味着索引创建操作会等待至少 2 个活动的主分片(如果索引配置了副本分片,还需等待所有副本分片也处于活动状态)。如果在规定时间内无法满足这个条件,操作将失败。这一选项在对数据可用性要求较高的场景中非常关键,能有效避免因部分分片不可用而导致的数据丢失或不一致问题。

5.3 cluster_manager_timeout选项

cluster_manager_timeout选项与master_timeout类似,但它主要用于设置等待集群管理器响应的超时时间。集群管理器负责处理集群状态的更新和协调节点之间的操作。在一些涉及集群状态变更的复杂操作中,如重新分配分片、调整集群设置等,可能需要等待集群管理器的响应。 例如,当我们尝试重新分配某个索引的分片时:

POST _cluster/reroute?cluster_manager_timeout=60s
{
  "commands": [
    {
      "move": {
        "index": "my_index",
        "shard": 0,
        "from_node": "node1",
        "to_node": "node2"
      }
    }
  ]
}

上述命令中,cluster_manager_timeout设置为60s,表示等待集群管理器响应重新分配分片操作的最长时间为 60 秒。如果在这个时间内集群管理器没有完成操作并返回响应,请求将失败。通过合理设置这个超时时间,可以在保证操作有足够时间完成的同时,避免因长时间等待而影响系统的整体性能。

六、通用选项的组合使用与注意事项

在实际应用中,我们常常需要组合使用多个通用选项来满足复杂的业务需求。然而,组合使用时需要注意各个选项之间的相互影响以及对系统性能和数据一致性的潜在影响。

6.1 选项组合示例

假设我们要在一个电商索引中搜索价格在一定范围内的商品,并按照销量进行降序排序,同时希望以更易读的格式获取响应结果,且只获取与商品名称和价格相关的信息,还要忽略可能存在的不可用索引。可以这样构建请求:

curl -X GET "localhost:9200/ecommerce_index/_search?pretty&ignore_unavailable=true&filter_path=hits.hits._source.product_name,hits.hits._source.price" -H 'Content-Type: application/json' -d'
{
  "query": {
    "range": {
      "price": {
        "gte": 100,
        "lte": 500
      }
    }
  },
  "sort": [
    {
      "sales_volume": {
        "order": "desc"
      }
    }
  ]
}'

在这个示例中,我们组合使用了pretty参数使响应结果易读,ignore_unavailable参数忽略不可用索引,filter_path参数提取特定信息,同时在请求体中设置了价格范围查询和销量排序规则。通过这种方式,我们可以精确地控制搜索操作及其结果,满足电商场景下对商品搜索的特定需求。

6.2 注意事项

  • 性能影响:部分通用选项,如refreshdfs_query_then_fetch等,虽然能满足特定的功能需求,但可能会对性能产生一定影响。频繁使用refresh会增加磁盘 I/O 开销,而dfs_query_then_fetch由于增加了分布式词频统计步骤,会消耗更多的网络和计算资源。因此,在使用这些选项时,需要根据业务场景和性能要求进行权衡。
  • 数据一致性:一些选项的设置可能会影响数据的一致性。例如,wait_for_active_shards选项设置不当,可能导致在部分分片不可用的情况下,数据写入操作仍然继续,从而引发数据不一致问题。在设置与数据写入和集群状态相关的选项时,要充分考虑数据一致性的要求,确保系统的可靠性。
  • 版本兼容性:Elasticsearch 不断更新迭代,部分通用选项的行为或可用性可能会在不同版本中有所变化。在使用新的选项或对现有选项进行调整时,要查阅相应版本的官方文档,确保选项的使用符合当前版本的规范,避免因版本兼容性问题导致的错误或异常行为。

通过深入理解和合理运用 Elasticsearch API 的通用选项,开发人员可以更加灵活、高效地与 Elasticsearch 进行交互,构建出满足各种复杂业务需求的搜索和数据管理应用。在实际应用中,结合具体场景进行选项的选择和组合,并密切关注性能、数据一致性和版本兼容性等方面的问题,是充分发挥 Elasticsearch 强大功能的关键。