# 联邦/多搜索
多搜索功能允许您在一个 HTTP 请求中发起多个搜索请求。这有助于避免如果将这些请求作为单独的 HTTP 请求发送时产生的往返网络延迟。
您可以使用两种不同的模式:
- 联邦搜索:多搜索负载中的每个搜索请求都会独立返回结果。
- 联合搜索:每个搜索请求的响应会被合并成一个统一的排序结果。
# 联邦搜索
通过联邦搜索,您可以使用一个multi_search
请求在单个HTTP请求中跨多个集合进行搜索,且各搜索结果是相互独立的。
例如:在电商产品数据集中,您可以通过multi_search
请求并行搜索"products"集合和"brands"集合,向用户同时展示产品和品牌的结果。
示例响应
定义
POST ${TYPESENSE_HOST}/multi_search
TIP
对于联邦搜索(federated search),multi_search
响应中的results
数组保证与请求中searches
数组的查询顺序一致。
# 联合搜索 (Union search)
通过 multi_search
请求中的 union
选项,可以将每个搜索查询返回的结果合并为一个有序的命中结果集。
在以下示例中,我们向同一个集合(也可以指定不同集合)发起两个不同的搜索请求。每个搜索查询都在 posts
集合中按两个不同的用户名进行过滤。
由于 union
属性设置为 true
,这两个搜索查询的响应结果将被合并为一个有序的命中结果集。
curl 'http://localhost:8108/multi_search?page=1&per_page=2' -X POST \
-H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" -d '
{
"union": true,
"searches": [
{
"collection": "posts",
"q": "*",
"filter_by": "user_name:stark_industry"
},
{
"collection": "posts",
"q": "*",
"filter_by": "user_name:rogers_steve"
}
]
}'
示例响应
与 SQL 不同,任何搜索请求的结果都可以合并,无论 query_by
、include_fields
、exclude_fields
等参数中指定的字段类型或数量如何。
由于每次搜索的结果会被合并成一个最终结果,union 操作与 multi_search
有以下区别:
- 单个搜索的分页参数(
page
、per_page
、offset
、limit
和limit_hits
)会被忽略。只有作为查询参数传递的全局分页参数会被考虑。 - 排序要求每个搜索请求的排序字段类型、数量和顺序必须相同。例如:
{
"union": true,
"searches": [
{
...
"sort_by": "user_name:asc"
...
},
{
...
"sort_by": "rating:asc"
...
}
]
}
由于字段类型不同(user_name: 字符串
,rating: 浮点数
),上述请求会返回错误。
# multi_search
参数
在 multi_search
请求中的每个独立搜索操作中,你可以使用这里列出的任何搜索参数。
此外,multi_search
请求还支持以下参数:
参数 | 是否必填 | 描述 |
---|---|---|
limit_multi_searches | 否 | 多搜索请求中允许发送的最大搜索请求数量。例如:20 默认值: 50 建议生成一个限定范围的API密钥并将此参数嵌入其中,然后使用该API密钥执行搜索,这样参数会自动应用且无法在搜索时更改。 |
x-typesense-api-key | 否 | 可以为多搜索请求中的每个独立搜索嵌入不同的搜索API密钥。 当你想为不同集合的限定范围API密钥应用不同的嵌入过滤器时,这个功能非常有用。 |
# 示例 UI 实现
这里有一个演示前端应用,展示如何实现联邦搜索(Federated Search) UI:federated-search.typesense.org (opens new window)。
对应的源代码位于:https://github.com/typesense/showcase-federated-search/blob/master/src/app.js (opens new window)