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 itemsjs
const itemsjs = require('itemsjs')(data, configuration);
const items = itemsjs.search();
or using from the client side:
npm install itemsjs
<!-- use the latest release -->
<script src="https://unpkg.com/itemsjs@latest/dist/itemsjs.min.js"></script>
<!-- or use the specify version -->
<script src="https://unpkg.com/[email protected]/dist/itemsjs.min.js"></script>
<!-- or use it locally -->
<script src="/node_modules/itemsjs/dist/itemsjs.js"></script>
itemsjs = itemsjs(data, configuration);
itemsjs.search()
npm install itemsjs
# download json data
wget https://raw.githubusercontent.com/itemsapi/itemsapi-example-data/master/items/movies-processed.json -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 = 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.js
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. fortags
,actors
,colors
, etc. Responsible for generating facets. -
sortings
you can configure different sortings liketags_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 ofsortings
key -
filters
filtering items based on specific aggregations i.e. {tags: ['drama' , 'historical']}
It is making items prefiltering before search or aggregation, i.e.:
itemsjs.prefilter(items) {
return items.filter(item => {
return item.price > 100;
});
}
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
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.