0

我正在使用 lunr 执行搜索,目前我正在从搜索文本区域的值中突出显示搜索,但 lunr 使用词干分析器并返回与完整搜索词不完全匹配的结果。有没有办法访问 lunr 最终搜索的搜索词的词干?

// query our lunr index
searchResults = _.map(index.search($('#searchInput').val()), function (res) {
    var uid = res.ref;
    return mediaList[uid];
});
4

1 回答 1

2

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)

您现在可以查找词干可能来自的所有标记,然后在结果中找到它们并相应地突出显示它们。

于 2015-02-16T20:47:46.123 回答