【问题标题】: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)
    

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

    【讨论】:

      猜你喜欢
      • 2015-01-28
      • 2019-03-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 2017-01-23
      相关资源
      最近更新 更多