如何使用 lunr.js 进行搜索
How to search using lunr.js
lunr.js 对以下格式的数据很有吸引力
[{
'id': 1,
'first_name': 'Joseph',
'last_name': 'Williams',
'email': 'jwilliams0@hud.gov',
'gender': 'Male',
'age': 94
}, {
'id': 2,
'first_name': 'Christina',
'last_name': 'Lawrence',
'email': 'clawrence1@clickbank.net',
'gender': 'Female',
'age': 67
}]
但当数据如下所示时,它不会。
[{
'id': { 'id': 614, 'value': 1 },
'first_name': { 'id': 244, 'value': 'Johnny' },
'last_name': { 'id': 724, 'value': 'Fields' },
'email': { 'id': 567, 'value': 'jfields0@barnesandnoble.com' },
'gender': { 'id': 220, 'value': 'Male' },
'age': { 'id': 745, 'value': 18 }
}, {
'id': { 'id': 204, 'value': 2 },
'first_name': { 'id': 163, 'value': 'Kathy' },
'last_name': { 'id': 991, 'value': 'Gilbert' },
'email': { 'id': 453, 'value': 'kgilbert1@over-blog.com' },
'gender': { 'id': 184, 'value': 'Female' },
'age': { 'id': 337, 'value': 50 }
}]
有关如何为我的数据编制索引以使其发挥作用的任何提示。
添加到 lunr 的文档的格式应该类似于您在答案的第一部分中使用的格式,如果您的数据具有其他结构,那么您将不得不将其转换为 lunr 可以理解的格式。
假设您的索引定义如下所示:
var idx = lunr(function () {
this.ref('id')
this.field('first_name')
this.field('last_name')
this.field('email')
this.field('gender')
this.field('age')
})
然后在将文档添加到索引之前,您需要通过这样的函数映射它:
var mapDocument = function (doc) {
return Object.keys(doc).reduce(function (memo, key) {
memo[key] = doc[key].value
return memo
}, {})
}
该功能有效地压平了整个文档,您可能希望限制实际从文档中提取的字段,但希望您明白了。然后上面的函数将从以下位置转换您的文档:
{
'id': { 'id': 614, 'value': 1 },
'first_name': { 'id': 244, 'value': 'Johnny' },
'last_name': { 'id': 724, 'value': 'Fields' },
'email': { 'id': 567, 'value': 'jfields0@barnesandnoble.com' },
'gender': { 'id': 220, 'value': 'Male' },
'age': { 'id': 745, 'value': 18 }
}
lunr 可以理解的东西:
{
'id': 1,
'first_name': 'Johnny',
'last_name': 'Fields',
'email': 'jfields0@barnesandnoble.com',
'gender': 'Male',
'age': 18
}
lunr.js 对以下格式的数据很有吸引力
[{
'id': 1,
'first_name': 'Joseph',
'last_name': 'Williams',
'email': 'jwilliams0@hud.gov',
'gender': 'Male',
'age': 94
}, {
'id': 2,
'first_name': 'Christina',
'last_name': 'Lawrence',
'email': 'clawrence1@clickbank.net',
'gender': 'Female',
'age': 67
}]
但当数据如下所示时,它不会。
[{
'id': { 'id': 614, 'value': 1 },
'first_name': { 'id': 244, 'value': 'Johnny' },
'last_name': { 'id': 724, 'value': 'Fields' },
'email': { 'id': 567, 'value': 'jfields0@barnesandnoble.com' },
'gender': { 'id': 220, 'value': 'Male' },
'age': { 'id': 745, 'value': 18 }
}, {
'id': { 'id': 204, 'value': 2 },
'first_name': { 'id': 163, 'value': 'Kathy' },
'last_name': { 'id': 991, 'value': 'Gilbert' },
'email': { 'id': 453, 'value': 'kgilbert1@over-blog.com' },
'gender': { 'id': 184, 'value': 'Female' },
'age': { 'id': 337, 'value': 50 }
}]
有关如何为我的数据编制索引以使其发挥作用的任何提示。
添加到 lunr 的文档的格式应该类似于您在答案的第一部分中使用的格式,如果您的数据具有其他结构,那么您将不得不将其转换为 lunr 可以理解的格式。
假设您的索引定义如下所示:
var idx = lunr(function () {
this.ref('id')
this.field('first_name')
this.field('last_name')
this.field('email')
this.field('gender')
this.field('age')
})
然后在将文档添加到索引之前,您需要通过这样的函数映射它:
var mapDocument = function (doc) {
return Object.keys(doc).reduce(function (memo, key) {
memo[key] = doc[key].value
return memo
}, {})
}
该功能有效地压平了整个文档,您可能希望限制实际从文档中提取的字段,但希望您明白了。然后上面的函数将从以下位置转换您的文档:
{
'id': { 'id': 614, 'value': 1 },
'first_name': { 'id': 244, 'value': 'Johnny' },
'last_name': { 'id': 724, 'value': 'Fields' },
'email': { 'id': 567, 'value': 'jfields0@barnesandnoble.com' },
'gender': { 'id': 220, 'value': 'Male' },
'age': { 'id': 745, 'value': 18 }
}
lunr 可以理解的东西:
{
'id': 1,
'first_name': 'Johnny',
'last_name': 'Fields',
'email': 'jfields0@barnesandnoble.com',
'gender': 'Male',
'age': 18
}