Meilisearch 允许您使用 /multi-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 的电子邮件地址时,您可能不知道会在聊天记录、现有客户资料还是最近的支持工单中找到它。在这种情况下,您可以使用联合搜索来搜索所有可能的来源并接收单个结果列表。

使用 /multi-search 端点和 federation 参数同时查询这三个索引

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 [email protected]",
      "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": "[email protected]",
      "_federation": {
        "indexUid": "profiles",
        "queriesPosition": 1
      }
    },

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

总结

您创建了三个索引,然后执行了联合多索引搜索以在一个列表中接收所有结果。然后,您使用 weight 来提升最有可能包含所需信息的索引中的结果。