# 联邦/多搜索

多搜索功能允许您在一个 HTTP 请求中发起多个搜索请求。这有助于避免如果将这些请求作为单独的 HTTP 请求发送时产生的往返网络延迟。

您可以使用两种不同的模式:

  • 联邦搜索:多搜索负载中的每个搜索请求都会独立返回结果。
  • 联合搜索:每个搜索请求的响应会被合并成一个统一的排序结果。

# 联邦搜索

通过联邦搜索,您可以使用一个multi_search请求在单个HTTP请求中跨多个集合进行搜索,且各搜索结果是相互独立的。

例如:在电商产品数据集中,您可以通过multi_search请求并行搜索"products"集合和"brands"集合,向用户同时展示产品和品牌的结果。

示例响应

定义

POST ${TYPESENSE_HOST}/multi_search

TIP

对于联邦搜索(federated search),multi_search响应中的results数组保证与请求中searches数组的查询顺序一致。

通过 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_byinclude_fieldsexclude_fields 等参数中指定的字段类型或数量如何。

由于每次搜索的结果会被合并成一个最终结果,union 操作与 multi_search 有以下区别:

  • 单个搜索的分页参数(pageper_pageoffsetlimitlimit_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)