es之搜索模块

1、搜索组件

SearchModule中包含以下相关组件

SmoothingModel:平滑模型,是平衡索引中不存在的稀有n-gram词元和索引中存在的高频n-gram词元之间的权重。提供三种平滑模型

  • Stupid backoff
  • Laplace平滑(加法平滑)
  • 线性插值

Highlighter:从搜索结果中的一个或者多个字段中获取突出显示的片段。支持三种

  • PlainHighlighter
  • FastVectorHighlighter
  • UnifiedHighlighter

ScoreFunctionSpec:用于解析请求中的自定义打分

QuerySpec:用于解析请求中的查询类型

RescoreSpec:用于解析请求中的重新评分。

SortBuilder:用于定义解析sort字段,根据规则构建排序

DocValueFormat:用于搜索请求的排序及其格式化(SearchSortValuesAndFormats)

SignificanceHeuristicSpec:用于SignificantTermsAggregationBuilder和SignificantTextAggregationBuilder中的ObjectParser来解析聚合参数中的对应参数。支持cli_square, gnd,jlh, mutual_information,percentage和script_heuristic

AggregationSpec:聚会相关的组件,包含平均、加权平均及求和等聚合

PipelineAggregationSpec:管道聚合,对其他聚合结果进行二次聚合,不仅具有子聚合,还可以根据其类型,引用buckets_path允许管道聚合链接的另一个管道

FetchSubPhase:查询中两阶段中的fetch阶段的子阶段。包含以下几个子阶段

  • ExplainPhase
  • FetchDocValuesPhase
  • ScriptFieldsPhase
  • FetchSourcePhase
  • FetchFieldsPhase
  • FetchVersionPhase
  • SeqNoPrimaryTermPhase
  • MatchedQueriesPhase
  • HighlightPhase
  • FetchScorePhase
  • InnerHitsPhase

SearchExtSpec:搜索扩展的自定义规格。

ShapeBuilder:添加ShapeBuilder的reader(用于服务器间的通信),用于shape的创建。支持以下类型

  • PointBuilder
  • CircleBuilder
  • EnvelopBuilder
  • MultiPointBuilder
  • LineStringBuilder
  • MultiLineStringBuilder
  • PolygonBuilder
  • MultiPolygonBuilder
  • GeometryCollectionBuilder

注意这是在ShapsAvailability.JTS_AVAILABLE和ShapsAvailability.SPATIAL4J_AVAILABLE为true时

IntervalsSourceProvider:用于IntervalQuery的查询。支持以下类型

  • IntervalsSourceProvider.Match
  • IntervalsSourceProvider.Combine
  • IntervalsSourceProvider.Disjunction
  • IntervalsSourceProvider.Prefix
  • IntervalsSourceProvider.Wildcard
  • IntervalsSourceProvider.Fuzzy

SortValue: 用于InternalAggregation的参数,主要包含以下几种

  • DoubleSortValue
  • LongSortValue
  • BytesSortValue

2、搜索插件相关组件

3、Rest层

支持的路由有

路由说明RestActionTransportAction
/_search  GET,POST方法RestSearchActionTransportSearchAction
/{index}/_searchGET,POST方法RestSearchActionTransportSearchAction
/_msearchGET,POST方法RestMultiSearchActionTransportMultiSearchAction
/{index}/_msearchGET,POST方法RestMultiSearchActionTransportMultiSearchAction
/{index}/_explain/{id}GET,POST方法RestExplainActionTransportExplainAction
/_countGET,POST方法RestCountActionTransportSearchAction
/{index}/_countGET,POST方法RestCountActionTransportSearchAction
/_search/scrollDELETE方法RestClearScrollActionTransportClearScrollAction
/_search/scroll/{scroll_id}DELETE方法RestClearScrollActionTransportClearScrollAction
/_search/scrollGET,POST方法RestSearchScrollActionTransportSearchScrollAction
/_search/scroll/{scroll_id}GET,POST方法RestSearchScrollActionTransportSearchScrollAction

 RestSearchAction:将RestRequest请求解析转化为SearchRequest,SearchSourceBuilder来解析消息体。支持的请求参数有

参数说明
min_compatible_shard_node最小兼容分片节点的版本号
indexurl中指定的索引名
batched_reduce_size用来限制协调节点一次批处理的分片数量,如果命中的分片数量大于此参数值,则会分批执行,默认值是 512
pre_filter_shard_size预过滤分片大小,默认值是128.如果预过滤分片大小小于待查分片大小,则开启预过滤
max_concurrent_shard_requests最大并发分片请求,默认值是5。限制单节点上最大并发分片请求数。用于AbstractSearchAsyncAction中的throttleConcurrentRequests
allow_partial_search_results允许返回部分搜索结果。如果成功返回的搜索结果小于分片的个数,会抛出异常。
search_type不允许指定搜索类型为 query_and_fetch和dfs_query_and_fetch
q查询字符串
df当查询中没有定义前缀的时候默认使用的字段
analyzer当分析查询字符串的时候使用的分词器
analyze_wildcard通配符或者前缀查询是否被分析,默认为false
lenient如果设置为true,字段类型转换失败时被忽略,默认为fasle
default_operator默认多个条件的关系,AND或者OR,默认为OR
from查询阶段返回的索引匹配结果的开始值,默认是0
size搜索结果返回的条数,默认是10
explainFetch阶段在每个返回结果中,将包含评分机制的解释
versionFetch阶段的返回结果中包含version信息
seq_no_primary_termFetch阶段的返回结果中包含seq_no和primary_term信息
timeout查询阶段的超时时间
terminate_after在每个分片中查询的最大条数,如果设置,返回结果中会有一个terminated_early字段
stored_fieldsfetch阶段创建字段的访问器
docvalue_fieldsfetch阶段中子阶段FetchDocValuesPhase获取对应的字段信息
_source是否包含元数据,同时支持_source_includes和_source_excludes。fetch的子阶段FetchSourcePhase来处理
track_scores评分轨迹,当排序的时候,true表示返回评分的信息。fetch的子阶段FetchScorePhase来处理
track_total_hits查询阶段,跟踪命中总数
sort根据字段名排序。在查询和fetch阶段都有使用
statsfetch阶段的慢查询
suggest_field同时支持suggest_text,suggest_size和suggest_mode。在SuggestPhase阶段使用
request_cache

在查询阶段应用。

不能使用缓存场景包含以下

  • 有scroll
  • 搜索类型为DFS_QUERY_THEN_FETCH
  • profile的查询
  • 没有显示设置请求缓存时,index.requests.cache.enable为false或者为true但是size>0
  • request_cache设置为false
scroll滚动查询,初始化查询传递参数scroll=5同,会返回一个_scroll_id用于下次查询时传入。5m表示_scroll_id缓存5分钟,之后自动过期。
routing协调节点在构造分发请求时使用到
preference以控制读流量优先走哪些分片,控制分片选择策略
索引相关参数expand_wildcards:扩展到哪种具体Index通配符表达式。如果指定了open,则通配符表达式将扩展为仅开放的Index;如果指定了closed,则通配符表达式将仅扩展为关闭的Index。也可以指定两个值(打开、关闭)以展开到所有索引。
ignore_unavailable:是否忽略任何指定的Index不可用的状态,这包括不存在的Index或关闭的Index。可以指定true或false
allow_no_indices:如果通配符索引表达式没有找到对应的的Index,是否失败,同样指定true或false。例如,如果指定了通配符表达式good*,并且没有以good开头的Index,那么根据这个设置,请求将失败。当_all、*或没有指定Index时,此设置也适用。这种设置也适用于别名,以防别名指向一个关闭的Index。
ignore_throttled:忽略冻结的索引 
ccs_minimize_roundtrips跨集群搜索

4、Transport层

 搜索操作主要是通过AbstractSearchAsyncAction来完成的,其结构如下

 SearchQueryThenFetchAsyncAction:对应的是query_then_fetch,也是默认的搜索类型

SearchDfsQueryThenFetchAsyncAction:对应的是dfs_query_then_fetch搜索类型

CanMatchPreFilterSearchPhase:满足以下条件时

  • 设置了请求参数pre_filter_shard_size小于待查询的分片数
  • 聚合请求不需要访问所有doc或者请求的sorts为FieldSortBuilder

4.1 分布式搜索

其活动图如下

分布式查询是分阶段的,查询阶段为AbstractSearchAsyncAction,fetch阶段为FetchSearchPhase。都继承SearchPhase。

查询阶段:在初始查询阶段,查询会广播到索引上每一个分片副本(主分片或者副分片)。每个分片在本地执行搜索并构建一个匹配文档的优先队列。

QUERY_THEN_FETCH搜索类型的查询阶段步骤为

  • 客户端发送search请求到协调节点
  • 协调节点将查询请求转发到索引的每个主分片或者副分片
  • 每个分片在本地执行查询,并使用本地的Term/Document Frequency信息进行打分,添加结果到大小为from+sizer的本地有序优先队列中
  • 每个分片返回各自优先队列中所有文档的ID和排序值给协调节点,协调节点合并这些值到自己的优先队列中,产生一个全局排序后的列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值