ElasticSearch的多索引和多类别

本文介绍了ElasticSearch的空搜索,即无查询条件的搜索操作,它返回集群中所有索引的文档。内容包括响应结构、相关性得分、搜索耗时以及超时设置。此外,讨论了如何通过限定索引和类型进行跨索引搜索,展示了不同类型的搜索示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

空搜索

最基本的搜索API表单是空搜索(empty search),它没有指定任何的查询条件,只返回集群索引中的所有文档:

GET /_search

响应内容(为了编辑简洁)类似于这样:

{
   "hits" : {
      "total" :       14,
      "hits" : [
        {
          "_index":   "us",
          "_type":    "tweet",
          "_id":      "7",
          "_score":   1,
          "_source": {
             "date":    "2014-09-17",
             "name":    "John Smith",
             "tweet":   "The Query DSL is really powerful and flexible",
             "user_id": 2
          }
       },
        ... 9 RESULTS REMOVED ...
      ],
      "max_score" :   1
   },
   "took" :           4,
   "_shards" : {
      "failed" :      0,
      "successful" :  10,
      "total" :       10
   },
   "timed_out" :      false
}

hits

响应中最重要的部分是hits,它包含了total字段来表示匹配到的文档总数,hits数组还包含了匹配到的前10条数据。

hits数组中的每个结果都包含_index_type和文档的_id字段,被加入到_source字段中这意味着在搜索结果中我们将可以直接使用全部文档。这不像其他搜索引擎只返回文档ID,需要你单独去获取文档。

每个节点都有一个_score字段,这是相关性得分(relevance score),它衡量了文档与查询的匹配程度。默认的,返回的结果中关联性最大的文档排在首位;这意味着,它是按照_score降序排列的。这种情况下,我们没有指定任何查询,所以所有文档的相关性是一样的,因此所有结果的_score都是取得一个中间值1

max_score指的是所有文档匹配查询中_score的最大值。

took

took告诉我们整个搜索请求花费的毫秒数。

shards

_shards节点告诉我们参与查询的分片数(total字段),有多少是成功的(successful字段),有多少的是失败的(failed字段)。通常我们不希望分片失败,不过这个有可能发生。如果我们遭受一些重大的故障导致主分片和复制分片都故障,那这个分片的数据将无法响应给搜索请求。这种情况下,Elasticsearch将报告分片failed,但仍将继续返回剩余分片上的结果。

==== timeout

timeout

time_out值告诉我们查询超时与否。一般的,搜索请求不会超时。如果响应速度比完整的结果更重要,你可以定义timeout参数为10或者10ms(10毫秒),或者1s(1秒)

GET /_search?timeout=10ms

Elasticsearch将返回在请求超时前收集到的结果。

超时不是一个断路器(circuit breaker)(译者注:关于断路器的理解请看警告)。

警告

需要注意的是timeout不会停止执行查询,它仅仅告诉你目前顺利返回结果的节点然后关闭连接。在后台,其他分片可能依旧执行查询,尽管结果已经被发送。

使用超时是因为对于你的业务需求(译者注:SLA,Service-Level Agreement服务等级协议,在此我翻译为业务需求)来说非常重要,而不是因为你想中断执行长时间运行的查询。


注意到空搜索的结果中不同类型的文档——usertweet——来自于不同的索引——usgb

通过限制搜索的不同索引或类型,我们可以在集群中跨所有文档搜索。Elasticsearch转发搜索请求到集群中平行的主分片或每个分片的复制分片上,收集结果后选择顶部十个返回给我们。

通常,当然,你可能想搜索一个或几个自定的索引或类型,我们能通过定义URL中的索引或类型达到这个目的,像这样:

在所有索引的所有类型中搜索

在索引gb的所有类型中搜索

在索引gbus的所有类型中搜索

在以gu开头的索引的所有类型中搜索

在索引gb的类型user中搜索

在索引gbus的类型为usertweet中搜索

在所有索引的usertweet中搜索 search types user and tweet in all indices

当你搜索包含单一索引时,Elasticsearch转发搜索请求到这个索引的主分片或每个分片的复制分片上,然后聚集每个分片的结果。搜索包含多个索引也是同样的方式——只不过或有更多的分片被关联。

### Elasticsearch 索引丢失的原因 索引可能因多种因素而丢失。常见的原因包括但不限于硬件故障、网络分区、配置错误以及集群状态不稳定等[^1]。 - **硬件故障**:磁盘损坏或其他存储设备问题可能导致数据永久性损失。 - **网络分区**:当节点之间的通信中断时,可能会导致部分分片不可用或被误认为已失败并触发重新分配过程。 - **配置错误**:不当的操作如删除索引命令执行失误也会造成索引的意外移除。 - **集群健康状况不佳**:如果主节点无法正常工作,则整个集群的状态会受到影响,进而影响到各个索引的安全性可用性。 ### 恢复方法 针对上述情况,Elasticsearch 提供了几种不同的方式来进行索引分片的恢复: #### 自动恢复机制 一旦检测到某个分片变得不可用(例如由于节点崩溃),Elasticsearch 将尝试通过现有副本来自动重建缺失的部分。这通常发生在以下几种情况下之一: - 当一个节点离线后再次加入集群; - 如果有新的节点加入了集群并且有足够的资源来容纳额外的数据副本; 此过程中涉及的具体操作取决于当前环境下的条件策略设定[^2]。 #### 手动干预措施 对于更复杂的情形或是希望加快恢复速度的情况,可以采取一些手动手段辅助处理: ##### 使用快照功能备份与还原 利用内置工具创建定期增量式的快照保存至外部介质上,在遇到灾难事件发生之后可以从最近一次完整的存档中快速拉起服务继续运行[^3]。 ```bash POST /_snapshot/my_backup/snapshot_1/_restore { "indices": "lost_index", "include_global_state": false, "rename_pattern": "index_(.+)", "rename_replacement": "restored_index_$1" } ``` 此处展示了如何定义一个简单的 JSON 请求体用于指定要恢复的目标索引名称以及其他选项参数。 ##### 调整高级设置优化性能表现 适当调整 `cluster.routing.allocation.*` 类别的参数可以帮助提高效率,比如允许跨数据中心同步或者限制特定类型的迁移活动范围等等[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值