搜索 API

使用 Drupal 搜索 API 实现搜索。


你需要安装 JSON:API 搜索 API 模块来查询你的搜索 API 索引。


安装

  1. 首先安装 搜索 API 模块。如果你想要使用分面搜索,请安装 分面 模块。
composer require drupal/search_api drupal/facets drupal/jsonapi_search_api drupal/jsonapi_search_api_facets
  1. 启用以下模块:搜索 API数据库搜索分面JSON:API 搜索 APIJSON:API 搜索 API 分面
  2. 按照 此处的指南 创建一个 服务器索引

对于每个创建的索引,都可使用一个 分面源。你可以使用此源来创建过滤器。

  1. 访问 /admin/config/search/facets 并点击 添加分面
  2. 分面源 下,选择上面创建的服务器。对于 字段,选择要过滤的字段。保存。
  3. 接下来,编辑分面并确保在小部件下选择了 JSON:API 搜索 API
  4. 你现在可以通过 JSON:API 查询你的索引。
import { drupal } from "lib/drupal"
const results = await drupal.getSearchIndex(indexName, {
params: {
filter: { name_of_field: value },
},
})

实现

我们建议使用 API 路由 查询搜索索引。使用 API 路由意味着你可以共享搜索索引,使用中间件实现速率限制和过滤。

  1. 创建以下 API 路由。

api/pages/[index].tsx

import { NextApiRequest, NextApiResponse } from "next"
import { DrupalNode } from "next-drupal"
import { drupal } from "lib/drupal"
export default async function handler(
request: NextApiRequest,
response: NextApiResponse
) {
try {
const body = JSON.parse(request.body)
const { index } = request.query
const results = await drupal.getSearchIndex<DrupalNode>(
index as string,
body
)
response.json(results)
} catch (error) {
return response.status(400).json(error.message)
}
}
  1. 要从你的 React 组件发出搜索请求,你可以使用简单的 fetch 请求。
const response = await fetch("/api/search/INDEX-NAME-HERE", {
method: "POST",
body: JSON.stringify({
params: {
filter: { name_of_field: value },
},
}),
})

本地化搜索结果

Next.js API 路由没有当前语言环境的上下文。对于本地化搜索结果,你应该从路由器中传递 localedefaultLocale

const router = useRouter()
const response = await fetch("/api/search/INDEX-NAME-HERE", {
method: "POST",
body: JSON.stringify({
params: {
filter: { name_of_field: value },
},
locale: router.locale,
defaultLocale: router.defaultLocale,
}),
})

演示

请查看 https://example-search-api.next-drupal.org

示例

请查看 https://github.com/chapter-three/next-drupal/tree/main/examples/example-search-api