ES_之_搜索数据
前言
Github:https://github.com/HealerJean
1、基本概念和机制
搜索
API
的格式有URI
和body
两种形式。大多数搜索API
都是支持多索引的,Explain
API
除外(用于调试性能)执行搜索时,
Elasticsearch
将根据内部的选择公式选择数据的 “最佳”副本。也可以通过提供路由参数routing
来控制要搜索的分 片。
1.1、路由参数控制分片
路由参数可以是多值的,用逗号分隔的字符串表示,这将会命中 路由值匹配的相关分片
1.1.1、路由值可以是用户名
1.1.1.1、索引 twitter
时,路由值可以是用户名
索引
入参:
POST /twitter/_doc?routing=kimchy
{
"user" : "kimchy",
"postDate" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
1.1.1.2、指定搜索路由参数
在这种情况下,如果只需要在
入参:
POST /twitter/_search?routing=kimchy
{
"query": {
"bool" : {
"must" : {
"query_string" : {
"query" : "some query string here"
}
},
"filter" : {
"term" : { "user" : "kimchy" }
}
}
}
}
1.1.2、自适应副本选择
默认情况下,
Elasticsearch
将使用所谓的自适应副本选择。这使得协调节点可以根据以下条件将请求发送给被认为是“最佳”的副本:⬤ 协调节点和包含数据副本的节点之间过去请求的响应时间
⬤ 在包含数据的节点上执行过去的搜索请求所花费的时间
⬤ 包含数据的节点上搜索
threadpool
的队列大小
PUT /_cluster/settings
{
"transient": {
"cluster.routing.use_adaptive_replica_selection": false
}
}
1.1.4、关闭自适应副本选择
可以通过更改动态集群设置
cluster
.routing.use_adaptive_replica_selection
从true
更改为false
来关闭。如果关闭“自适应副本选择”机制,则在所有数据副本(主分片 和副本)之间以循环方式将搜索发送到相关分片。
1.1.5、控制分片请求并发数
默认情况下,
Elasticsearch
不会因为命中分片数量多而拒绝任 何搜索请求。虽然Elasticsearch
将优化协调节点上的搜索执行,但大量分片会对CPU
和内存产生重大影响。更好地组织数据的方法是分 片数量少,单个分片数据量大。⬤ 如果要配置软限制,可以更新
action.search.shard_count.limit
集 群 设 置 , 以 拒绝 命中 过 多 分 片 的搜索请求。⬤ 请求参数
max_concurrent_shard_requests
,用于控制每个节 点的最大并发分片请求数(每个节点上同时执行请求的分片的数 量)。此参数应用于保护单个请求不会造成集群负载过高(例如,默 认请求将命中集群中的所有索引,如果每个节点的分片数较高,则可 能导致分片请求拒绝)。其默认值是所有群集中数据节点的数量,但 最多为256
。
2、搜索API
搜索
API
(_search
)允许用来执行搜索查询并返回匹配的结果。 可以使用简单查询字符串作为参数提供查询(URI
形式),也可以使 用请求正文(body
形式)。注意:为了确保快速响应,如果一个或多个分片失败,搜索
API
将以部 分结果响应
样例1:所有搜索AP I都支持跨索引机制,并支持多索引语法。例如,搜 索twitter索引中的所有文档:
GET /twitter/_search?q=user:kimchy
样例2:还可以在多个索引中搜索具有特定标记的所有文档,例如当每个 用户有一个索引时
GET /kimchy,Elasticsearch/_search?q=tag:wow
样例3:用_all
搜索所有可用索引
GET /_all/_search?q=tag:wow
3、URI
模式
通过提供请求参数,可以纯粹使用
URI
执行搜索请求。在使用此模式执行搜索时,并非所有搜索选项都可用,但对于快速的“测试” 来说,
序号 | 名称 | 描述 |
---|---|---|
1 | q |
查询字符串(映射到query_string查询,有关详细信息,请参阅 查询字符串查询)。 |
2 | df |
在查询中未定义字段前缀时使用的默认字段。 |
3 | analyzer |
分析查询字符串时要使用的分析器名称。 |
4 | analyze_wildcard |
是否应分析通配符和前缀查询。默认为false。 |
5 | batched_reduce_size |
应在协调节点上一次减少的分片结果数。如果请求中潜在的分片数量很大,则应将此值用作保护机制,以减少每个搜索请求的内存开销。 |
6 | default_operator |
要使用的默认运算符可以是AND或 OR。默认为OR。 |
7 | lenient |
如果设置为true将导致忽略基于格式的失败(如向数字字段提供文本)。默认为false。 |
8 | explain |
对于每个命中,包含如何计算命中得分的解释。 |
9 | _source |
设置为false禁用_source字段检索。您还可以使用_source_include&检索部分文档_source_exclude( 有关详细信息,请参阅请求正文文档) |
10 | stored_fields |
每个匹配返回的文档的选择性存储字段,逗号分隔。不指定任何值将导致没有字段返回。 |
11 | sort |
排序执行。可以是fieldName或 fieldName:asc/ 的形式fieldName:desc。fieldName可以是文档中的实际字段,也可以是特殊_score名称,表示基于分数的排序。可以有几个sort参数(顺序很重要)。 |
12 | track_scores |
排序时,设置为true仍然跟踪分数并将其作为每次命中文档的一部分返回。 |
13 | track_total_hits |
设置为false禁用跟踪与查询匹配的匹配总数。(有关详细信息,请参阅索引排序)。默认为true。 |
14 | timeout |
搜索超时,将搜索请求限制在指定的时间值内执行,并使用在到期时累积的命中文档数进行保释。默认为无超时。 |
15 | terminate_after |
在达到查询执行将提前终止时,为每个分片收集的最大文档数。如果设置,则响应将具有一个布尔字段,terminated_early以指示查询执行是否实际上已终止。默认为no terminate_after。 |
16 | from |
从命中的索引开始返回。默认为0。 |
17 | size |
要返回的命中的文档个数。默认为10。 |
18 | search_type |
要执行的搜索操作的类型。可以是 dfs_query_then_fetch或query_then_fetch。默认为query_then_fetch。有关可以执行的不同搜索类型的更多详细信息,请参阅 搜索类型。 |
19 | allow_partial_search_results |
false如果请求将产生部分结果,则设置为返回整体故障。默认为true,这将允许在超时或部分失败的情况下获得部分结果。 |
4、Body
模式
搜索请求可以在请求正文中使用
Query
DSL
举例:
GET /twitter/_search
{
"query" : {
"term" : { "user" : "kimchy" }
}
}
'
Name | Description |
---|---|
timeout |
默认没有timeout |
batched_reduce_size |
此参数用来限制协调节点(也就是接受请求的节点)一次(批)处理的分片数量,如果命中的分片数量大于此参数值,则会分批执行,默认值为512。如果请求中潜在的分片数量很大,则应将此值用作保护机制,以减少每个搜索请求的内存开销。 |
from |
分页的起始行,默认0; |
size |
分页大小,默认是10 |
search_type |
搜索操作执行的类型,有dfs_query_then_fetch , dfs_query_and_fetch , query_then_fetch , query_and_fetch , count , scan 几种,默认是query_then_fetch |
query_cache |
当?search_type = count 时,查询结果是否缓存 |
terminate_after |
限定每个分片取几个文档。达到数量则提前终止,如果设置了这个参数,则响应将有一个布尔型字段terminated_early 来指示查询执行是否实际已经terminate_early 。 默认为无限制 |
注意:
1、 search_type
、request_cache
和 allow_partial_search_results
必须作为查询字符串参数传递(不能放在body
里面,要放在URL
里面)。
2、搜索请求的其余部分应该在主体内 部传递。正文内容也可以作为名为 source
的 REST
参数传递。HTTP
GET
和 HTTP
POST
都可以用于执行带Body
的搜索
3、terminate_after
始终在 post_filter
之后应用,并在分片上收集到 足够的命中结果后停止查询和聚合。聚合上的文档计数可能不会反映 响应中的 hits.total
,因为聚合是在post_filter
之前应用的。
4、如果只需要知道是否有任何文档匹配特定的查询,可以将 size
设 置为0,以表示对搜索结果不感兴趣。此外,还可以将 terminate_after
设置为1
,以指示只要找到第一个匹配的文档(每个 分片),就可以终止查询执行。
4.1、Explain
参数
Explain
参数是Elasticsearch
提供的辅助API
,经常不为人所知 和所用。`Explain 参数用来帮助分析文档的相关性分数是如何计算出 来的。