Search API

大多数搜索API都是多索引的,但Explain API端点除外。

路由

执行搜索时,它将广播到所有索引/索引碎片(副本之间的循环负载),可以通过提供routing参数来控制将搜索哪些碎片,例如,在索引推文时,路由值可以是用户名:

POST /twitter/_doc?routing=kimchy
{
    "user" : "kimchy",
    "postDate" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}

在这种情况下,如果我们只想搜索特定用户的推文,我们可以将其指定为路由,从而导致搜索只触及相关的分片:

POST /twitter/_search?routing=kimchy
{
    "query": {
        "bool" : {
            "must" : {
                "query_string" : {
                    "query" : "some query string here"
                }
            },
            "filter" : {
                "term" : { "user" : "kimchy" }
            }
        }
    }
}

路由参数可以是多值的,表示为逗号分隔的字符串,这将导致命中路由值匹配的相关碎片。

自适应副本选择

作为以循环方式发送到数据副本的请求的替代方法,你可以启用自适应副本选择,这允许协调节点根据许多标准将请求发送到被认为“最佳”的副本:

  • 协调节点与包含数据副本的节点之间的过去请求的响应时间。
  • 在包含数据的节点上执行过去的搜索请求所需的时间。
  • 在包含数据的节点上搜索线程池的队列大小。

这可以通过将动态集群设置cluster.routing.use_adaptive_replica_selectionfalse更改为true来启用此功能:

PUT /_cluster/settings
{
    "transient": {
        "cluster.routing.use_adaptive_replica_selection": true
    }
}

统计组

搜索可以与统计组相关联,统计组维护每个组的统计聚合,稍后可以使用索引统计API专门检索它,例如,以下是将请求与两个不同的组相关联的搜索体请求:

POST /_search
{
    "query" : {
        "match_all" : {}
    },
    "stats" : ["group1", "group2"]
}

全局搜索超时

作为请求体搜索的一部分,单个搜索可以有一个超时设置,由于搜索请求可以源自多个源,因此Elasticsearch具有全局搜索超时的动态集群级设置,适用于未在请求正文中设置超时的所有搜索请求。这些请求将在指定时间后使用下一节“搜索取消”中描述的机制取消,因此,关于超时响应的相同警告也适用。

设置键为search.default_search_timeout,可以使用群集更新设置端点进行设置,默认值为无全局超时,将此值设置为-1会将全局搜索超时重置为无超时。

搜索取消

可以使用标准任务取消机制取消搜索,默认情况下,正在运行的搜索仅检查是否在片段边界上取消它,因此取消可能会被大段延迟。通过将动态集群级别设置的search.low_level_cancellation设置为true,可以提高搜索取消响应性,但是,它带来了更频繁的取消检查的额外开销,这在大型快速运行的搜索查询中是非常明显的,更改此设置仅影响更改后开始的搜索。

搜索并发性和并行性

默认情况下,Elasticsearch不会根据请求命中的碎片数拒绝任何搜索请求,虽然Elasticsearch将优化协调节点上的搜索执行,但大量碎片会对CPU和内存产生重大影响。通常,以更少的较大碎片的方式组织数据是一个更好的主意,如果你要配置软限制,你可以更新action.search.shard_count.limit群集设置,以拒绝搜索过多碎片的搜索请求。

请求参数max_concurrent_shard_requests可用于控制搜索API将为请求执行的最大并发碎片请求数。此参数应用于保护单个请求不会使群集过载(例如,默认请求将命中群集中的所有索引,如果每个节点的碎片数量很高,则可能导致碎片请求被拒绝),此默认值基于群集中的数据节点数,但最多为256个。

搜索

搜索API允许你执行搜索查询并返回与查询匹配的搜索命中,可以使用简单查询字符串作为参数或使用请求体来提供查询。

多索引

所有搜索API都可以应用于多个索引,并支持多索引语法,例如,我们可以搜索twitter索引中的所有文档:

GET /twitter/_search?q=user:kimchy

我们还可以在多个索引中搜索具有特定标记的所有文档(例如,当每个用户有一个索引时):

GET /kimchy,elasticsearch/_search?q=tag:wow

或者我们可以使用_all搜索所有可用的索引:

GET /_all/_search?q=tag:wow

上一篇:?refresh

博弈
2.5k 声望1.5k 粉丝

态度决定一切