Full text, faceted, dependency free search engine in javascript. Created to perform fast search on small json dataset (up to 1000 elements).
(by @darkrubyist)
- faceted search
- full text
- pagination
- no dependencies (only javascript)
npm install itemsjsconst itemsjs = require('itemsjs')(data, configuration);
const items = itemsjs.search();or using from the client side:
npm install itemsjs<!-- CDN -->
<!-- unpkg: use the latest release -->
<script src="https://unpkg.com/itemsjs@latest/dist/itemsjs.min.js"></script>
<!-- unpkg: use a specific version -->
<script src="https://unpkg.com/itemsjs@1.0.49/dist/itemsjs.min.js"></script>
<!-- jsdelivr: use a specific version -->
<script src="https://cdn.jsdelivr.net/npm/itemsjs@1.0.49/dist/itemsjs.min.js"></script>
<!-- locally -->
<script src="/node_modules/itemsjs/dist/itemsjs.js"></script>itemsjs = itemsjs(data, configuration);
itemsjs.search()Gulp task:
function itemjs() {
return src('node_modules/itemsjs/dist/itemsjs.min.js')
.pipe(dest('source/javascripts/'));
}; // Will copy to source/javascripts/itemsjs.min.jsnpm install itemsjs
# download json data
wget https://raw.githubusercontent.com/itemsapi/itemsapi-example-data/master/items/movies-processed.json -O data.jsonCreate 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 = itemsjs.search({
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.jsThe first data argument is an array of objects.
Responsible for defining global configuration. Look for full example here - configuration
-
aggregationsfilters configuration i.e. fortags,actors,colors, etc. Responsible for generating facets. -
sortingsyou can configure different sortings liketags_asc,tags_descwith options and later use it with one key. -
searchableFieldsan array of searchable fields.
-
per_pageamount of items per page. -
pagepage number - used for pagination. -
queryused for full text search. -
sortused for sorting. one ofsortingskey -
filtersfiltering items based on specific aggregations i.e. {tags: ['drama' , 'historical']} -
filterfunction responsible for items filtering. The way of working is similar to js native filter function. See example -
prefilterfunction which narrows items down in custom way i.e. with filter or slice. See example -
isExactSearchset totrueif you want to always show exact search matches. See lunr stemmer and lunr stopWordFilter.
It returns full list of filters for specific aggregation
nameaggregation nameper_pagefilters per pagepagepage numberqueryused for quering filters. It's not full text search
It returns similar items to item for given id
fieldfield name for computing similarity (i.e. tags, actors, colors)minimumwhat is the minimum intersection between field of based item and similar item to show them in the resultper_pagefilters per pagepagepage number
It's used in case you need to reindex the whole data
An array of objects.
- Lunr.js for providing full text search.