Fuse.js: Как вернуть точное совпадение, когда есть два слова для поиска?

Вот что я пытаюсь сделать.

Old War не должно совпадать, но это так. -> Это не то, что я ищу, должно быть точное совпадение, даже если есть два слова. Old Man да, но Old War это нет.

Man's War должен совпадать. Это в данный момент.

Silmarillion должен совпадать. Это в данный момент.

The Silmarillion также должен соответствовать. Это в данный момент.

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);
  });

});

0 ответов

Вы устанавливаете tokenize в true. Это означает, что ваш поиск "Старая война" будет размечен как ["Старая", "Война"]. Оба эти токена идеально совпадают, поэтому он работает правильно. Чтобы получить желаемый результат, установите tokenize в false. Кроме того, установка tokenize в true игнорирует настройки для порога, местоположения и расстояния.

Другие вопросы по тегам