Here's what I'm trying to accomplish.
Old War
shouldn't match, but it does. -> It's not what I'm looking for, there must be an exact match, even though there are two words. Old Man
is a yes, but Old War
is a no.
Man's War
should match. It does at this moment.
Silmarillion
should match. It does at this moment.
The Silmarillion
should also match. It does at this moment.
var express = require('express');
var router = express.Router();
var path = require("path");
var async1 = require("async");
var Fuse = require("fuse.js");
var options = {
shouldSort: true,
tokenize: true,
matchAllTokens: true,
findAllMatches: true,
threshold: 0,
location: 0,
distance: 0,
maxPatternLength: 32,
minMatchCharLength: 2,
keys: ["title"]
};
var arr = [
{
title: "Old Man's War",
author: {
firstName: "John",
lastName: "Scalzi"
}
},
{
title: "The SilmarillionADDITIONALTEXT",
author: {
firstName: "J.R.R",
lastName: "Tolkien"
}
}
];
var keywords = ["Old War", "random title"];
router.get('/search', function (req, res, next) {
async1.waterfall([
function (callback) {
var fuse = new Fuse(r, options);
async1.map(keywords, function (keyword, asyncCallback) {
var results = fuse.search(keyword);
if (results.length !== 0) {
async1.map(results, function (result, async2Callback) {
console.log(result.title + " " + keyword);
});
}
});
callback(null, 'done!');
}
], function (err, result) {
res.sendStatus(200);
});
});
You set tokenize to true. This means that your search "Old War" gets tokenized into ["Old","War"]. Both those tokens match perfectly so it is working correctly. To achieve the output you want, set tokenize to false. Also, setting tokenize to true ignores the settings for threshold, location and distance.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With