多索引搜索
/multi-search 路由允许您在一个或多个索引上执行多个搜索查询。
/multi-search
路由允许您通过将多个搜索查询打包到单个 HTTP 请求中,在一个或多个索引上执行多重搜索。多重搜索也被称为联邦搜索(federated search)。
执行多重搜索
将多个搜索查询打包到单个 API 请求中。使用此端点可以同时搜索多个索引。
请求体
名称 | 类型 | 描述 |
---|---|---|
federation | 对象 | 如果存在且不为 null ,则返回合并所有指定查询结果的单一列表 |
queries | 对象数组 | 包含要执行的搜索查询列表。必须包含 indexUid 搜索参数,其他所有参数均为可选 |
如果 Meilisearch 在处理多重搜索请求中的任何查询时遇到错误,它会立即停止处理请求并返回错误信息。返回的信息仅针对遇到的第一个错误。
federation
使用 federation
可以获取一个包含所有指定查询结果的统一列表,结果按照评分降序排列。这被称为联邦搜索(federated search)。
federation
可以包含以下可选参数:
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
offset | 整型 | 0 | 跳过的文档数量 |
limit | 整型 | 20 | 返回文档的最大数量 |
facetsByIndex | 对象数组 | null | 为指定索引显示分面信息 |
mergeFacets | 对象 | null | 为指定索引显示分面信息 |
如果 federation
缺失或为 null
,Meilisearch 会返回一个包含多个搜索结果对象的列表,列表中的每一项对应请求中的一个搜索查询。
facetsByIndex
facetsByIndex
必须是一个对象。其键名必须对应您 Meilisearch 项目中的索引名称。每个键名必须关联一个数组,该数组包含该索引可筛选属性列表中的属性:
当指定 facetsByIndex
时,多搜索响应会包含一个额外的 facetsByIndex
字段。响应中的 facetsByIndex
是一个对象,其中每个被查询的索引都对应一个字段:
mergeFacets
mergeFacets
必须是一个对象,可以包含以下字段:
maxValuesPerFacet
:必须为整数。当指定时,表示单个分面返回的最大值数量。默认为maxValuesPerFacet
索引设置中分配的值
当同时存在 facetsByIndex
和 mergeFacets
且不为空时,多搜索响应中包含的分面信息会在所有查询索引中合并。响应中将不再包含 facetsByIndex
,而是包含两个额外字段:facetDistribution
和 facetStats
:
联邦搜索的合并算法
联邦搜索的合并结果会按照递减的排名分数返回。为了获取最终结果列表,Meilisearch 采用以下比较流程:
- 对两条命中记录的详细排名分数进行标准化处理:
- 将连续的相关性分数(与
words
、typo
、attribute
、exactness
或vector
规则相关)合并为每个命中记录的单一分数 sort
和geosort
的分数细节保持不变
- 将连续的相关性分数(与
- 对两条命中记录的标准化详细排名分数进行字典序比较:
- 如果两条记录都有相关性分数,则分数较高者优先。如果分数相同,进入下一步
- 如果一条结果有相关性分数或(地理)排序分数,Meilisearch 会选择该结果
- 如果两条结果在同一排序方向上有 sort 或 geosort 分数,则 Meilisearch 根据共同排序方向比较值。按照共同排序方向应该靠前的值所在结果优先。如果相同,进入下一步
- 比较两条命中记录的全局排名分数来决定先后顺序,忽略任何排序或地理排序
- 如果完全平局,则优先选择
queries
数组中排名较低的查询返回的文档
Meilisearch 认为两个文档相同的情况是:
- 它们来自同一个索引
- 且它们的主键相同
无法指定多个索引中的两个文档应被视为相同文档。
queries
queries
必须是一个对象数组。每个对象可以包含以下搜索参数:
搜索参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
federationOptions | 对象 | null | 为特定查询配置联邦搜索设置 |
indexUid | 字符串 | 必填 | 请求索引的 uid |
q | 字符串 | "" | 查询字符串 |
offset | 整数 | 0 | 跳过的文档数量 |
limit | 整数 | 20 | 返回文档的最大数量 |
hitsPerPage | 整数 | 1 | 每页返回文档的最大数量 |
page | 整数 | 1 | 请求特定页码的结果 |
filter | 字符串 | null | 根据属性值过滤查询 |
facets | 字符串数组 | null | 显示每个分面的匹配计数 |
distinct | 字符串 | null | 限制搜索具有指定属性唯一值的文档 |
attributesToRetrieve | 字符串数组 | ["*"] | 返回文档中要显示的属性 |
attributesToCrop | 字符串数组 | null | 需要裁剪值的属性 |
cropLength | 整数 | 10 | 裁剪值的最大单词长度 |
cropMarker | 字符串 | "…" | 标记裁剪边界的字符串 |
attributesToHighlight | 字符串数组 | null | 高亮显示属性中包含的匹配项 |
highlightPreTag | 字符串 | "<em>" | 高亮项起始处插入的字符串 |
highlightPostTag | 字符串 | "</em>" | 高亮项结束处插入的字符串 |
showMatchesPosition | 布尔值 | false | 返回匹配项的位置信息 |
sort | 字符串数组 | null | 根据属性值对搜索结果排序 |
matchingStrategy | 字符串 | last | 文档内匹配查询词项的策略 |
showRankingScore | 布尔值 | false | 显示文档的全局排名分数 |
showRankingScoreDetails | 布尔值 | false | 添加详细的全局排名分数字段 |
rankingScoreThreshold | 数字 | null | 排除排名分数较低的结果 |
attributesToSearchOn | 字符串数组 | ["*"] | 限制仅在指定属性上搜索 |
hybrid | 对象 | null | 基于查询关键词和语义返回结果 |
vector | 数字数组 | null | 使用自定义查询向量进行搜索 |
retrieveVectors | 布尔值 | false | 返回文档向量数据 |
locales | 字符串数组 | null | 显式指定查询使用的语言 |
除非另有说明,多搜索查询的搜索参数与 /search
端点的搜索参数功能完全相同。
limit
、offset
、hitsPerPage
和 page
这些选项不兼容联邦搜索(federated searches)。
federationOptions
federationOptions
必须是一个对象,它接受以下参数:
weight
: 作为该特定查询中搜索结果排名分数的乘数因子。如果小于1.0
,该查询的结果在最终结果列表中出现的可能性会降低;如果大于1.0
,则出现的可能性会提高。必须是一个正浮点数,默认为1.0
remote
experimental: 指定 Meilisearch 执行查询的远程实例。必须是一个字符串,对应一个远程对象。默认为null
响应
/multi-search
查询的响应可能根据查询类型呈现不同形式。
非联邦多搜索请求
名称 | 类型 | 描述 |
---|---|---|
results | 对象数组 | 按照请求顺序返回的搜索查询结果 |
每个搜索结果对象包含以下字段:
名称 | 类型 | 描述 |
---|---|---|
indexUid | 字符串 | 请求索引的uid |
hits | 对象数组 | 查询结果 |
offset | 数字 | 跳过的文档数量 |
limit | 数字 | 获取的文档数量 |
estimatedTotalHits | 数字 | 预估的匹配总数 |
totalHits | 数字 | 精确的匹配总数 |
totalPages | 数字 | 精确的搜索结果总页数 |
hitsPerPage | 数字 | 每页结果数量 |
page | 数字 | 当前搜索结果页码 |
facetDistribution | 对象 | 给定分面的分布情况 |
facetStats | 对象 | 每个分面的数值min 和max 范围 |
processingTimeMs | 数字 | 查询处理时间(毫秒) |
query | 字符串 | 生成该响应的查询语句 |
联邦多搜索请求
联邦搜索请求返回一个包含以下字段的单一对象:
名称 | 类型 | 描述 |
---|---|---|
hits | 对象数组 | 查询结果 |
offset | 数字 | 跳过的文档数量 |
limit | 数字 | 获取的文档数量 |
estimatedTotalHits | 数字 | 预估匹配总数 |
processingTimeMs | 数字 | 查询处理时间 |
facetsByIndex | 对象 | 搜索结果中存在的分面数据 |
facetDistribution | 对象 | 给定分面的分布情况 |
facetStats | 对象 | 每个分面的数值型min 和max 值 |
remoteErrors | 对象 | 指示哪些远程请求失败及其原因 |
hits
数组中的每个结果都包含一个额外的_federation
字段,包含以下字段:
名称 | 类型 | 描述 |
---|---|---|
indexUid | 字符串 | 该文档来源的索引 |
queriesPosition | 数字 | 该查询在请求queries 数组中的索引位置 |
remote | 字符串 | 该文档来源的远程实例 |
weightedRankingScore | 数字 | 命中结果的_rankingScore 与来源查询权重的乘积 |