首批通过分布式安全可靠测评,为关键业务系统打造
HYBRID_SEARCH
更新时间:2026-08-05 14:51:35
HYBRID_SEARCH 用于在一条 SELECT 语句中,通过符合本文档规则的 JSON 字符串描述全文搜索、向量搜索与过滤条件,并返回按融合策略排序后的行。
注意
本语法仅适用于 MySQL 模式。
语法
SELECT select_expr_list
FROM HYBRID_SEARCH(TABLE table_name, dsl_string) [table_alias];
-- select_expr_list 为 SELECT 列表,与常规 SELECT 语法一致
参数说明
| 参数 | 说明 |
|---|---|
table_name |
目标表名。仅支持堆表(ORGANIZATION = HEAP),可为分区表或非分区表。 |
dsl_string |
JSON 字符串,描述 query、knn、rank、rerank、from、size、min_score 等。
注意除下文“限制和说明”中列出的差异外,其余语法结构及参数说明与 SEARCH 的 |
全局限制与说明
本节只列出语法限制,功能限制请参见文末相关文档索引混合搜索(SQL 接口),需结合本节内容一并理解。
说明如下:
- 顶层
query(全文搜索)和knn(向量搜索)加起来最多允许有三个子查询:query算一个;knn如果是对象算一个,如果是数组则每个元素各算一个。三者总数不得超过三个,并且至少要包含一个全文搜索或向量搜索。 - 对于查询的列名,大小写不敏感。
- 向量查询的
query_vector,推荐用字符串输入向量。 min_score参数只有 SQL 接口支持,PL 接口不支持。query和每个knn都是相互独立的搜索路径,彼此的filter互不影响。如果某一路查询需要过滤条件,必须在该路径下单独指定对应的filter。所有搜索结果会合并为一个结果集,并基于融合算法进行打分排序,最终返回前size条结果。rerank须与query或knn同时使用,不能单独出现;执行顺序为先粗排、后精排,不支持仅用rerank替代rank的融合能力。
限制如下:
- 不支持
rank_feature,es_mode,_source参数。 - 不支持在与
HYBRID_SEARCH同层直接使用WHERE/ORDER BY/LIMIT;若需要进一步过滤或排序,请将混搜结果作为子查询再处理。例如:-- 不支持:与 HYBRID_SEARCH 同层使用 WHERE SELECT id FROM HYBRID_SEARCH(TABLE doc_table, '{"knn":{"field":"vector","k":5,"query_vector":"[1,2,3]"}}') WHERE id > 3; -- 支持:先子查询,再过滤 SELECT id FROM ( SELECT id FROM HYBRID_SEARCH(TABLE doc_table, '{"knn":{"field":"vector","k":5,"query_vector":"[1,2,3]"}}') ) t WHERE id > 3; - 部分嵌套 JSON/ARRAY 元素路径不支持下推,如
json的path里如果是array,元素是json,不支持再对这个json元素指定路径。 - 标量查询条件,包括
term/range/terms/wildcard/ JSON 表达式 / 数组表达式。其中wildcard支持在顶层query、bool.must/bool.should中参与算分;置于bool.filter/bool.must_not/knn.filter时仅作硬过滤。其他标量查询条件不参与算分,不支持boost,且不可放在bool的must/should中。 - 非顶层全文查询的
boost、bool查询的boost、全文查询的列权重和词权重,要求大于0,其他情况的boost要求大于等于0。 multi_match/query_string多查询的多个全文列,必须是使用相同的字符集和collation,全文索引必须使用相同的parser。match/multi_match/query_string用于词项级匹配时,对应全文列应使用FTS_INDEX_TYPE = MATCH(或未指定时与MATCH等价的默认类型)。match_phrase仅适用于已创建FTS_INDEX_TYPE = PHRASE_MATCH的全文索引列。
DSL_STRING 参数语法结构
dsl_string 是 JSON 格式的字符串,其语法结构将在此节详细介绍,请配合下文参数和示例一起理解。
建议阅读顺序
先看 DSL_STRING 参数骨架示例(整体由哪些顶层字段组成),再按需对照 语法定义 中的 BNF 分块;各字段含义与约束以 详细参数说明 表格为准。端到端建表与更多场景示例见文末相关文档索引混合搜索(SQL 接口)。
语法说明
本节介绍 BNF(Backus-Naur Form,巴科斯范式)语法符号的含义和使用规则:
可选参数表示
[ ]在 BNF 中表示可选多个元素,如param_list = param [, param]*表示param_list可以包含 1 个或多个param。rank_expression中[ ]也表示子参数可选。[, "boost" : boost_value]代表在支持boost的表达式中该子参数可选;term/range/terms及 JSON/ARRAY 标量表达式不支持boost。
数组表示
[ ]在 JSON 结构中表示数组,如[condition_list]。
选择关系
|表示选择关系,如param = "query" | "knn"表示 param 可以是 "query" 或 "knn"。
重复表示
*表示 0 次或多次重复,如param_list = param [, param]*表示param_list可以包含 1 个或多个param。
JSON 格式要求
- 所有 JSON 列名和字符串值都需要用双引号包围。
- 数值不需要用双引号包围。
语法定义
本节详细介绍 dsl_string 的语法结构,参数说明请参考下方详细参数说明表格。
DSL_STRING 参数骨架示例
下面是一条与下文“全文与向量 RRF 混合搜索”示例等价的 dsl_string 骨架:顶层可同时出现 query(全文)、knn(向量)、rank(融合粗排)、rerank(模型精排)、from / size(分页)等。只需一路搜索时,删除不需要的顶层键即可;SQL 接口还可选增加 min_score,具体见参数表。
SELECT * FROM HYBRID_SEARCH(
TABLE doc_table,
'{
"query": {
"match": {
"content": "oceanbase mysql"
}
},
"knn": {
"field": "vector",
"k": 5,
"query_vector": "[1,2,3]"
},
"rank": {
"rrf": {
"rank_window_size": 10,
"rank_constant": 60
}
},
"rerank": {
"model": "rerank_model",
"field": "content",
"query": "oceanbase mysql",
"rank_window_size": 10
},
"from": 0,
"size": 10
}'
);
顶层参数结构
顶层参数结构用于指定混合搜索的参数。
dsl_string = '{param_list}'
param_list = param [, param]*
-- query 和 knn 至少必选一个;混合搜索时可同时使用
param = "query" : {query_expression | search_options} --包含查询表达式或查询选项
| "knn" : {knn_expression}
| "rank" : {rank_expression}
| "rerank" : {rerank_params} -- 从 V4.6.0 BP1 版本开始支持
| "from" : number
| "size" : number
| "min_score" : number -- 仅 SQL 接口支持
查询表达式结构
查询表达式结构用于指定混合搜索中的全文、标量查询条件,并支持配置查询选项。
query_expression = bool_query | scalar_term | fulltext_term
bool_query = "bool" : {bool_condition_list}
bool_condition_list = bool_condition [, bool_condition]*
bool_condition = "must" : [condition_list]
| "should" : [condition_list]
| "must_not" : [condition_list]
| "filter" : [condition_list]
| "boost" : boost_value
condition_list = query_expression [, query_expression]*
bool 下 must / should / must_not / filter 的值均为查询表达式数组:数组中每一项仍是完整的 query_expression(可继续嵌套 bool 或接 match / term 等)。下面仅展示 query 对象的内层片段示例:
{
"bool": {
"must": [
{
"match": {
"content": "oceanbase"
}
}
],
"filter": [
{
"term": {
"status": 1
}
}
]
}
}
标量查询结构
用于定义单个词条中的标量查询表达式,包含 range_query、term_query、terms_query、wildcard_query,表示范围查询、精准匹配、多值匹配、通配符匹配。
scalar_term = range_query | term_query | terms_query | wildcard_query
range_query = "range" : {"field_name" : {range_condition_list}}
range_condition_list = range_condition [, range_condition]*
range_condition = "gte" : number
| "gt" : number
| "lte" : number
| "lt" : number
term_query = "term" : {term_condition_list}
term_condition_list = term_condition [, term_condition]*
term_condition = "field_name" : scalar_value
| "field_name" : term_value_object
term_value_object = "value" : scalar_value
terms_query = "terms" : {terms_condition_list}
terms_condition_list = terms_condition [, terms_condition]*
terms_condition = "field_name" : [scalar_value_list]
scalar_value_list = scalar_value [, scalar_value]*
wildcard_query = "wildcard" : {wildcard_condition_list} -- 从 V4.6.0 BP1 版本开始支持
wildcard_condition_list = wildcard_condition [, wildcard_condition]*
wildcard_condition = "field_name" : wildcard_pattern
| "field_name" : {wildcard_value_object}
wildcard_pattern = "string_value" | number | boolean
wildcard_value_object = wildcard_value_body [, "boost" : boost_value]
wildcard_value_body = "value" : wildcard_pattern
| "wildcard" : wildcard_pattern
全文查询结构
用于定义单个词条中的全文查询表达式,包含 match_query、match_phrase_query、query_string、multi_match,表示词项级匹配、短语级匹配、全文查询、多列词项级匹配。
fulltext_term = match_query | match_phrase_query | query_string | multi_match
match_query = "match" : {"field_name" : match_body}
match_body = "string_value" | {match_condition}
match_condition = "query" : "string_value" [, "operator" : ("OR" | "AND")] [, "minimum_should_match" : number] [, "boost" : boost_value]
match_phrase_query = "match_phrase" : {"field_name" : phrase_body}
phrase_body = "string_value" | {phrase_condition}
phrase_condition = "query" : "string_value" [, "slop" : number] [, "boost" : boost_value]
query_string = "query_string" : {query_string_condition}
query_string_condition = "fields" : [field_weight_list]
| "query" : "string_value" -- 可含词元级 ^,具体见下文「权重运算符说明」
| "boost" : boost_value
| "type" : ("best_fields" | "most_fields")
| "default_operator" : ("AND" | "OR")
| "minimum_should_match" : number
multi_match = "multi_match" : {multi_match_condition}
multi_match_condition = "fields" : [field_weight_list]
| "query" : "string_value" -- 不支持查询串内词元级 ^
| "boost" : boost_value
| "type" : ("best_fields" | "most_fields")
| "operator" : ("AND" | "OR")
| "minimum_should_match" : number
field_weight_list = field_weight [, field_weight]*
field_weight = "field_name[^number]"
查询选项结构
说明
查询选项结构从 V4.6.0 BP1 版本开始支持。
用于配置如分区内并行查询等查询选项。
search_options = "search_options" : {search_options_body}
search_options_body = "query_dop" : number
{
"query": {
"search_options": {"query_dop": 4},
"match": {"content": "oceanbase mysql"}
}
}
向量与排序结构
用于指定向量搜索参数,可配置搜索向量字段、相似度、过滤条件、权重等信息,支持单路及多路向量检索。
knn_expression = "knn" : {knn_condition_list} | [multi_knn_condition_list]
knn_condition_list = knn_condition [, knn_condition]*
knn_condition = "field" : "field_name"
| "k" : number
| "query_vector" : [vector_values]
| "num_candidates" : number -- 从 V4.6.0 BP1 版本开始支持
| "search_options" : {search_option_list}
| "filter" : [condition_list]
| "similarity" : number
| "boost" : boost_value
search_option_list = search_option [, search_option]*
search_option = "ef_search" : number
| "refine_k" : number
| "filter_mode" : ("pre" | "pre-knn" | "pre-brute" | "post" | "post-index-merge")
multi_knn_condition_list = {knn_condition} [, {knn_condition}]*
vector_values = float [, float]*
rank_expression = "rank" : {rank_strategy}
rank_strategy = "rrf" : {rrf_params}
| "weighted_sum" : {weighted_sum_params}
rrf_params = "rank_window_size" : number [, "rank_constant" : number]
weighted_sum_params = "rank_window_size" : number [, "normalizer" : ("minmax" | "none")]
-- 从 V4.6.0 BP1 版本开始支持
rerank_params = "model" : "string_value"
| "field" : "field_name"
| "query" : "string_value"
| "rank_window_size" : number
| "type" : "string_value"
单路向量搜索时,knn 为单个对象;多路时为对象数组,每个元素是一组 knn_condition。下面仅展示多路向量搜索时的 knn 片段示例:
{
"knn": [
{
"field": "vector_a",
"k": 3,
"query_vector": "[1,0,0]"
},
{
"field": "vector_b",
"k": 3,
"query_vector": "[0,1,0]"
}
]
}
基础类型定义
上述语法中用到的基础数据类型定义。
field_name = "string_value"
field_list = field_name [, field_name]*
number = integer | decimal
boost_value = integer | float
boolean = true | false
scalar_value = "string_value" | number | boolean
详细参数说明
| 表达式类型 | 参数名称 | 参数描述 |
|---|---|---|
| 顶层关键字参数 | query | 进行全文搜索时可单独使用,混合搜索时可以与 knn 参数同时使用。可设置查询选项,查询选项从 V4.6.0 BP1 版本开始支持。 |
| knn | 进行单路/多路向量搜索时可单独使用,混合搜索时可以与 query 参数同时使用。 |
|
| rank(可选) | 多路召回结果的融合粗排策略,支持 rrf、weighted_sum(含 normalizer 等)参数,未指定时按默认融合策略(rrf)处理。 |
|
rerank(可选)
注意该参数从 V4.6.0 BP1 版本开始支持。 |
在粗排之后,通过 AI Rerank 模型对候选文档精排。须配合 query 或 knn 使用,参数见下文 “Rerank 精排” 小节。 |
|
| from(可选) | 用于指定从搜索结果集的第几行返回结果,不指定则默认从第 1 行返回,需要和 size 参数一起使用。 |
|
| size(可选) | 用于限制返回结果条数,不指定则默认为 10。与 rerank.rank_window_size、rank 的窗口参数须满足 size ≤ rerank.rank_window_size ≤ rank。不指定 size 时,按照 size = rerank.rank_window_size 处理。 |
|
| bool | must | 必须满足,需要计算得分。在内部需要布尔逻辑时,须嵌套 bool 表达式,bool 表达式中的多个条件默认按 AND 逻辑组合。 |
| should | 应该满足,类似于 OR,需要计算得分。在内部需要布尔逻辑时,须嵌套 bool 表达式,bool 表达式中的多个条件默认按 AND 逻辑组合。 | |
| must_not | 必须不满足,不计算得分,转换成 'NOT' 表达式,must_not 内多个以 'AND' 相连。在内部需要布尔逻辑时,须嵌套 bool 表达式,bool 表达式中的多个条件默认按 AND 逻辑组合。 bool 中至少需要包含 1 个正向条件(must / should / filter),不支持只有 1 个 must_not 条件。 |
|
| filter | 必须满足,不计算得分,转换成 'AND' 表达式。在内部需要布尔逻辑时,须嵌套 bool 表达式,bool 表达式中的多个条件默认按 AND 逻辑组合。 | |
| boost(可选) | 查询权重,详见下方 boost 参数详细说明。注意:term/range/terms 等标量查询不支持 boost。 |
|
| 标量查询(scalar_term) | range | 范围搜索,搭配 gte、gt、lte、lt 使用。field_name 必选。该类标量查询不参与算分,不支持 boost,且不支持放在 bool 的 must/should 中。 |
| term | 精准匹配,支持字符串、数字、布尔值等标量值,转换成 sql 的 '=' 表达式。该类标量查询不参与算分,不支持 boost,且不支持放在 bool 的 must/should 中。 |
|
| terms | 对指定集合中的任意一个值精准匹配,支持字符串、数字、布尔值等标量值的数组,转换成 sql 的 'IN' 表达式。该类标量查询不参与算分,不支持 boost,且不支持放在 bool 的 must/should 中。 |
|
| wildcard | 支持通配符模糊搜索,相当于在 SQL 中使用 LIKE ... ESCAPE '\\' 子句。* 表示任意多个字符(等同于 SQL 的 %),? 表示任意单个字符(等同于 SQL 的 _)。使用方式有三种:直接写通配符字符串(例如 {"wildcard": {"title": "ab*cd?"}})、用 value 字段(例如 {"wildcard": {"title": {"value": "ab*cd?", "boost": 0.5}}})、或用 wildcard 字段(例如 {"wildcard": {"title": {"wildcard": "ab*cd?", "boost": 0.5}}})。value 和 wildcard 只能二选一,不能同时使用,错误示例如 {"wildcard": {"title": {"value": "abc", "wildcard": "cbd"}}}。不支持 case_insensitive、rewrite、_name 参数。支持 boost。
说明本功能从 V4.6.0 BP1 开始支持。 |
|
| 全文查询(fulltext_term) | match | 全文匹配,在单列上做词项匹配。对应列应建立单列全文索引(FTS_INDEX_TYPE = MATCH 或与默认等价的类型)。支持完整对象形式 {"field":{"query":"...","operator":"OR|AND","minimum_should_match":n,"boost":...}},或不写可选子段时的简化形式 {"field":"查询字符串"}。查询串按索引所用分词器分词;同一关键词重复出现仅提高权重,不改变是否匹配。operator 为关键词间逻辑,可选,默认 OR。OR 表示应当匹配任意关键词;AND 表示应当匹配全部关键词。minimum_should_match 仅在 operator = OR 时生效,为 [0, INT32_MAX] 的整数,可选,默认 1;值为 0 时按 1 处理;大于等于关键词个数时等效于 operator = AND。 |
| match_phrase | 全文匹配,在单列上做短语匹配。对应列须建立 FTS_INDEX_TYPE = PHRASE_MATCH 的单列全文索引。支持完整对象形式 {"field":{"query":"...","slop":n,"boost":...}} 或简化形式 {"field":"短语字符串"}。短语按索引分词器分词;若短语中含停用词,对应位置可匹配任意词元(Token)。slop 为词元间最大允许偏移,取值为 [0, INT32_MAX] 的整数;0 表示精确匹配,正整数表示模糊匹配(可选,默认 0)。 |
|
| query_string | 全文匹配,在多列上使用运算符 ^ 扩展查询语义。先按运算符将 query 拆成多组;每组内在各列上分别匹配后再按列汇总;最后汇总各组得分。全文搜索参数中,只有 query_string 支持词元级别权重:可在 query 中使用 ^ 接正浮点数为该组关键词指定权重。不得包含保留词(不区分大小写) OR、AND、NOT、TO;不得包含字符 + - & | ! = < > ( ) [ ] { } " ~ * ? : \ /(文档中展示为字面约束,实际 JSON 中需合法转义)。 |
|
| multi_match | 全文匹配,在多列上做词项匹配,以列为中心(field-centric):各列分别对关键词打分后再汇总。各列须为单列全文索引且字符集、分词器一致。multi_match 不支持词元级别权重,仅支持列级别与整条查询级别的权重设置:
|
|
| 全文查询类型的公共参数 | fields | multi_match / query_string 的列列表;列名后可加 ^ 与正浮点数指定列权重,默认 1.0。同一列名多次出现时以最后一次权重为准。 |
| query | multi_match / query_string 的查询字符串;match / match_phrase 的查询内容写在各自列对象下的 query 列名(或简化形式中直接作为列值字符串)。关键词重复仅影响权重。 |
|
| minimum_should_match(可选) | 在 match、multi_match 中:当 operator = OR 时,表示至少应匹配的关键词个数,默认 1,0 按 1 处理;大于等于关键词个数时等效于 AND。在 query_string 中:当 default_operator = OR 时,表示至少应满足的组数(组由运算符与 ^ 权重划分),规则同上。
说明嵌套在 |
|
| boost(可选) | 查询权重,详见下方 boost 参数详细说明。 | |
| type(可选) | multi_match / query_string 的匹配模式,支持 best_fields,表示取最大值、most_fields,表示求和,不支持 cross_fields、phrase;不指定时默认 best_fields。 |
|
| default_operator(可选) | 仅 query_string。组与组之间、组内关键词之间的默认逻辑:OR 表示匹配任意组/词;AND 表示全部匹配。可选,默认 OR。 |
|
| operator(可选) | match、multi_match 的关键词间逻辑:OR 或 AND。可选,默认 OR。 |
|
查询选项(search_options)
说明从 V4.6.0 BP1 版本开始支持。 |
||
| query_dop(可选) | 用于配置混搜 query 召回路径的分区内并行执行;仅支持全文/标量路径的并行(不支持向量路径并行)。每个 query 召回路径仅可设置一个 query_dop,类型为整数,取值范围 [1, 128],默认 1。1 表示路径内不并行;大于 1 时按数据范围切分后并行扫描。超出取值范围会在 JSON 解析阶段报错。仅在混搜并行执行开启时生效。可配合查询 Hint 使用,具体方式请参见文末相关文档“索引混合搜索(SQL 接口)”中的并行执行说明。 |
|
| knn(向量搜索) | ||
| field | 向量搜索列名。 | |
| k | 最终返回的近邻结果数,取值范围 [1, 16384]。 |
|
| query_vector | 指定搜索向量。 | |
| num_candidates(可选) | 指定向量搜索时的候选集数量,等同于 ef_search。整数类型,取值范围为 [1, 10000](不在范围内会报错)。当 filter_mode 为 post 或 post-index-merge 时,该参数作为初始预算而非绝对上限。与 ef_search 同时设置时优先级和详细示例参见下文 “num_candidates 与 ef_search” 说明。
说明本功能从 V4.6.0 BP1 开始支持。 |
|
| search_options(可选) | 向量搜索高级选项,包含 ef_search、refine_k、filter_mode 等子键。ef_search 类型为整数,取值范围为 [1, 10000]。refine_k 用于调整量化向量索引的重排比例,类型为浮点数,取值范围为 [1.0, 1000.0]。与 num_candidates 同时设置时仍可生效。filter_mode 用于控制带过滤条件的向量查询执行路径,类型为字符串;取值与含义参见下文 “filter_mode” 说明。执行计划中可能以数值形式打印(如 filter_mode=0)。 |
|
| filter(可选) | 向量分支内的过滤条件,可包含标量表达式(含 wildcard)。 |
|
| similarity(可选) | 用于指定向量相似度计算的过滤条件。 | |
| boost(可选) | 查询权重,详见下方 boost 参数详细说明。 | |
| rank(粗排) | rrf | RRF(Reciprocal Rank Fusion)排序策略,用于混合搜索时对多个查询结果进行融合排序。 |
| rank_window_size(可选) | 该值用于指定每个查询所返回的单个结果集的大小。值越大,结果的相关性越高,但会带来性能开销。最终的排序结果集会被裁剪至搜索请求中指定的 size 大小。rank_window_size 必须同时满足:
size 参数的值。 |
|
| rank_constant(可选) | 该值用于控制每个查询所返回的单个结果集中各文档对最终排序结果的影响程度。值越大,表示排名靠后的文档对最终结果的影响越大。默认值为 60。 | |
rerank(精排)
注意该参数从 V4.6.0 BP1 版本开始支持。 |
model | 必填。Rerank 模型名称。支持 provider/model 格式(如 aliyun-dashscope/gte-rerank-v2,须先通过 REGISTER_PROVIDER 注册供应商。 |
| field | 必填。参与精排的文本列名,列须存在于查询表中,类型为 CHAR、VARCHAR 或 TEXT。 |
|
| query | 必填。用于与文档文本比较相关性的查询字符串。 | |
| rank_window_size(可选) | 参与精排的候选文档数,取值范围 [0, 10000],默认 10。须满足 rank_window_size ≥ size;若同时指定 rank,还须 <=rank.rank_window_size。 |
|
| type(可选) | 精排实现类型,默认 model(调用外部 Rerank 模型)。 |
权重运算符说明
权重运算符 ^ 用于指定全文查询语句中列级别或者词元(Token)级别的权重,语法格式为 列名^权重 或 关键词^权重,例如 "title^2.0"。参数支持如下:
- 仅
multi_match和query_string支持列级别权重。 - 仅
query_string支持词元级别权重。
词元级别的权重运算符用于指定其左侧关键词(截至空格)的权重,无权重运算符对应的关键词的默认权重为 1.0。一个权重运算符对应的关键词或者连续的无权重运算符对应的关键词为一组。
{
"query": {
"query_string": {
"fields": ["title^2.0", "content"],
"query": "红心火龙果 果冻橙^1.5 秋月梨^1.2 蓝莓 山竹"
}
}
}
如上例所示,查询词元 "红心火龙果 果冻橙^1.5 秋月梨^1.2 蓝莓 山竹" 时,词元会分为四组,分别为:默认权重为 1.0 的红心、火龙果,指定权重为 1.5 的果冻、橙,指定权重为 1.2 的秋月、梨,默认权重为 1.0 的蓝莓、山竹。
权重运算符可以和 boost 参数同时使用,具体示例见下一小节 boost 参数详细说明。
boost 参数详细说明
boost 参数用于指定查询条件在最终相关性计算中的权重,值必须 ≥ 0,不指定时默认为 1。上述语法结构中,bool、single_term、单路和多路向量搜索(knn)都支持指定 boost 参数。结合本文限制,boost 的使用规则如下:
支持
boost的表达式bool查询。- 全文查询(如
match、match_phrase、query_string、multi_match)。 - 向量查询(单路/多路
knn)。 - 标量查询:
wildcard查询。
不支持
boost的表达式- 标量查询:
term/range/terms。 - JSON/ARRAY 标量表达式。
- 标量查询:
取值约束
- 非顶层全文查询的
boost、bool查询的boost、全文查询的列权重和词权重,要求大于0。 - 其他情况的
boost要求大于等于0。
- 非顶层全文查询的
示例
a. 查询级别
boost(bool):{ "bool": { "filter": [{"term": {"category": "Gaming"}}], "boost": 2.0 } }b. 列级权重(
query_string):{ "query_string": { "fields": ["product_name^2.0", "description^1.0"], "query": "gaming keyboard", "boost": 1.5 } }c. 向量查询
boost(knn):{ "knn": { "field": "vector", "k": 5, "query_vector": "[1,2,3]", "boost": 1.5 } }
num_candidates 与 ef_search
本小节介绍 num_candidates 与 ef_search 的优先级说明。
说明
num_candidates 从 V4.6.0 BP1 版本开始支持。
num_candidates 与 ef_search 的优先级如下:
| 设置情况 | 生效行为 |
|---|---|
仅设置 num_candidates |
生效,且 ef_search = num_candidates |
仅设置 search_options.ef_search |
按照 ef_search |
同时设置 num_candidates 与 search_options.ef_search |
num_candidates 优先,最终 ef_search 等于 num_candidates |
| 都不设置 | 保持默认 ef_search 的系统参数/会话参数 |
filter_mode
filter_mode 是 search_options 中的参数,用于控制带过滤条件的向量查询的执行路径。取值如下:
| 取值 | 含义 |
|---|---|
pre |
前过滤自适应 |
pre-knn |
前过滤 + knn |
pre-brute |
前过滤 + 暴搜 |
post |
基于表达式的迭代式过滤 |
post-index-merge |
基于 index-merge 框架的迭代式过滤 |
wildcard 标量查询
本小节介绍 wildcard 标量查询的补充信息,包含使用位置、索引能力等。
说明
本功能从 V4.6.0 BP1 版本开始支持。
支持的使用位置:
- 顶层
query中 bool.must中bool.should中bool.filter中bool.must_not中knn.filter中(语义与bool.filter一致)
索引能力如下:
| 索引类型 | 是否支持 |
|---|---|
| VARCHAR 列上的普通索引 | 支持(非精确查询中 LIKE 可走索引) |
| 前缀索引 | 不支持 |
| 全文索引 | 不支持 |
| JSON SEARCH INDEX | 不支持 |
| JSON CAST 索引 | 不支持 |
示例
这里给出一些复杂语法的示例供参考。
全文与向量 RRF 混合搜索
创建示例表,其中包含一个向量列,并为其创建向量索引,以及分别为两个 VARCHAR 列创建全文索引。
CREATE TABLE doc_table(c1 INT, vector VECTOR(3), query VARCHAR(255), content VARCHAR(255), VECTOR INDEX idx1(vector) WITH (distance=l2, type=hnsw, lib=vsag), FULLTEXT INDEX idx2(query), FULLTEXT INDEX idx3(content));
写入数据。
INSERT INTO doc_table VALUES(1, '[1,2,3]', "hello world", "oceanbase Elasticsearch database"),
(2, '[1,2,1]', "hello world, what is your name", "oceanbase mysql database"),
(3, '[1,1,1]', "hello world, how are you", "oceanbase oracle database"),
(4, '[1,3,1]', "real world, where are you from", "postgres oracle database"),
(5, '[1,3,2]', "real world, how old are you", "redis oracle database"),
(6, '[2,1,1]', "hello world, where are you from", "starrocks oceanbase database");
SELECT * FROM HYBRID_SEARCH(
TABLE doc_table,
'{
"query": {
"match": {"content": "oceanbase mysql"}
},
"knn": {
"field": "vector",
"k": 5,
"query_vector": "[1,2,3]"
},
"rank": {
"rrf": {
"rank_constant": 60,
"rank_window_size": 10
}
}
}'
);
预期返回结果如下:
+------+---------+---------------------------------+----------------------------------+----------------------+
| c1 | vector | query | content | __score |
+------+---------+---------------------------------+----------------------------------+----------------------+
| 1 | [1,2,3] | hello world | oceanbase Elasticsearch database | 0.03252247488101534 |
| 2 | [1,2,1] | hello world, what is your name | oceanbase mysql database | 0.032266458495966696 |
| 3 | [1,1,1] | hello world, how are you | oceanbase oracle database | 0.031754032258064516 |
| 5 | [1,3,2] | real world, how old are you | redis oracle database | 0.016129032258064516 |
| 6 | [2,1,1] | hello world, where are you from | starrocks oceanbase database | 0.016129032258064516 |
| 4 | [1,3,1] | real world, where are you from | postgres oracle database | 0.015625 |
+------+---------+---------------------------------+----------------------------------+----------------------+
6 rows in set
同时设置 num_candidates 与 ef_search
本示例展示了同时设置 num_candidates 与 ef_search:
-- 同时设置 num_candidates 与 search_options.ef_search:num_candidates 优先
SELECT c1 FROM HYBRID_SEARCH(TABLE doc_table, '{
"knn": {
"field": "vector",
"k": 10,
"num_candidates": 2000,
"query_vector": "[0.712338,0.603321,0.133444]",
"search_options": {
"ef_search": 101,
"refine_k": 5.6,
"filter_mode": "pre"
}
}
}');
模糊匹配示例
本示例展示了 wildcard 标量查询的常用场景,包括普通列前缀匹配、JSON 路径匹配、作为 knn.filter 中的过滤条件、bool.must / bool.should 组合过滤:
-- 普通列前缀匹配
SELECT * FROM HYBRID_SEARCH(TABLE doc_table, '{
"query": {"wildcard": {"title": "prefix*"}}
}');
-- JSON 路径
SELECT * FROM HYBRID_SEARCH(TABLE doc_table, '{
"query": {"wildcard": {"doc_json.name": "alpha*"}}
}');
-- 作为 knn.filter
SELECT * FROM HYBRID_SEARCH(TABLE doc_table, '{
"knn": {
"field": "vector_col",
"k": 1,
"query_vector": "[0.1,0.1,0.1,0.1]",
"filter": [{"wildcard": {"doc_json.name": "alpha*"}}]
}
}');
-- bool.must / should 组合
SELECT * FROM HYBRID_SEARCH(TABLE doc_table, '{
"query": {
"bool": {
"must": [
{"term": {"store_id": "20000"}},
{"bool": {
"should": [
{"wildcard": {"phone": "*1399*"}},
{"wildcard": {"order_no": "*2024061*"}}
],
"minimum_should_match": 1
}}
]
}
}
}');
相关文档
- 本语法对应功能说明和场景化示例参见索引混合搜索(SQL 接口)