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_selection
从false
更改为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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。