搜索 API
使用 Drupal 搜索 API 实现搜索。
你需要安装 JSON:API 搜索 API 模块来查询你的搜索 API 索引。
安装
composer require drupal/search_api drupal/facets drupal/jsonapi_search_api drupal/jsonapi_search_api_facets
- 启用以下模块:搜索 API、数据库搜索、分面、JSON:API 搜索 API 和 JSON:API 搜索 API 分面。
- 按照 此处的指南 创建一个 服务器 和 索引。
对于每个创建的索引,都可使用一个 分面源。你可以使用此源来创建过滤器。
- 访问
/admin/config/search/facets
并点击 添加分面。 - 在 分面源 下,选择上面创建的服务器。对于 字段,选择要过滤的字段。保存。
- 接下来,编辑分面并确保在小部件下选择了 JSON:API 搜索 API。
- 你现在可以通过 JSON:API 查询你的索引。
import { drupal } from "lib/drupal"
const results = await drupal.getSearchIndex(indexName, { params: { filter: { name_of_field: value }, },})
实现
我们建议使用 API 路由 查询搜索索引。使用 API 路由意味着你可以共享搜索索引,使用中间件实现速率限制和过滤。
- 创建以下 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) }}
- 要从你的 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 路由没有当前语言环境的上下文。对于本地化搜索结果,你应该从路由器中传递 locale
和 defaultLocale
。
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