Meilisearch 允许您通过 /multi-search 端点同时发起多个搜索请求。联邦搜索(Federated search)是一种多搜索操作,它能在单个结果列表中返回来自多个查询的结果。

本教程将展示如何为 CRM 应用程序创建包含不同类型数据的独立索引,然后同时搜索所有这些索引以获取统一的结果列表。

前提条件

  • 运行中的 Meilisearch 项目
  • 命令行终端

创建三个索引

下载以下数据集:crm-chats.jsoncrm-profiles.jsoncrm-tickets.json,这些数据来自一个虚构的 CRM 应用程序。

将这些数据集添加到 Meilisearch 并创建三个独立的索引:profileschatstickets

curl  -X POST 'MEILISEARCH_URL/indexes/profiles'  -H 'Content-Type: application/json'  --data-binary @crm-profiles.json &&
curl  -X POST 'MEILISEARCH_URL/indexes/chats'  -H 'Content-Type: application/json'  --data-binary @crm-chats.json &&
curl  -X POST 'MEILISEARCH_URL/indexes/tickets'  -H 'Content-Type: application/json'  --data-binary @crm-tickets.json

使用任务端点检查索引状态。当 Meilisearch 成功索引完所有三个数据集后,您就可以执行联邦搜索了。

执行联邦搜索

当你在CRM应用中查找Natasha Nguyen的电子邮件地址时,你可能不确定会在聊天记录、现有客户档案还是最近的支持工单中找到它。这种情况下,你可以使用联邦搜索来同时搜索所有可能的来源,并获取统一的搜索结果列表。

使用带有federation参数的/multi-search端点来同时查询三个索引:

curl \
  -X POST 'MEILISEARCH_URL/multi-search' \
  -H 'Content-Type: application/json' \
  --data-binary '{
    "federation": {},
    "queries": [
      {
        "indexUid": "chats",
        "q": "natasha"
      },
      {
        "indexUid": "profiles",
        "q": "natasha"
      },
      {
        "indexUid": "tickets",
        "q": "natasha"
      }
    ]
  }'

Meilisearch将返回一个统一的搜索结果列表:

{
  "hits": [
    {
      "id": 0,
      "client_name": "Natasha Nguyen",
      "message": "My email is natasha.nguyen@example.com",
      "time": 1727349362,
      "_federation": {
        "indexUid": "chats",
        "queriesPosition": 0
      }
    },

  ],
  "processingTimeMs": 0,
  "limit": 20,
  "offset": 0,
  "estimatedTotalHits": 3,
  "semanticHitCount": 0
}

提升特定索引的结果权重

由于这是一个 CRM 应用,用户资料中存储了他们偏好的联系信息。如果你想搜索 Riccardo Rotondo 的常用邮箱,可以提升 profiles 索引中文档的权重。

使用 federation 参数的 weight 属性来提升来自特定查询的结果权重:

curl \
  -X POST 'MEILISEARCH_URL/multi-search' \
  -H 'Content-Type: application/json' \
  --data-binary '{
    "federation": {},
    "queries": [
      {
        "indexUid": "chats",
        "q": "rotondo"
      },
      {
        "indexUid": "profiles",
        "q": "rotondo",
        "federationOptions": {
          "weight": 1.2
        }
      },
      {
        "indexUid": "tickets",
        "q": "rotondo"
      }
    ]
  }'

这个请求会使来自 profile 索引的查询结果比其他查询的文档排名更高:

{
  "hits": [
  {
    "id": 1,
    "name": "Riccardo Rotondo",
    "email": "riccardo.rotondo@example.com",
      "_federation": {
        "indexUid": "profiles",
        "queriesPosition": 1
      }
    },

  ],
  "processingTimeMs": 0,
  "limit": 20,
  "offset": 0,
  "estimatedTotalHits": 3,
  "semanticHitCount": 0
}

总结

你已经创建了三个索引,然后执行了联邦多索引搜索以在单个列表中获取所有结果。接着你使用 weight 参数提升了最可能包含所需信息的索引结果权重。