search
HomeWeb Front-endCSS TutorialHow to Add Lunr Search to Your Gatsby Website

How to Add Lunr Search to Your Gatsby Website

The Jamstack architecture is gaining significant traction for website development. Have you explored Gatsby, Nuxt, or Gridsome? Their ease of use and pre-built features are often impressive. However, search functionality isn't always a built-in feature, presenting a challenge for content-rich sites. Can we implement robust search without server-side components?

Jamstack inherently lacks built-in search capabilities. This requires careful consideration and implementation. While options exist, such as Algolia's search-as-a-service (with limitations on free plans) or leveraging WordPress's search with WPGraphQL and Apollo Client, this article focuses on a client-side solution.

We'll build a search index and integrate search into a Gatsby site using Lunr.js, a lightweight JavaScript library offering extensible and customizable search without external server dependencies. We recently used it on tartanify.com to add a "Search by Tartan Name" feature, overcoming challenges related to persistent, real-time search. This article will detail those challenges and solutions.

Getting Started

For simplicity, we'll use the official Gatsby blog starter. This abstracts many aspects of static website creation. To follow along:

gatsby new gatsby-starter-blog https://github.com/gatsbyjs/gatsby-starter-blog
cd gatsby-starter-blog
gatsby develop

This creates a small blog with three posts, accessible at http://localhost:8000/. Inspecting http://localhost:8000/__graphql reveals the available data.

Implementing an Inverted Index with Lunr.js

Lunr employs a record-level inverted index. This maps each word on the site to its location (page paths). We determine which fields (title, content, description, etc.) provide indexing keywords.

For our blog, we'll index titles and content. Titles are straightforward, but content requires cleaning. Initially using rawMarkdownBody proved problematic due to markdown syntax. We'll use the html field and the striptags package to remove HTML tags. Refer to the Lunr documentation for details.

Here's the Lunr index creation and population snippet (used later in gatsby-node.js):

const index = lunr(function () {
  this.ref('slug')
  this.field('title')
  this.field('content')
  for (const doc of documents) {
    this.add(doc)
  }
})

documents is an array of objects, each with slug, title, and content:

{
  slug: '/post-slug/',
  title: 'Post Title',
  content: 'Post content with all HTML tags stripped out.'
}

We define a unique document key (slug) and two fields (title and content). All documents are added iteratively.

Creating the Index in gatsby-node.js

First, install necessary libraries:

yarn add lunr graphql-type-json striptags

Next, modify gatsby-node.js. This file executes during site build, allowing us to add index creation. We'll use the Gatsby API createResolvers to create a new root field, LunrIndex.

Gatsby's data store and query capabilities are exposed via GraphQL field resolvers. getAllNodes retrieves nodes of a specified type:

/* gatsby-node.js */
// ... (imports)

exports.createResolvers = ({ cache, createResolvers }) => {
  createResolvers({
    Query: {
      LunrIndex: {
        type: GraphQLJSONObject,
        resolve: (source, args, context, info) => {
          const blogNodes = context.nodeModel.getAllNodes({ type: `MarkdownRemark` });
          const type = info.schema.getType(`MarkdownRemark`);
          return createIndex(blogNodes, type, cache);
        },
      },
    },
  });
};

// ... (createIndex function)

The createIndex function utilizes the Lunr snippet:

/* gatsby-node.js */
// ... (imports)

const createIndex = async (blogNodes, type, cache) => {
  // ... (Implementation to fetch and process data, including caching)
};

(The complete createIndex function, including data fetching, processing, and caching, is omitted for brevity but is crucial for a functional implementation. The original response provides this detail.) This ensures the index is only rebuilt when necessary.

Adding the Search Form Component

Create a search form component (src/components/search-form.js):

// ... (search form component implementation)

(The complete component implementation is omitted for brevity but is detailed in the original response.) This component handles form submission and input changes, navigating to /search with the query parameter.

Creating the Search Results Page

Create a search results page (src/pages/search.js):

// ... (search results page implementation)

(The complete page implementation is omitted for brevity, but is detailed in the original response.) This page uses the LunrIndex data to display search results.

Persistent Search Widget (Tartanify.com Example)

The tartanify.com example demonstrates a persistent instant search widget. The index creation is similar to the blog example, but simpler:

// ... (index creation for tartanify.com)

(The complete implementation is omitted for brevity but is detailed in the original response.) The key difference is the instant search functionality triggered by input changes, not form submission. The useStaticQuery hook is used for data fetching.

Making the Widget Persistent

To maintain the search widget across page changes, we use Gatsby's wrapPageElement API:

// gatsby-browser.js
// ... (wrapPageElement implementation)

(The complete implementation is detailed in the original response.) This wraps the page content with the search widget, ensuring persistence.

Custom Search Query Enhancements

The original response details improvements to the search query using Lunr's query method to handle fuzzy matches, wildcards, and boolean logic for better search results. This section significantly enhances the search experience.

Conclusion

Implementing search functionality in Jamstack websites is achievable and can significantly improve user experience. While seemingly at odds with the stateless nature of Jamstack, client-side solutions like Lunr.js offer powerful and flexible alternatives. The careful consideration and implementation detailed in this article highlight the potential for creating a superior user experience through thoughtful design and development.

The above is the detailed content of How to Add Lunr Search to Your Gatsby Website. For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
The Ultimate Guide to Linking CSS Files in HTMLThe Ultimate Guide to Linking CSS Files in HTMLMay 13, 2025 am 12:02 AM

Linking CSS files to HTML can be achieved by using elements in part of HTML. 1) Use tags to link local CSS files. 2) Multiple CSS files can be implemented by adding multiple tags. 3) External CSS files use absolute URL links, such as. 4) Ensure the correct use of file paths and CSS file loading order, and optimize performance can use CSS preprocessor to merge files.

CSS Flexbox vs Grid: a comprehensive reviewCSS Flexbox vs Grid: a comprehensive reviewMay 12, 2025 am 12:01 AM

Choosing Flexbox or Grid depends on the layout requirements: 1) Flexbox is suitable for one-dimensional layouts, such as navigation bar; 2) Grid is suitable for two-dimensional layouts, such as magazine layouts. The two can be used in the project to improve the layout effect.

How to Include CSS Files: Methods and Best PracticesHow to Include CSS Files: Methods and Best PracticesMay 11, 2025 am 12:02 AM

The best way to include CSS files is to use tags to introduce external CSS files in the HTML part. 1. Use tags to introduce external CSS files, such as. 2. For small adjustments, inline CSS can be used, but should be used with caution. 3. Large projects can use CSS preprocessors such as Sass or Less to import other CSS files through @import. 4. For performance, CSS files should be merged and CDN should be used, and compressed using tools such as CSSNano.

Flexbox vs Grid: should I learn them both?Flexbox vs Grid: should I learn them both?May 10, 2025 am 12:01 AM

Yes,youshouldlearnbothFlexboxandGrid.1)Flexboxisidealforone-dimensional,flexiblelayoutslikenavigationmenus.2)Gridexcelsintwo-dimensional,complexdesignssuchasmagazinelayouts.3)Combiningbothenhanceslayoutflexibilityandresponsiveness,allowingforstructur

Orbital Mechanics (or How I Optimized a CSS Keyframes Animation)Orbital Mechanics (or How I Optimized a CSS Keyframes Animation)May 09, 2025 am 09:57 AM

What does it look like to refactor your own code? John Rhea picks apart an old CSS animation he wrote and walks through the thought process of optimizing it.

CSS Animations: Is it hard to create them?CSS Animations: Is it hard to create them?May 09, 2025 am 12:03 AM

CSSanimationsarenotinherentlyhardbutrequirepracticeandunderstandingofCSSpropertiesandtimingfunctions.1)Startwithsimpleanimationslikescalingabuttononhoverusingkeyframes.2)Useeasingfunctionslikecubic-bezierfornaturaleffects,suchasabounceanimation.3)For

@keyframes CSS: The most used tricks@keyframes CSS: The most used tricksMay 08, 2025 am 12:13 AM

@keyframesispopularduetoitsversatilityandpowerincreatingsmoothCSSanimations.Keytricksinclude:1)Definingsmoothtransitionsbetweenstates,2)Animatingmultiplepropertiessimultaneously,3)Usingvendorprefixesforbrowsercompatibility,4)CombiningwithJavaScriptfo

CSS Counters: A Comprehensive Guide to Automatic NumberingCSS Counters: A Comprehensive Guide to Automatic NumberingMay 07, 2025 pm 03:45 PM

CSSCountersareusedtomanageautomaticnumberinginwebdesigns.1)Theycanbeusedfortablesofcontents,listitems,andcustomnumbering.2)Advancedusesincludenestednumberingsystems.3)Challengesincludebrowsercompatibilityandperformanceissues.4)Creativeusesinvolvecust

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.