Search API

搜索这一章并不是将具体那些搜索语句,而是es的搜索是怎么设计的,有很多东西我从来没想过,感觉也是非常精彩。

Routing

在执行一次搜索时,这个消息将被广播到所有索引/分片(副本之间的轮询调度),可以通过提供路由参数可以控制要搜索的分片。
例如,在索引tweets时,路由值可以是user的值。

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

这部分内容在 Mapping 之 Meta-Fields 那篇文章已经讲过了。
routing参数的值就对应着某个分片,直到这个就行了。

Adaptive Replica Selection

轮询调度过程,是对副本进行循环的请求等待请求的响应。
另一种替代轮询调度请求副本的方式,是你设定adaptive_replica_selection的参数为 true,像下面这样。

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

上面设置之后,有一个起“协调”作用的节点根据多个标准将请求发送给被认为是“最佳”的副本,主要判断标准是下面几个:
1.以前协调节点与包含数据副本的节点之间请求的响应时间;
2.以前在包含数据的节点上执行请求的时间;
3.包含数据的节点上的搜索线程池的队列大小

Stats Groups

这个我看了比较久,不一定理解的对。
搜索可以与Stats的组概念相关联,STATS可以维护每个组的统计聚合。它可以稍后使用索引indices stats API具体检索。
我认为大概的场景就是你可以在搜索的时候,你可以给自己起个组名,这样es可以记录各个组的搜索记录。

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

上面这一段就是group1和group2(这个随便起)用match_all搜索了一次。

GET _stats/search?groups=_all

可以用这句话去看各个组的搜索记录。

Global Search Timeout

单个搜索可以把超时这个参数作为请求体搜索的一部分。由于搜索请求可以源自许多源,所以Elasticsearch有一个动态集群级别的关于全局搜索超时的设置,该设置适用于在请求体中没有设置超时的所有搜索请求。
这些请求可以使用Search Cancellation机制在指定时间之后取消。因此,关于响应超时的警告同样值得注意。
这个设置的关键是使用search.default_search_timeout,可以使用 Cluster Update Settings来设置。默认没有全局超时值,设置此值为-1将全局搜索超时重置为无超时。

Search Cancellation

可以使用标准 task cancellation 机制来取消搜索。默认情况下,正在运行的搜索只检查它在在倒排索引边界上是否已经被取消,因此如果倒排索引很多取消可能会有延迟。
通过设置search.low_level_cancellation为true,来提高搜索取消的反应灵敏度。但是,在大型快速运行的搜索查询中,它带来了更频繁的取消检查的额外开销。更改此设置只会影响在更改之后进行的搜索。

Search concurrency and parallelism(搜索并发和并行)

默认情况下,es不会根据请求命中的碎片数量拒绝任何搜索请求。
虽然Elasticsearch会优化协调节点上的搜索执行,但是大量分片可能对CPU和内存有重大影响。组织数据通常是一种更好的方法,即分片变少。如果希望配置软限制,可以更新集群设置中的action.search.shard_count.limit参数,以便拒绝命中太多分片的搜索请求。
这个软限制就是不是直接去设置分片,而是使用参数不去访问过多分片。

请求参数max_concurrent_shard_requests可用于控制搜索API针对请求执行的并发分片请求的最大数量。这个参数应该用于保护单个请求不超载集群(例如,缺省请求将命中集群中的所有索引,如果每个节点的碎片数量很高,则会导致碎片请求拒绝)。此缺省值基于集群中的数据节点数量,但最多为256。
就是你搜索整个ES,es有很多索引,每个索引又有很多分片,这个并发的查询要限制。

发表评论

电子邮件地址不会被公开。