使用一个搜索查询搜索两个属性

Search in two properties using one search query

我有 JSON 个如下所示的对象:

[
    {
        "name": { "first": "John", "last": "Doe" }
    },
    {
        "name": { "first": "Foo", "last": "Bar" }
    }
]

我的 FuseJS 搜索选项是:

  var searchOpts = {
        shouldSort: true,
        threshold: 0.2,
        location: 0,
        distance: 100,
        maxPatternLength: 32,
        minMatchCharLength: 5,
        matchAllTokens: true,
        keys: [{
            name: "name.first", 
            weight: 0.3
        }, {
            name: "name.last",
            weight: 0.3
        }]
    }

我正在做的是获取用户输入的值并从包含所有人姓名的对象中搜索。

var fuse = new Fuse( peopleObj, searchOpts);
var result = fuse.search( query );

只要用户仅使用名字或姓氏进行搜索,一切正常,但如果他们输入 "John Doe",则应该返回的对象不会返回,但确实有效如果他们只输入 "John" 或 "Doe"。

我可以通过简单地在像 "name": {"fullName": "John Doe"} 这样的对象中设置另一个 属性 来实现这一点,但我对此并不满意,因为将来数据可能会变得更大,这只是一个处理能力的浪费。

如何确保 FuseJS 通过组合而不是单独搜索 name.firstname.last 属性。我以为matchAllTokens

遗憾的是,fusejs 目前不提供跨多个键的搜索。

您可以按照将所有感兴趣的键组合成一个键的方法,例如

function combineAllKeyValues( obj, separator )
{
    separator = separator || " ";
    obj.all = Object.keys(obj.name).map(s=> obj.name[s]).join( separator );
    return obj;
}

演示

var peopleObj = [{
    "name": {
      "first": "John",
      "last": "Doe"
    }
  },
  {
    "name": {
      "first": "Foo",
      "last": "Bar"
    }
  }
];

var searchOpts = {
  shouldSort: true,
  threshold: 0.2,
  location: 0,
  distance: 100,
  maxPatternLength: 32,
  minMatchCharLength: 5,
  matchAllTokens: false,
  keys: [{
    name: "name.first",
    weight: 0.3
  }, {
    name: "name.last",
    weight: 0.3
  }, {
    name: "all",
    weight: 0.1
  }]
};

function combineAllKeyValues( obj, separator )
{
 separator = separator || " ";
 obj.all = Object.keys(obj.name).map(s=> obj.name[s]).join( separator );
 return obj;
}

peopleObj = peopleObj.map( s => combineAllKeyValues(s) );

var fuse = new Fuse( peopleObj, searchOpts);
var result = fuse.search( "John Doe" );

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/fuse.js/3.0.4/fuse.min.js"></script>