Awesome Open Source
Awesome Open Source

npm version GitHub tag (latest SemVer) GitHub package.json version NPM monthly downloads GitHub license

ItemsJS - search engine in javascript

Full text, faceted, dependency free search engine in javascript. Created to perform fast search on small json dataset (up to 1000 elements).



(by @darkrubyist)

See another demo examples


  • faceted search
  • full text
  • pagination
  • no dependencies (only javascript)

Getting Started


npm install itemsjs
const itemsjs = require('itemsjs')(data, configuration);
const items =;

Client side

or using from the client side:

npm install itemsjs
<!-- CDN -->
<!-- unpkg: use the latest release -->
<script src="[email protected]/dist/itemsjs.min.js"></script>
<!-- unpkg: use a specific version -->
<script src="[email protected]/dist/itemsjs.min.js"></script>
<!-- jsdelivr: use a specific version -->
<script src="[email protected]/dist/itemsjs.min.js"></script>

<!-- locally -->
<script src="/node_modules/itemsjs/dist/itemsjs.js"></script>
itemsjs = itemsjs(data, configuration);

Gulp task:

function itemjs() {
  return src('node_modules/itemsjs/dist/itemsjs.min.js')
}; // Will copy to source/javascripts/itemsjs.min.js


npm install itemsjs

# download json data
wget -O data.json

Create search.js:

var data = require('./data.json');

var itemsjs = require('itemsjs')(data, {
  sortings: {
    name_asc: {
      field: 'name',
      order: 'asc'
  aggregations: {
    tags: {
      title: 'Tags',
      size: 10
    actors: {
      title: 'Actors',
      size: 10
    genres: {
      title: 'Genres',
      size: 10
  searchableFields: ['name', 'tags']

 * get filtered list of movies 
var movies ={
  per_page: 1,
  sort: 'name_asc',
  // full text search
  // query: 'forrest gump',
  filters: {
    tags: ['1980s']
console.log(JSON.stringify(movies, null, 2));

 * get list of top tags 
var top_tags = itemsjs.aggregation({
  name: 'tags',
  per_page: 10
console.log(JSON.stringify(top_tags, null, 2));

Test that with :

node search.js


var itemsjs = ItemsJS(data, [configuration])


The first data argument is an array of objects.


Responsible for defining global configuration. Look for full example here - configuration

  • aggregations filters configuration i.e. for tags, actors, colors, etc. Responsible for generating facets.

  • sortings you can configure different sortings like tags_asc, tags_desc with options and later use it with one key.

  • searchableFields an array of searchable fields.


  • per_page amount of items per page.

  • page page number - used for pagination.

  • query used for full text search.

  • sort used for sorting. one of sortings key

  • filters filtering items based on specific aggregations i.e. {tags: ['drama' , 'historical']}

  • filter function responsible for items filtering. The way of working is similar to js native filter function. See example

  • prefilter function which narrows items down in custom way i.e. with filter or slice. See example

  • isExactSearch set to true if you want to always show exact search matches. See lunr stemmer and lunr stopWordFilter.


It returns full list of filters for specific aggregation


  • name aggregation name
  • per_page filters per page
  • page page number
  • query used for quering filters. It's not full text search

itemsjs.similar(id, options)

It returns similar items to item for given id


  • field field name for computing similarity (i.e. tags, actors, colors)
  • minimum what is the minimum intersection between field of based item and similar item to show them in the result
  • per_page filters per page
  • page page number


It's used in case you need to reindex the whole data


An array of objects.


  • Lunr.js for providing full text search.

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
javascript (67,992
search-engine (169
tags (73
filters (54

Find Open Source By Browsing 7,000 Topics Across 59 Categories