python - 使用 Whoosh 生成搜索词建议?

标签 python whoosh search-suggestion

我在 Whoosh 索引中有一组文档,我想提供搜索词建议功能。因此,如果您键入“pop”,可能会出现一些建议:

  • 爆米花
  • 受欢迎
  • 教皇
  • 杨树胶片
  • 流行文化

我已经得到了应该作为建议进入我的索引中的 NGRAMWORDS 字段的术语,但是当我对该字段进行查询时,我得到的是自动完成的结果而不是扩展的建议 - 所以我得到的文档被标记为“流行文化”,但无法向用户展示该术语。 (为了比较,我会在 ElasticSearch 中使用该字段上的完成映射来执行此操作,然后使用 _suggest 端点来获取建议。)

我只能在文档或网络上的其他地方找到自动完成或拼写更正的示例。有什么方法可以让我使用 Whoosh 从我的索引中获取搜索词建议?

编辑: expand_prefix 是指向正确方向的急需指针。我最终在我的建议字段中使用了 KEYWORD(commas=True, lowercase=True),并使用这样的代码以最常见的优先顺序获得建议 (expand_prefixiter_prefix 将按字母顺序产生它们):

def get_suggestions(term):
    with ix.reader() as r:
        suggestions = [(s[0], s[1].doc_frequency()) for s in r.iter_prefix('suggest', term)]
    return sorted(suggestions, key=itemgetter(1), reverse=True)

最佳答案

词频函数

我想补充一下这里的答案,whoosh 中实际上有一个内置函数,它按词频返回排名靠前的“数字”词。它在 whoosh docs 中.

whoosh.reading.IndexReader.most_frequent_terms(fieldname, number=5, prefix='')

tf-idf 与频率

此外,在文档的同一页上,就在 whoosh docs 中上一个函数的正上方是一个函数,它返回最独特 的术语而不是最频繁的术语。它使用 tf-idf分数,它可以有效地消除常见但无关紧要的词,如“the”。这可能或多或少有用,具体取决于您要查找的内容。它被恰本地命名为:

whoosh.reading.IndexReader.most_distinctive_terms(fieldname, number=5, prefix='')

这些中的每一个都将以这种方式使用:

with ix.reader() as r:
    print r.most_frequent_terms('suggestions', number=5, prefix='pop')
    print r.most_distinctive_terms('suggestions', number=5, prefix='pop')

多词建议

同样,我在多词建议方面遇到了问题。我的解决方案是按以下方式创建架构:

fields.Schema(suggestions = fields.TEXT(),
              suggestion_phrases = fields.KEYWORD(commas=True, lowercase=True)

suggestion_phrases字段中,commas=True允许关键字用空格存储,因此有多个单词,lowercase=True忽略大写(如果需要区分大写和非大写术语,可以将其删除)。然后,为了获得单个和多个单词的建议,您可以在两个字段上运行 most_frequent_terms()most_distinctive_terms()。然后合并结果。

关于python - 使用 Whoosh 生成搜索词建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28108355/

相关文章:

python - Haystack Whoosh 没有索引所有内容

python - 搜索大型排序文本文件的最快、最有效的方法

java - 字符串中的搜索建议

python - 从文本到字典,更新键值

python - Python 的 numpy 中的 "zip()"相当于什么?

django - Rebuild_index 和 update_index 被杀死

Android:如何获取搜索建议

Solr查询建议

python给计算结果添加负号

python - 是否可以将 Pygame 作为 cronjob 运行?