【问题标题】:lunr: Return the stem of the searched terms so I can highlight it within resultslunr:返回搜索词的词干,以便我可以在结果中突出显示它
【发布时间】:2015-02-17 04:47:46
【问题描述】:
我正在使用 lunr 执行搜索,目前我正在从搜索文本区域的值中突出显示搜索,但 lunr 使用词干分析器并返回与完整搜索词不完全匹配的结果。有没有办法访问 lunr 最终搜索的搜索词的词干?
// query our lunr index
searchResults = _.map(index.search($('#searchInput').val()), function (res) {
var uid = res.ref;
return mediaList[uid];
});
【问题讨论】:
标签:
javascript
search
porter-stemmer
lunrjs
【解决方案1】:
lunr 使用的默认词干分析器在lunr.stemmer 处作为函数提供
你可以用你想要的任何标记自己调用它,例如
lunr.stemmer("stemming") //= "stem"
但是我认为这不会帮助您实现您想要的,因为您正在搜索的文档中的标记也已被提取,并且这种提取是单向操作。例如,您将不知道在上面的示例中还有哪些其他词也会被词干为“词干”,因此可能会错过一些要突出显示的词。
解决方法可能是保留您自己的反向词干查找,以便稍后您可以更轻松地匹配输出中的结果搜索词。这可以通过在索引中插入自定义管道函数来实现:
// going to store a hash of stemmed word to list of original words
var reverseStem = {}
var reverseStemIndexBuilder = function (token) {
var stemmed = lunr.stemmer(token)
if (stemmed in reverseStem) {
reverseStem[stemmed].push(token)
} else {
reverseStem[stemmed] = [token]
}
return stemmed
}
// idx is your instance of a lunr index
// we can remove the existing stemmer since reverseStemIndexBuilder already returns a stemmed token
idx.pipeline.remove(lunr.stemmer)
idx.pipeline.add(reverseStemIndexBuilder)
您现在可以查找词干可能来自的所有标记,然后在结果中找到它们并相应地突出显示它们。