Search APIs
除了Explain API端点之外,大多数搜索API都是多索引的。
Routing
执行搜索时,Elasticsearch将根据自适应副本选择公式选择数据的“最佳”副本。通过提供路由参数,还可以控制搜索哪些切片。例如,当索引twitter时,路由值可以是用户名:
POST /twitter/_doc?routing=kimchy
{
"user" : "kimchy",
"postDate" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
在这种情况下,如果我们只想搜索特定用户的twitter,我们可以将其指定为路由,结果搜索只命中相关的分片:
POST /twitter/_search?routing=kimchy
{
"query": {
"bool" : {
"must" : {
"query_string" : {
"query" : "some query string here"
}
},
"filter" : {
"term" : { "user" : "kimchy" }
}
}
}
}
路由参数可以由多个值表示为逗号分隔的字符串。这将导致命中路由值匹配的相关分片。
自适应replica选择
默认情况下,Elasticsearch将使用所谓的自适应副本选择。这使得协调节点可以根据以下条件将请求发送给被认为是“最佳”的副本:
协调节点和包含数据副本的节点之间过去请求的响应时间
在包含数据的节点上执行过去的搜索请求所花费的时间
包含数据的节点上搜索threadpool的队列大小
这可以通过更改动态集群设置cluster.routing.use_adaptive_replica_selection从true更改为false来关闭。
PUT /_cluster/settings
{
"transient": {
"cluster.routing.use_adaptive_replica_selection": false
}
}
如果关闭自适应副本选择,搜索将在所有数据副本(主分片和副本分片)之间以循环方式发送到索引/索引分片。
数据组
搜索可以与stats组关联,stats组维护每个组的统计信息聚合。稍后可以使用indices stats API专门检索它。例如,这里有一个搜索主体请求,它将请求与两个不同的组关联起来:
POST /_search
{
"query" : {
"match_all" : {}
},
"stats" : ["group1", "group2"]
}
全局搜索超时
作为请求主体搜索的一部分,单个搜索可以有一个超时。由于搜索请求可以来自多个源,Elasticsearch为全局搜索超时设置了动态集群级别的设置,该设置适用于所有未在请求体中设置超时的搜索请求。这些请求将在指定的时间之后使用下面关于取消搜索的小节中描述的机制被取消。因此,关于超时响应性也需要注意。
设置键是search.default_search_timeout,可以使用集群更新设置端点设置。默认值是无全局超时。将此值设置为-1将全局搜索超时重置为”no timeout”。
搜索取消
可以使用标准的任务取消机制取消搜索。默认情况下,正在运行的搜索只检查它是否在segment边界上被取消,因此取消可以被large segments延迟。通过将动态集群级别设置search.low_level_cancellation设置为true,可以提高搜索取消响应性。但是,它带来了更频繁的取消检查的额外开销,这在大型快速运行的搜索查询中是显而易见的。 更改此设置仅影响更改后开始的搜索。
搜索并发性和并行性
默认情况下,Elasticsearch不会根据请求命中的分片数量拒绝任何搜索请求。虽然Elasticsearch将优化协调节点上的搜索执行,但是大量分片会对CPU和内存方面产生显著影响。通常,以较少较大分片的方式组织数据是一个更好的主意。如果要配置软限制,可以更新action.search.shard_count.limit群集设置,以拒绝搜索过多分片的搜索请求。。
请求参数max_concurrent_shard_requests可用于控制搜索API将为请求的每个节点执行的最大并发分片请求数量。此参数应用于保护单个请求不使集群过载(例如,默认请求将命中集群中的所有索引,如果每个节点的分片数量很高,则可能导致分片请求拒绝)。这个默认值是5。
Search
search API允许您执行搜索查询并返回匹配查询的搜索结果。可以使用简单的查询字符串作为参数提供查询,也可以使用请求体。
Multi-Index
所有搜索api都可以跨多个索引应用,并支持多索引语法。例如,我们可以搜索twitter索引中的所有文档:
GET /twitter/_search?q=user:kimchy
我们也可以在多个索引中搜索带有特定标签的所有文档(例如,当每个用户有一个索引时):
GET /kimchy,elasticsearch/_search?q=tag:wow
或者我们可以使用_all搜索所有可用的索引:
GET /_all/_search?q=tag:wow
部分响应
为了确保快速响应,如果一个或多个碎片失败,search API将返回部分结果。有关更多信息,请参见Shard failures。
URI Search
通过提供请求参数,可以纯粹使用URI执行搜索请求。在使用这种模式执行搜索时,并不是所有的搜索选项都是公开的,但是它对于快速的“curl测试”非常方便。举个例子:
GET twitter/_search?q=user:kimchy
这里有一个简单响应:
{
"timed_out": false,
"took": 62,
"_shards":{
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits":{
"total" : {
"value": 1,
"relation": "eq"
},
"max_score": 1.3862944,
"hits" : [
{
"_index" : "twitter",
"_type" : "_doc",
"_id" : "0",
"_score": 1.3862944,
"_source" : {
"user" : "kimchy",
"date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch",
"likes": 0
}
}
]
}
}
参数
URI中允许的参数是:
q
查询字符串(映射到query_string查询,有关详细信息,请参见查询字符串查询)。
df
当查询中没有定义字段前缀时使用的默认字段。
analyzer
分析查询字符串时使用的分析器名称。
analyze_wildcard
是否应该分析通配符和前缀查询。默认值为false。
batched_reduce_size
在协调节点上应该立即减少分片结果的数量。如果请求中的分片数量可能很大,则应使用此值作为保护机制,以减少每次搜索请求的内存开销。
default_operator
要使用的默认操作符可以是AND或or。默认为or
lenient
如果设置为true,将导致忽略基于格式的失败(比如向数值字段提供文本)。默认值为false。
explain
对于每个命中,包含如何计算命中的得分的说明。
_source
设置为false以禁用_source字段的检索。您还可以使用_source_include和_source_exclude来检索文档的一部分(有关详细信息,请参阅请求主体文档)
stored_fields
要为每次命中返回的文档的选择存储字段,以逗号分隔。不指定任何值将导致没有字段返回。
sort
排序来执行。可以是fieldName的形式,也可以是fieldName:asc/fieldName:desc。字段名可以是文档中的实际字段,也可以是特殊的_score名称,用于表示基于分数的排序。可以有几个排序参数(顺序很重要)。
track_scores
排序时,将其设置为true,以便仍然跟踪分数并在每次命中时返回分数。
track_total_hits
默认为10000。设置为false,以便禁用对匹配查询的总命中数的跟踪。它还接受一个整数,在本例中,该整数表示要精确计数的命中次数。(有关更多细节,请参阅请求主体文档)
timeout
搜索超时,限定要在指定时间值内执行的搜索请求的范围,并使用过期时累积到该点的点击率保释。默认不超时。
terminate_after
为每个分片收集的最大文档数量,当达到该数量时,查询执行将提前终止。如果设置了,响应将具有一个布尔字段terminated_early,以指示查询执行是否实际终止了terminated_early。默认值为no terminate_after。
from
从点击率的索引开始返回。默认值为0。
size
返回的命中数。默认为10。
search_type
要执行的搜索操作的类型。可以是dfs_query_then_fetch或query_then_fetch。默认为query_then_fetch。有关可执行的不同搜索类型的详细信息,请参阅搜索类型。
allow_partial_search_results
如果请求将产生部分结果,则将其设置为false,以返回总体故障。缺省值为true,在超时或部分失败的情况下,这将允许部分结果。可以使用集群级别的设置search.default_allow_partial_results控制此默认值。