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层
支持的路由有
路由 | 说明 | RestAction | TransportAction |
/_search | GET,POST方法 | RestSearchAction | TransportSearchAction |
/{index}/_search | GET,POST方法 | RestSearchAction | TransportSearchAction |
/_msearch | GET,POST方法 | RestMultiSearchAction | TransportMultiSearchAction |
/{index}/_msearch | GET,POST方法 | RestMultiSearchAction | TransportMultiSearchAction |
/{index}/_explain/{id} | GET,POST方法 | RestExplainAction | TransportExplainAction |
/_count | GET,POST方法 | RestCountAction | TransportSearchAction |
/{index}/_count | GET,POST方法 | RestCountAction | TransportSearchAction |
/_search/scroll | DELETE方法 | RestClearScrollAction | TransportClearScrollAction |
/_search/scroll/{scroll_id} | DELETE方法 | RestClearScrollAction | TransportClearScrollAction |
/_search/scroll | GET,POST方法 | RestSearchScrollAction | TransportSearchScrollAction |
/_search/scroll/{scroll_id} | GET,POST方法 | RestSearchScrollAction | TransportSearchScrollAction |
RestSearchAction:将RestRequest请求解析转化为SearchRequest,SearchSourceBuilder来解析消息体。支持的请求参数有
参数 | 说明 |
min_compatible_shard_node | 最小兼容分片节点的版本号 |
index | url中指定的索引名 |
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 |
explain | Fetch阶段在每个返回结果中,将包含评分机制的解释 |
version | Fetch阶段的返回结果中包含version信息 |
seq_no_primary_term | Fetch阶段的返回结果中包含seq_no和primary_term信息 |
timeout | 查询阶段的超时时间 |
terminate_after | 在每个分片中查询的最大条数,如果设置,返回结果中会有一个terminated_early字段 |
stored_fields | fetch阶段创建字段的访问器 |
docvalue_fields | fetch阶段中子阶段FetchDocValuesPhase获取对应的字段信息 |
_source | 是否包含元数据,同时支持_source_includes和_source_excludes。fetch的子阶段FetchSourcePhase来处理 |
track_scores | 评分轨迹,当排序的时候,true表示返回评分的信息。fetch的子阶段FetchScorePhase来处理 |
track_total_hits | 查询阶段,跟踪命中总数 |
sort | 根据字段名排序。在查询和fetch阶段都有使用 |
stats | fetch阶段的慢查询 |
suggest_field | 同时支持suggest_text,suggest_size和suggest_mode。在SuggestPhase阶段使用 |
request_cache | 在查询阶段应用。 不能使用缓存场景包含以下
|
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和排序值给协调节点,协调节点合并这些值到自己的优先队列中,产生一个全局排序后的列表。