前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

1、基本概念和机制

搜索API 的格式有 URIbody 两种形式。大多数搜索 API 都是支持多索引的, Explain API 除外(用于调试性能)

执行搜索时,Elasticsearch 将根据内部的选择公式选择数据的 “最佳”副本。也可以通过提供路由参数 routing 来控制要搜索的分 片。

1.1、路由参数控制分片

路由参数可以是多值的,用逗号分隔的字符串表示,这将会命中 路由值匹配的相关分片

1.1.1、路由值可以是用户名

1.1.1.1、索引 twitter 时,路由值可以是用户名

索引 twitter 时,路由值可以是用户名

入参:

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

1.1.1.2、指定搜索路由参数

在这种情况下,如果只需要在 twitter 上搜索特定用户,可以将其指定为路由,从而使搜索只命中相关的分片,具体实例如下:

入参:

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_selectiontrue 更改为 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_typerequest_cacheallow_partial_search_results 必须作为查询字符串参数传递(不能放在body里面,要放在URL里面)。

2、搜索请求的其余部分应该在主体内 部传递。正文内容也可以作为名为 sourceREST 参数传递。HTTP GETHTTP POST都可以用于执行带Body的搜索

3、terminate_after 始终在 post_filter 之后应用,并在分片上收集到 足够的命中结果后停止查询和聚合。聚合上的文档计数可能不会反映 响应中的 hits.total,因为聚合是在post_filter之前应用的。

4、如果只需要知道是否有任何文档匹配特定的查询,可以将 size 设 置为0,以表示对搜索结果不感兴趣。此外,还可以将 terminate_after设置为1,以指示只要找到第一个匹配的文档(每个 分片),就可以终止查询执行。

4.1、Explain 参数

Explain 参数是 Elasticsearch 提供的辅助 API ,经常不为人所知 和所用。`Explain 参数用来帮助分析文档的相关性分数是如何计算出 来的。

ContactAuthor