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

mani

v0.1.0

Published

Pure javascript search - browser and node.js

Downloads

12

Readme

Mani

IN DEVELOPMENT - API NOT STABLE

Pure javascript search - browser and node.js

Mani provides a document based search tool in javascript. It merges together free text search, mongodb type queries, geo search and facets from other projects into one library.

Features

  • Free text search
    • field boast
    • injects match score
    • stopword list
  • Query
    • Simple property queries (mongodb syntax)
    • ~~typeTo - enforcing the data type of property for comparisons~~
  • GEO search
    • Nearby query/sort
    • injects distance
  • Facets
  • Pageing and sorting
  • Persistent browser storage
  • Serialize data and indexs to and from a JSON file
  • Works with complex JSON documents with child objects
    • Define property selections with JSON path

Install

npm install mani

Text search

A code example of setting up a search index, loading 2 documents and search for the text 'promises'.


  var options = {
     'text': [
        {'path': 'title', 'boost': 20},
        {'path': 'article.body'}
     ]
  }

  var index = new Mani(options);

    index.add({
      title: 'Are promises better than callback',
      article: {
         body: 'Do promises offer more flexibility than callbacks...',
         tags: ['javascript','es6','promises']
      }
   });
    index.add({
      title: 'ES6 and preprocessors',
      article: {
         body: 'Compile ES6 script on the fly using...',
         tags: ['javascript','es6','traceur','babel']
      }
    });
    
     var results = index.search({
        text: 'promises'
     });

The free text search uses a list of stop words which you can replaces by a new array of words to the option when setup your index. if you want to remove the stop words just add a blank array.

  var options = {
     'stopWords': ['']
     'text': [
        {'path': 'title', 'boost': 20},
        {'path': 'article.body'}
     ]
  }

Query

The current code does simple matches on the content of properties in your docuements

Search with single query:

    var results = index.search({
        'query': {
          {'article.tags','javascript'}
      } 
    })

Search with two queries:

    var results = index.search({
        'query': {
          {'article.published',true}
          {'article.tags','javascript'}
      } 
    })

Comparison query operators

Mani provides a number of simple comparison query operators based on manogodb syntax

  • '$gt': Greater than - {query: {'viewed': {'$gt': 2000}}}
  • '$gte': Greater than or equal - {query: {'viewed': {'$gte': 1284}}}
  • '$lt': Less than - {query: {'viewed': {'$lt': 2000}}}
  • '$lte': Less than or equal - {query: {'viewed': {'$lte': 3552}}}
  • '$exists': Property exists - {query: {'viewed': {'$exists': true}}}
  • '$ne': Not equals - {query: {'viewed': {'$ne': 3552}}}

Nearby

A code example of querying and sorting documents using a geolocation. Adding latitude and longitude paths to the index schema:

  var options = {
     'text': [
        {'path': 'name', 'boost': 20},
        {'path': 'tag'}
     ],
     'geo': {
          'point': {
              'latitudePath': 'location.latitude', 
                'longitudePath': 'location.longitude',
          }
     }
  }
  var index = new Mani(options)

Nearby search join with freetext search for term 'pub':

    var results = index.search({
         'text': 'pub', 
         'nearby': {
            'latitude': 52.516272, 
            'longitude': 13.377722,
            'offset': 0
         }
      })

Properties used for nearby:

  • offset exclude results that are in a radius of the offset - set in meters.

Facets

A code example of returning facets from a document set. From the documents in a search result:

    var results = index.search({
         text: 'promises', 
         facets: {
            'path': 'article.tags'
         }
      })

From all documents in a index:

    var results = index.facets({
        'path': 'article.tags',
        'limit': 20
      })

Properties used in facet:

  • path the JSON path to the property the facets are created from.
  • limit limits the number of facets returned.

Paging and sorting

A code example of returning results in pages set using limit and startAt

    var results = index.search({
         text: 'promises', 
         facets: {
            'path': 'article.tags'
         }
        'limit': 20,
        'startAt': 20,
        'sort': { 
            'path': 'article.titles', 
            'reverse': true
        }
    })

Properties used for paging:

  • limit limits the number of results returned has to 1 or greater.
  • startAt defines where mani starts returning results from within a result set.
  • sort object containing path and direction property .

Browser usage

To use Mani in a browser simple add the script file

  <script src="mani.js"></script>

Persistent browser storage

Within browsers Mani can persist data inbetween browser session. Which allows you to build offline user expereiences. You need to load both the mani.js and mani-persist.js scripts into the browser.

  <script src="mani.js"></script>
  <script src="mani-persist.js"></script>

The Persist object options has a property auto if set to true the data in Mani will be inbetween session.

    var index = new Mani(options);
  var persist = new Persist(index, {
          name: 'places', 
          auto: true
      }, function(err, items){
      // add action such as search
  });

Properties used for persist:

  • name this can be showed to user if storage limits are reached.
  • auto automaticlly persist data between sessions.
Persist save and load

The save and load functions for manually storing data have callback to which are call once the data is either stored or restored. You should make sure you give an index a name before using this feature.

The save function persist the data into the browser

    index.save(function(err, items){
        console.log( err, items );
    })

The load function restores the data back into your index

    index.load(function(err, items){
        console.log( err, items );
    })

Serialize data and indexs to and from a JSON file

You can Serialize data and Mani indexs into a simple to use and store JSON file. This is useful for static site generation or where the data will not be updated once it sent to client.

To JSON

    var index = new Mani(options);
    index.add(...);
    var json = JSON.stringify( index.toJSON() );

From JSON

    var index = new Mani();
    index.fromJSON( JSON.parse(indexJSON) );

Built on top of

This project stand on the shoulders of others:

The name "Mani"

In viking mythology Mani is the man who drives the chariot that carries the Moon across the sky. I thought this would be a good name for a wrapper of lunrjs.

Build

Mani is build using NPM modules and browerify, to make devlopment a little easier I use watchify to compile the js files as a I code. The two watchify commands for the project are:

  • watchify lib/index.js -s Mani -o mani.js
  • watchify lib/persist.js -s Persist -o mani-persist.js

Tests

The project has a number integration and unit tests. To run the test within the project type the following command.

$ mocka --reporter list

Support or Contact

Having trouble, please raise an issue at: https://github.com/glennjones/mani/issues

License

The project is open sourced under MIT license. See the license.txt file within the project source.