官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html
路由 routing
执行搜索时,它将广播到所有索引/索引碎片。我们可以通过提供路由参数来控制将要搜索哪些分片。从而避免无效的查询。例如,当我们想搜索某人的微博时,路由值可以是用户名:如下所示
POST /twitter/tweet?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" }
}
}
}
}
路由参数可以有多值,用逗号分隔的字符串表示。表示路由到多个分片。
2.自适应副本选择 adaptive replica selection
我们可以启用自适应副本选择来替换循环方式发送请求到数据副本,这允许协调节点基于以下标准将请求发送到被认为是“最佳”的副本:
1.协调节点和包含数据副本的节点之间的过去请求的响应时间
2.过去的搜索请求需要在包含数据的节点上执行
3.包含数据的节点上的搜索线程池的队列大小
我们可以通过更改设置打开动态群集
cluster.routing.use_adaptive_replica_selection from false to true:
PUT /_cluster/settings
{
"transient": {
"cluster.routing.use_adaptive_replica_selection": true
}
}
3.统计组
搜索可以与统计分组相关联,统计分组保持每个组的统计聚合。它可以稍后使用索引统计API特别检索。例如,下面是一个搜索主体请求,它将请求与两个不同的组相关联:
POST /_search
{
"query" : {
"match_all" : {}
},
"stats" : ["group1", "group2"]
}
4.全局搜索超时
个人搜索可能会有一个超时作为请求正文搜索的一部分。由于搜索请求可能来自多个来源,因此Elasticsearch为全局搜索超时设置了一个动态群集级别设置,适用于在请求正文搜索中未设置超时的所有搜索请求。默认值是没有全局超时。设置密钥为search.default_search_timeout,可以使用群集更新设置端点进行设置。将此值设置为-1会将全局搜索超时重置为不超时。
5.搜索的并发性和并行性
默认情况下,Elasticsearch不会根据请求命中的分片数量而拒绝任何搜索请求。虽然Elasticsearch将优化协调节点上的搜索执行,但大量的分片可能会对CPU和内存产生重大影响。组织数据通常是一个更好的主意,这样可以减少更大的碎片。如果您想要配置软限制,则可以更新action.search.shard_count.limit群集设置,以拒绝搜索太多分片的搜索请求,
请求参数max_concurrent_shard_requests可用于控制搜索API将为请求执行的最大并发分片请求数。应该使用此参数来保护单个请求不会超载群集(例如,如果每个节点的分片数量很高,默认请求将会触及群集中的所有索引,从而导致碎片请求被拒绝)。此默认值是所有群集中数据节点的数量,但最多为256个
6.查询
查询API允许您执行搜索查询并取回与查询匹配的结果。可以使用简单的查询字符串作为参数或使用请求主体来请求查询。后面我们将会介绍到
多索引多类型
所有查询API都可以应用于索引中的多种类型,并支持多索引语法的多索引。例如,我们可以搜索twitter索引中所有类型的所有文档:
GET /twitter/_search?q=user:kimchy
我们也可以在特定类型中搜索:
GET /twitter/tweet,user/_search?q=user:kimchy
我们还可以在多个索引中搜索具有特定标签的所有推文(例如,每个用户拥有自己的索引时)
GET /kimchy,elasticsearch/_search?q=tag:wow
或者,我们可以使用_all占位符搜索所有可用索引中的所有推文:
GET /_all/_search?q=tag:wow
甚至可以搜索所有索引和所有类型:
GET /_search?q=tag:wow
7.URI查询(使用查询字符串作为参数)
通过提供请求参数,可以纯粹使用URI执行搜索请求。在使用此模式执行搜索时,并非所有搜索选项都显示,但对于快速“卷曲测试”可能非常方便。这里是一个例子:
GET twitter/_search?q=user:kimchy
{
"timed_out": false,
"took": 62,
"_shards":{
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits":{
"total" : 1,
"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
}
}
]
}
}
这种方法通常不建议使用。不过你仍然可以查看官方文档详细学习
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html#_parameters_3
8、通过请求体进行查询