使用一个搜索查询搜索两个属性
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.first
和 name.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>
我有 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.first
和 name.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>