多重搜索
/multi-search
路由允许您通过将多个搜索请求捆绑到一个 HTTP 请求中,对一个或多个索引执行多个搜索查询。多重搜索也称为联合搜索。
执行多重搜索
将多个搜索请求捆绑到单个 API 请求中。使用此端点可以一次搜索多个索引。
POST/multi-search
主体
名称 | 类型 | 说明 |
---|---|---|
federation | 对象 | 如果存在且不为 null ,则返回一个列表,将所有指定查询中的所有搜索结果合并到一起 |
queries | 对象数组 | 包含要执行的搜索查询列表。 indexUid 搜索参数是必需的,其他所有参数都是可选的 |
警告
如果 Meilisearch 在处理多重搜索请求中的任何查询时遇到错误,它会立即停止处理请求并返回一条错误消息。返回的消息只将解决遇到的第一个错误。
federation
使用federation
来接收一个列表,其中包含按递减排名得分顺序组合来自所有指定查询的所有搜索结果。这称为联合搜索。
federation
可选包含以下参数
如果 federation
缺失或为 null
,Meilisearch 会返回一个多个搜索结果对象的列表,列表中的每一项都对应于请求中的搜索查询。
联合搜索的合并算法
联合搜索的合并结果按递减排名得分返回。为获取最终结果列表,Meilisearch 会使用以下过程进行比较
- 两种匹配的详细排名得分的归一化方式如下
- 连续相关性得分(与规则
words
、typo
、attribute
、exactness
或vector
相关)在每个匹配中归为一个单一分数 sort
和geosort
得分详情保持不变
- 连续相关性得分(与规则
- 两种匹配的归一化详细排名得分按字母顺序比较
- 如果两种匹配都有一个相关性得分,则较高得分胜出。如果是平局,则继续下一步
- 如果一个结果有相关性得分或一个 (地理) 排序得分,Meilisearch 会选择该结果
- 如果两个结果在同一个排序方向上有排序或地理排序得分,Meilisearch 将根据共同的排序方向比较值。根据共同的排序方向,必须先出现的值胜出。如果是平局,则继续下一步
- 将两个匹配的全局排名得分进行比较,以确定哪一个先出现,忽略任何排序或地理排序
- 如果完全平局,则优先选择
queries
数组中排名最低的查询中的文档。
不同文档和联合搜索
如果满足以下条件,Meilisearch 将认为两个文档相同
- 它们来自同一个索引
- 并且它们的主键相同
没有办法指定在多个索引中应将两个文档视为相同。
queries
queries
必须是一个对象数组。每个对象可能包含以下搜索参数
搜索参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
federationOptions | 对象 | null | 为一个特定查询配置联合设置 |
indexUid | 字符串 | N/A | 请求索引的uid |
q | 字符串 | "" | 查询字符串 |
offset | 整数 | 0 | 要跳过的文档数 |
limit | 整数 | 20 | 返回的最大文档数 |
hitsPerPage | 整数 | 1 | 一页返回的最大文档数 |
page | 整数 | 1 | 请求特定页面结果 |
filter | 字符串 | null | 按照一个属性值筛选查询 |
facets | 字符串数组 | null | 按每个方面显示匹配次数 |
attributesToRetrieve | 字符串数组 | ["*"] | 要显示在返回的文档中的属性 |
attributesToCrop | 字符串数组 | null | 其值必须裁剪的属性 |
cropLength | 整数 | 10 | 用单词表示的裁剪值的长度 |
cropMarker | 字符串 | "…" | 用于标记裁剪边界的字符串 |
attributesToHighlight | 字符串数组 | null | 突出显示属性中包含的匹配项 |
highlightPreTag | 字符串 | "<em>" | 插入在突出显示的项目开头处的字符串 |
highlightPostTag | 字符串 | "</em>" | 插入在突出显示的项目结尾的字符串 |
showMatchesPosition | 布尔值 | false | 返回匹配项位置 |
sort | 字符串数组 | null | 按属性值对搜索结果进行排序 |
matchingStrategy | 字符串 | last | 匹配文档中查询词组时所用的策略 |
showRankingScore | 布尔值 | false | 显示文档的全局排名得分 |
attributesToSearchOn | 字符串数组 | ["*"] | 将搜索限制到指定的属性 |
除非另有说明,否则多搜索查询的搜索参数的作用与 /search
端点的搜索参数 完全相同。
limit
、offset
、hitsPerPage
和 page
这些选项与联合搜索不兼容。
federationOptions
federationOptions
必须是一个对象。它接受以下参数
weight
:用作此特定查询中搜索结果排名得分的一个乘法因子。如果 <1.0
,则此查询中的命中出现在最终结果列表中的可能性更低。如果 >1.0
,则此查询中的命中出现在最终结果列表中的可能性更高。必须是一个正浮点数。默认值为1.0
响应
对 /multi-search
查询的响应可以采用两种形式:联合搜索和非联合搜索。
非联合搜索请求
名称 | 类型 | 说明 |
---|---|---|
results | 对象数组 | 搜索查询的结果,按照请求的顺序排列 |
每个搜索结果对象都由以下字段组成
名称 | 类型 | 说明 |
---|---|---|
indexUid | 字符串 | uid ,表示请求的索引 |
hits | 对象数组 | 查询的结果 |
offset | Number | 跳过的文档数量 |
limit | Number | 要获取的文档数量 |
estimatedTotalHits | Number | 估计的匹配总数 |
totalHits | Number | 完全匹配总数 |
totalPages | Number | 搜索结果页面的完全总数 |
hitsPerPage | Number | 每页的结果数量 |
page | Number | 当前的搜索结果页面 |
facetDistribution | 对象 | 给定类型的分布 |
facetStats | 对象 | 每个类型中的数字 min 和 max 值 |
processingTimeMs | Number | 查询的处理时间 |
query | 字符串 | 生成响应的查询 |
联合搜索请求
联合搜索请求返回一个对象和以下字段
名称 | 类型 | 说明 |
---|---|---|
indexUid | 字符串 | uid ,表示请求的索引 |
hits | 对象数组 | 查询的结果 |
offset | Number | 跳过的文档数量 |
limit | Number | 要获取的文档数量 |
estimatedTotalHits | Number | 估计的匹配总数 |
totalHits | Number | 完全匹配总数 |
totalPages | Number | 搜索结果页面的完全总数 |
hitsPerPage | Number | 每页的结果数量 |
page | Number | 当前的搜索结果页面 |
facetDistribution | 对象 | 给定类型的分布 |
facetStats | 对象 | 每个类型中的数字 min 和 max 值 |
processingTimeMs | Number | 查询的处理时间 |
query | 字符串 | 生成响应的查询 |
hits
数组中的每个结果都包含一个附加的 _federation
字段,其中包含以下字段
名称 | 类型 | 说明 |
---|---|---|
indexUid | 字符串 | 此文档的源索引 |
queriesPosition | Number | 请求的 queries 数组中查询的数组索引号 |
示例
非联邦多重搜索
curl \
-X POST 'http://localhost:7700/multi-search' \
-H 'Content-Type: application/json' \
--data-binary '{
"queries": [
{
"indexUid": "movies",
"q": "pooh",
"limit": 5
},
{
"indexUid": "movies",
"q": "nemo",
"limit": 5
},
{
"indexUid": "movie_ratings",
"q": "us"
}
]
}'
响应:200 Ok
{
"results":[
{
"indexUid":"movies",
"hits":[
{
"id":13682,
"title":"Pooh's Heffalump Movie",
…
},
…
],
"query":"pooh",
"processingTimeMs":26,
"limit":5,
"offset":0,
"estimatedTotalHits":22
},
{
"indexUid":"movies",
"hits":[
{
"id":12,
"title":"Finding Nemo",
…
},
…
],
"query":"nemo",
"processingTimeMs":5,
"limit":5,
"offset":0,
"estimatedTotalHits":11
},
{
"indexUid":"movie_ratings",
"hits":[
{
"id":"Us",
"director": "Jordan Peele",
…
}
],
"query":"Us",
"processingTimeMs":0,
"limit":20,
"offset":0,
"estimatedTotalHits":1
}
]
}
联邦多重搜索
curl \
-X POST 'http://localhost:7700/multi-search' \
-H 'Content-Type: application/json' \
--data-binary '{
"federation": {},
"queries": [
{
"indexUid": "movies",
"q": "batman"
},
{
"indexUid": "comics",
"q": "batman"
}
]
}'
响应:200 Ok
{
"hits": [
{
"id": 42,
"title": "Batman returns",
"overview": …,
"_federation": {
"indexUid": "movies",
"queriesPosition": 0
}
},
{
"comicsId": "batman-killing-joke",
"description": …,
"title": "Batman: the killing joke",
"_federation": {
"indexUid": "comics",
"queriesPosition": 1
}
},
…
],
"processingTimeMs": 0,
"limit": 20,
"offset": 0,
"estimatedTotalHits": 2,
"semanticHitCount": 0
}