npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

itemsjs

v2.1.25

Published

Created to perform fast search on small json dataset (up to 1000 elements).

Downloads

12,343

Readme

npm version GitHub package.json version NPM monthly downloads GitHub license

ItemsJS - search engine in javascript

Extremely fast faceted search engine in JavaScript - lightweight, flexible, and simple to use. Created to perform fast search on json dataset (up to 100K items).

Demo

demo

See another demo examples

Use cases

Itemsjs is being used mostly for data classification of companies, products, publications, documents, jobs or plants

The solution has been implemented by people from Amazon, Hermes, Apple, Microsoft, James Cook University, Carnegie Mellon University and more. You can find a list of real implementations - here

Features

  • Ultra-fast faceted search: Process and filter data with blazing speed.
  • Simple full-text search: Intuitive and straightforward text searching.
  • Relevance scoring: Rank search results based on relevance.
  • Facet filtering and sorting: Filter and order results by various facets.
  • Pagination
  • Works on both backend and frontend
  • Integration with custom full-text search engines

Getting Started

NPM

npm install itemsjs

Using CommonJS syntax

const itemsjs = require('itemsjs')(data, configuration);
const items = itemsjs.search();

Using ES Module syntax

import itemsjs from 'itemsjs';
const searchEngine = itemsjs(data, configuration);
const items = searchEngine.search();

Client side

To use as an UMD in the browser:
<!-- CDN -->
<!-- unpkg: use the latest release -->
<script src="https://unpkg.com/itemsjs@latest/dist/index.umd.js"></script>
<!-- unpkg: use a specific version -->
<script src="https://unpkg.com/[email protected]/dist/index.umd.js"></script>
<!-- jsdelivr: use a specific version -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/index.umd.js"></script>
<script>
  itemsjs = itemsjs(data, configuration);
  itemsjs.search()
</script>
To use as an ES module in the browser:
<!-- Include as ES Module -->
<script type="module">
  import itemsjs from 'https://unpkg.com/[email protected]/dist/index.module.js';
  // Initialize and use itemsjs here
  const searchEngine = itemsjs(data, configuration);
  searchEngine.search();
</script>

Example usage

npm install itemsjs

# download json data
wget https://raw.githubusercontent.com/itemsapi/itemsapi-example-data/master/items/imdb.json -O data.json

Next, create a search.js file with the following content:

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

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

/**
 * get filtered list of movies 
 */
const 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 
 */
const top_tags = itemsjs.aggregation({
  name: 'tags',
  per_page: 10
})
console.log(JSON.stringify(top_tags, null, 2));

Run your script with Node.js:

node search.js

Integrations

If native full text search is not enough then you can integrate with external full text search.

How it works:

  • each item of your data needs to have id field. It can be also custom field but it needs to be defined.
  • native_search_enabled option in configuration should be disabled
  • index data once in your search and itemsjs
  • make search in your custom search and provide ids data into itemsjs
  • done!

Examples:

API

const itemsjs = ItemsJS(data, [configuration])

data

The first data argument is an array of objects.

configuration

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.

    Each filter can have it's own configuration. You can access those as buckets on the search() response.

    • title Human readable filter name
    • size Number of values provided for this filter (Default: 10)
    • sort Values sorted by count (Default) or key for the value name. This can be also an array of keys which define the sorting priority
    • order asc | desc. This can be also an array of orders (if sort is also array)
    • show_facet_stats true | false (Default) to retrieve the min, max, avg, sum rating values from the whole filtered dataset
    • conjunction true (Default) stands for an AND query (results have to fit all selected facet-values), false for an OR query (results have to fit one of the selected facet-values)
    • chosen_filters_on_top true (Default) Filters that have been selected will appear above those not selected, false for filters displaying in the order set out by sort and order regardless of selected status or not
    • hide_zero_doc_count true | false (Default) Hide filters that have 0 results returned
  • 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.

  • native_search_enabled if native full text search is enabled (true | false. It's enabled by default)

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

  • removeStopWordFilter set to true if you want to remove the stopWordFilter. See https://github.com/itemsapi/itemsjs/issues/46.

itemsjs.search(options)

options

  • 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

  • filters_query boolean filtering i.e. (tags:novel OR tags:80s) AND category:Western

  • is_all_filtered_items set to true if you want to return the whole filtered dataset.

itemsjs.aggregation(options)

It returns full list of filters for specific aggregation

options

  • name aggregation name
  • per_page filters per page
  • page page number
  • query used for quering filters. It's not full text search
  • conjunction true (Default) stands for an AND query, false for an OR query

itemsjs.similar(id, options)

It returns similar items to item for given id

options

  • 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

itemsjs.reindex(data)

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

data

An array of objects.