Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

lunr

olivernn7.3mMIT2.3.9TypeScript support: definitely-typed

Simple full-text search in your browser.

search

readme

Lunr.js

Join the chat at https://gitter.im/olivernn/lunr.js

Build Status

A bit like Solr, but much smaller and not as bright.

Example

A very simple search index can be created using the following:

var idx = lunr(function () {
  this.field('title')
  this.field('body')

  this.add({
    "title": "Twelfth-Night",
    "body": "If music be the food of love, play on: Give me excess of it…",
    "author": "William Shakespeare",
    "id": "1"
  })
})

Then searching is as simple as:

idx.search("love")

This returns a list of matching documents with a score of how closely they match the search query as well as any associated metadata about the match:

[
  {
    "ref": "1",
    "score": 0.3535533905932737,
    "matchData": {
      "metadata": {
        "love": {
          "body": {}
        }
      }
    }
  }
]

API documentation is available, as well as a full working example.

Description

Lunr.js is a small, full-text search library for use in the browser. It indexes JSON documents and provides a simple search interface for retrieving documents that best match text queries.

Why

For web applications with all their data already sitting in the client, it makes sense to be able to search that data on the client too. It saves adding extra, compacted services on the server. A local search index will be quicker, there is no network overhead, and will remain available and usable even without a network connection.

Installation

Simply include the lunr.js source file in the page that you want to use it. Lunr.js is supported in all modern browsers.

Alternatively an npm package is also available npm install lunr.

Browsers that do not support ES5 will require a JavaScript shim for Lunr to work. You can either use Augment.js, ES5-Shim or any library that patches old browsers to provide an ES5 compatible JavaScript environment.

Features

  • Full text search support for 14 languages
  • Boost terms at query time or boost entire documents at index time
  • Scope searches to specific fields
  • Fuzzy term matching with wildcards or edit distance

Contributing

See the CONTRIBUTING.md file.

changelog

Changelog

2.3.9

  • Fix bug #469 where a union with a complete set returned a non-complete set. Thanks Bertrand Le Roy for reporting and fixing.

2.3.8

  • Fix bug #422 where a pipline function that returned null was not skipping the token as described in the documentation. Thanks Stephen Cleary and Rob Hoelz for reporting and investigating.

2.3.7

  • Fix bug #417 where leading white space would cause token position metadata to be reported incorrectly. Thanks Rob Hoelz for the fix.

2.3.6

  • Fix bug #390 with fuzzy matching that meant deletions at the end of a word would not match. Thanks Luca Ongaro for reporting.

2.3.5

  • Fix bug #375 with fuzzy matching that meant insertions at the end of a word would not match. Thanks Luca Ongaro for reporting and to Rob Hoelz for providing a fix.
  • Switch to using Array.isArray when checking for results from pipeline functions to support vm.runInContext, #381 thanks Rob Hoelz.

2.3.4

2.3.3

  • Fig bugs #270 and #368, some wildcard searches over long tokens could be extremely slow, potentially pinning the current thread indefinitely. Thanks Kyle Spearrin and Mohamed Eltuhamy for reporting.

2.3.2

  • Fix bug #369 in parsing queries that include either a boost or edit distance modifier followed by a presence modifier on a subsequent term. Thanks mtdjr for reporting.

2.3.1

2.3.0

  • Add support for build time field and document boosts.
  • Add support for indexing nested document fields using field extractors.
  • Prevent usage of problematic characters in field names, thanks Stephane Mankowski.
  • Fix bug when using an array of tokens in a single query term, thanks Michael Manukyan.

2.2.1

  • Fix bug #344 in logic for required terms in multiple fields, thanks Stephane Mankowski.
  • Upgrade mocha and fix some test snafus.

2.2.0

  • Add support for queries with term presence, e.g. required terms and prohibited terms.
  • Add support for using the output of lunr.tokenizer directly with lunr.Query#term.
  • Add field name metadata to tokens in build and search pipelines.
  • Fix documentation for lunr.Index constructor, thanks Michael Manukyan.

2.1.6

  • Improve pipeline performance for large fields #329, thanks andymcm.

2.1.5

  • Fix bug #320 which caused result metadata to be nested under search term instead of field name. Thanks Jonny Gerig Meyer for reporting and fixing.

2.1.4

  • Cache inverse document calculation during build to improve build performance.
  • Introduce new method for combining term metadata at search time.
  • Improve performance of searches with duplicate search terms.
  • Tweaks to build process.

2.1.3

  • Remove private tag from lunr.Builder#build, it should be public, thanks Sean Tan.

2.1.2

  • Fix bug #282 which caused metadata stored in the index to be mutated during search, thanks Andrew Aldridge.

2.1.1

  • Fix bug #280 in builder where an object with prototype was being used as a Map, thanks Pete Bacon Darwin.

2.1.0

  • Improve handling of term boosts across multiple fields #263
  • Enable escaping of special characters when performing a search #271
  • Add ability to programatically include leading and trailing wildcards when performing a query.

2.0.4

  • Fix bug in IDF calculation that meant the weight for common words was not correctly calculated.

2.0.3

  • Fix bug #256 where duplicate query terms could cause a 'duplicate index' error when building the query vector. Thanks Bjorn Svensson, Jason Feng, and et1421 for reporting and confirming the issue.

2.0.2

  • Fix bug #255 where search queries used a different separator than the tokeniser causing some terms to not be searchable. Thanks Wes Cossick for reporting.
  • Reduce precision of term scores stored in document vectors to reduce the size of serialised indexes by ~15%, thanks Qvatra for the idea.

2.0.1

  • Fix regression #254 where documents containing terms that match properties from Object.prototype cause errors during indexing. Thanks VonFry for reporting.

2.0.0

  • Indexes are now immutable, this allows for more space efficient indexes, more advanced searching and better performance.
  • Text processing can now attach metadata to tokens the enter the index, this opens up the possibility of highlighting search terms in results.
  • More advanced searching including search time field boosts, search by field, fuzzy matching and leading and trailing wildcards.

1.0.0

  • Deprecate incorrectly spelled lunr.tokenizer.separator.
  • No other changes, but bumping to 1.0.0 because it's overdue, and the interfaces are pretty stable now. It also paves the way for 2.0.0...

0.7.2

  • Fix bug when loading a serialised tokeniser #226, thanks Alex Turpin for reporting the issue.
  • Learn how to spell separator #223, thanks peterennis for helping me learn to spell.

0.7.1

  • Correctly set the license using the @license doc tag #217, thanks Carlos Araya.

0.7.0

  • Make tokenizer a property of the index, allowing for different indexes to use different tokenizers #205 and #21.
  • Fix bug that prevented very large documents from being indexed #203, thanks Daniel Grießhaber.
  • Performance improvements when adding documents to the index #208, thanks Dougal Matthews.

0.6.0

  • Ensure document ref property type is preserved when returning results #117, thanks Kyle Kirby.
  • Introduce lunr.generateStopWordFilter for generating a stop word filter from a provided list of stop words.
  • Replace array-like string access with ES3 compatible String.prototype.charAt #186, thanks jkellerer.
  • Move empty string filtering from lunr.trimmer to lunr.Pipeline.prototype.run so that empty tokens do not enter the index, regardless of the trimmer being used #178, #177 and #174
  • Allow tokenization of arrays with null and non string elements #172.
  • Parameterize the seperator used by lunr.tokenizer, fixes #102.

0.5.12

  • Implement lunr.stopWordFilter with an object instead of using lunr.SortedSet #170, resulting in a performance boost for the text processing pipeline, thanks to Brian Vaughn.
  • Ensure that lunr.trimmer does not introduce empty tokens into the index, #166, thanks to janeisklar

0.5.11

0.5.10

0.5.9

  • Remove recursion from SortedSet#indexOf and SortedSet#locationFor to gain small performance gains in Index#search and Index#add
  • Fix incorrect handling of non existant functions when adding/removing from a Pipeline #146 thanks to weixsong

0.5.8

0.5.7

0.5.6

  • Performance improvement when add documents to the index #114 thanks Alex Holmes

0.5.5

0.5.4

0.5.3

0.5.2

  • Use npm they said, it'll be easy they said.

0.5.1

0.5.0

  • Add plugin support to enable i18n and other extensions to lunr.
  • Add AMD support #72 thanks lnwdr.
  • lunr.Vector now implemented using linked lists for better performance especially in indexes with large numbers of unique tokens.
  • Build system clean up.

0.4.5

  • Fix performance regression introduced in 0.4.4 by fixing #64.

0.4.4

  • Fix bug #64 idf cache should handle tokens with the same name as object properties, thanks gitgrimbo.
  • Intersperse source files with a semicolon as part of the build process, fixes #61, thanks shyndman.

0.4.3

  • Fix bug #49 tokenizer should handle null and undefined as arguments, thanks jona.

0.4.2

  • Fix bug #47 tokenizer converts its input to a string before trying to split it into tokens, thanks mikhailkozlov.

0.4.1

  • Fix bug #41 that caused issues when indexing mixed case tags, thanks Aptary

0.4.0

  • Add index mutation events ('add', 'update' and 'remove').
  • Performance improvements to searching.
  • Penalise non-exact matches so exact matches are better ranked than expanded matches.

0.3.3

  • Fix bug #32 which prevented lunr being used where a console object is not present, thanks Tony Marklove and wyuenho

0.3.2

  • Fix bug #27 when trying to calculate tf with empty fields, thanks Gambhiro

0.3.1

0.3.0

  • Implement JSON serialisation, allows indexes to be loaded and dumped, thanks ssured.
  • Performance improvements to searching and indexing.
  • Fix bug #15 with tokeniser that added stray empty white space to the index, thanks ssured.

0.2.3

0.2.2

  • Boost exact term matches so they are better ranked than expanded term matches, fixes #10, thanks ssured

0.2.1

  • Changes to the build process.
  • Add component.json and package.json
  • Add phantomjs test runner
  • Remove redundant attributes
  • Many spelling corrections, thanks Pascal Borreli