View on GitHub

read-the-docs

A lightweight guidebook on quick lessons I've learned

I needed to reliably fuzzy search through a large list of items, and found that a popular library, fuse js, did not return reliable results out of the box

Using

Settings

Implementation

Setup

// import fuse, lodash, and create bucket for results
var _ = require('lodash');
var Fuse = require('fuse.js');
var results = [];
var search = 'some search query';

// filter search down to words specified by settings, return array of words to search with
var searchArray = search.split(' ');
var wordsToSearchWith = _.filter(searchArray, (word) => { return word.length >= settings.minWordLength || settings.whiteList.includes(word) }); 
// define items to search as array of objects
var itemsToSearch = [{name: 'some name', tags: 'new'}, {name: 'other name', tags: 'old'}];

// create new fuse js constructor
var f = new Fuse(itemsToSearch, settings);

// search items with each search word
wordsToSearchWith.forEach((word) => {
  var result = f.search(word);
  result.forEach((record) => {
    if (record.score < settings.minScoreRequired) {
      results.push(record.item);
    }
  });
});

// log search results
uniqueResults = _.uniq(results)
console.log(uniqueResults);

back