为什么 lunr 不会索引 JSON 数组中的多个单词字符串?
Why won't lunr index multiple word strings in JSON arrays?
Lunr 在查找大多数结果方面做得很好,但我不明白为什么它不会 return 包含在 JSON 数组中的多词字符串。
这里有一个示例 JSON 文件,用于了解我的数据的结构:
[{
"title": "Rolling Loud",
"date": "May 5–7",
"location": "Miami, FL, USA",
"rock-artists": [],
"hh-artists": ["Kendrick Lamar", "Future"],
"electronic-artists": [],
"other-artists": []
}]
当我搜索 "Miami" 和 "Future" 时,lunr return 是节日。但是,当搜索 "Kendrick" 或 "Kendrick Lamar" 时,lunr 不会 return 节日。
相关代码:
// initialize lunr
var idx = lunr(function () {
this.field('id');
this.field('title', { boost: 3 });
this.field('date');
this.field('location');
this.field('rockArtists', { boost: 3 });
this.field('hhArtists', { boost: 3 });
this.field('electronicArtists', { boost: 3 });
this.field('otherArtists', { boost: 3 });
// add festivals to lunr
for (var key in data) {
this.add({
'id': key,
'title': data[key].title,
'date': data[key].date,
'location': data[key].location,
'rockArtists': data[key]['rock-artists'],
'hhArtists': data[key]['hh-artists'],
'electronicArtists': data[key]['electronic-artists'],
'otherArtists': data[key]['other-artists']
});
}
});
谢谢!
Lunr 是索引hh-artists
字段,您应该能够通过查找索引中的值之一来确认这一点:
idx.invertedIndex['Kendrick Lamar']
当文档字段是一个数组时,lunr 假定数组的元素已经被拆分为标记以供索引。因此,不是将 "Kendrick" 和 "Lamar" 作为单独的标记添加到索引中,而是将 "Kendrick Lamar" 作为单个标记添加。
这会在尝试搜索时导致问题,因为搜索 "Kendrick Lamar" 实际上是在搜索 "Kendrick" 或 "Lamar",因为搜索字符串在空格上被拆分以获得标记。 "Kendrick" 和 "Lamar" 都不在索引中,因此没有结果。
要获得您希望的结果,您可以将数组转换为字符串并让 lunr 处理将其拆分为标记:
this.add({
'hhArtists': data[key]['hh-artists'].join(' ')
})
Lunr 在查找大多数结果方面做得很好,但我不明白为什么它不会 return 包含在 JSON 数组中的多词字符串。
这里有一个示例 JSON 文件,用于了解我的数据的结构:
[{
"title": "Rolling Loud",
"date": "May 5–7",
"location": "Miami, FL, USA",
"rock-artists": [],
"hh-artists": ["Kendrick Lamar", "Future"],
"electronic-artists": [],
"other-artists": []
}]
当我搜索 "Miami" 和 "Future" 时,lunr return 是节日。但是,当搜索 "Kendrick" 或 "Kendrick Lamar" 时,lunr 不会 return 节日。
相关代码:
// initialize lunr
var idx = lunr(function () {
this.field('id');
this.field('title', { boost: 3 });
this.field('date');
this.field('location');
this.field('rockArtists', { boost: 3 });
this.field('hhArtists', { boost: 3 });
this.field('electronicArtists', { boost: 3 });
this.field('otherArtists', { boost: 3 });
// add festivals to lunr
for (var key in data) {
this.add({
'id': key,
'title': data[key].title,
'date': data[key].date,
'location': data[key].location,
'rockArtists': data[key]['rock-artists'],
'hhArtists': data[key]['hh-artists'],
'electronicArtists': data[key]['electronic-artists'],
'otherArtists': data[key]['other-artists']
});
}
});
谢谢!
Lunr 是索引hh-artists
字段,您应该能够通过查找索引中的值之一来确认这一点:
idx.invertedIndex['Kendrick Lamar']
当文档字段是一个数组时,lunr 假定数组的元素已经被拆分为标记以供索引。因此,不是将 "Kendrick" 和 "Lamar" 作为单独的标记添加到索引中,而是将 "Kendrick Lamar" 作为单个标记添加。
这会在尝试搜索时导致问题,因为搜索 "Kendrick Lamar" 实际上是在搜索 "Kendrick" 或 "Lamar",因为搜索字符串在空格上被拆分以获得标记。 "Kendrick" 和 "Lamar" 都不在索引中,因此没有结果。
要获得您希望的结果,您可以将数组转换为字符串并让 lunr 处理将其拆分为标记:
this.add({
'hhArtists': data[key]['hh-artists'].join(' ')
})