Overview

I tried Next.js for Drupal.

By following the "Get Started" guide, I was able to integrate Next.js with Drupal.

Additionally, the following article introduces an implementation example for faceted search.

This article is my notes specifically on implementing the latter, faceted search.

Search API

Create a Server and index as follows.

The official site provides the following as a reference:

For a Japanese-language reference:

Creating a Server

Creating an Index

Here, we create an index named test_index_20230417.

Additionally, I added the title as a field.

After that, perform indexing.

JSON:API

After completing the above, clear the cache.

/admin/config/development/performance

Then, the endpoint becomes accessible at the following URL.

/jsonapi/index/test_index_20230417

Search results can be filtered using query parameters like the following:

/jsonapi/index/test_index_20230417?filter[title]=更新したタイトル

{
  "jsonapi": {
    "version": "1.0",
    "meta": {
      "links": {
        "self": {
          "href": "http://jsonapi.org/format/1.0/"
        }
      }
    }
  },
  "data": [
    {
      "type": "node--service",
      "id": "82a34c35-f1b7-49eb-81ac-f15d0deac22c",
      "links": {
        "self": {
          "href": "https://xxx/jsonapi/node/service/82a34c35-f1b7-49eb-81ac-f15d0deac22c?resourceVersion=id%3A5075"
        }
      },
      "attributes": {
        "drupal_internal__nid": 4,
        "drupal_internal__vid": 5075,
        "langcode": "en",
        "revision_timestamp": "2023-04-12T08:19:00+00:00",
        "revision_log": null,
        "status": true,
        "title": "更新したタイトル",
        "created": "2023-04-11T02:09:35+00:00",
        "changed": "2023-04-12T08:19:00+00:00",
        "promote": false,
        "sticky": false,
        "default_langcode": true,
        "revision_translation_affected": true,
	...

Facets

Access the following:

/admin/config/search/facets

Press "Add facet" and select the index you created earlier.

On the next screen, select "JSON:API Search API" for the Widget.

After that, clear the cache and access the endpoint again.

/jsonapi/index/test_index_20230417

A facets item has been added as shown below. This can be used to implement faceted search on the frontend side.

{
  "jsonapi": {
    "version": "1.0",
    "meta": {
      "links": {
        "self": {
          "href": "http://jsonapi.org/format/1.0/"
        }
      }
    }
  },
  "data": [...],
  "meta": {
    "count": 2,
    "facets": [
      {
        "id": "title_20230417",
        "label": "Title",
        "path": "title_20230417",
        "terms": [
          {
            "url": "https://xxx/jsonapi/index/test_index_20230417?filter%5Btitle_20230417%5D=%E5%B9%B3%E8%B3%80%E8%AD%B2%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96",
            "values": {
              "value": "平賀譲デジタルアーカイブ",
              "label": "平賀譲デジタルアーカイブ",
              "active": false,
              "count": 1
            }
          },
          {
            "url": "https://xxx/jsonapi/index/test_index_20230417?filter%5Btitle_20230417%5D=%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%9F%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB",
            "values": {
              "value": "更新したタイトル",
              "label": "更新したタイトル",
              "active": false,
              "count": 1
            }
          }
        ]
      }
    ]
  },
  "links": {
    "self": {
      "href": "https://xxx/jsonapi/index/test_index_20230417"
    }
  }
}

Summary

An example of integration with Next.js has its source code published in the following repository:

By replacing it with the index and fields you configured yourself, you can create a search page like the following demo page:

I hope this serves as a useful reference for implementing faceted search using the JSON:API module.