bab*_*unk 3 python whoosh search-suggestion
我在 Whoosh 索引中有一组文档,我想提供搜索词建议功能。因此,如果您键入“pop”,可能会出现一些建议:
我有一些应该作为建议出现在我的索引中的 NGRAMWORDS 字段的术语,但是当我对该字段进行查询时,我得到的是自动完成的结果而不是扩展的建议 - 所以我得到的文档标记为“流行文化” ",但无法向用户显示该术语。(为了比较,我会在 ElasticSearch 中使用该字段上的完成映射执行此操作,然后使用 _suggest 端点获取建议。)
我只能在文档或网络上的其他地方找到自动完成或拼写更正的示例。有什么方法可以让我从 Whoosh 的索引中获得搜索词建议?
编辑:
expand_prefix是一个非常需要的指向正确方向的指针。我最终KEYWORD(commas=True, lowercase=True)为我的建议字段使用了 a ,并且像这样的代码以最常见的优先顺序获得建议(expand_prefix并将iter_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)
Run Code Online (Sandbox Code Playgroud)
我想补充一下这里的答案,whoosh 中实际上有一个内置函数,它按词频返回最高的“数字”术语。它在whoosh 文档中。
whoosh.reading.IndexReader.most_frequent_terms(fieldname, number=5, prefix='')
Run Code Online (Sandbox Code Playgroud)
此外,在文档的同一页面上,在whoosh 文档中前一个函数的正上方是一个函数,该函数返回最独特的术语而不是最常见的术语。它使用tf-idf分数,该分数可有效消除诸如“the”之类的常见但无关紧要的词。这可能或多或少有用,具体取决于您要查找的内容。它被恰当地命名为:
whoosh.reading.IndexReader.most_distinctive_terms(fieldname, number=5, prefix='')
Run Code Online (Sandbox Code Playgroud)
这些中的每一个都将以这种方式使用:
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')
Run Code Online (Sandbox Code Playgroud)
同样,我也遇到了多词建议的问题。我的解决方案是通过以下方式创建架构:
fields.Schema(suggestions = fields.TEXT(),
suggestion_phrases = fields.KEYWORD(commas=True, lowercase=True)
Run Code Online (Sandbox Code Playgroud)
在suggestion_phrases字段中,commas=True允许关键字以空格存储,因此有多个单词,并lowercase=True忽略大写(如果需要区分大写和非大写的术语,可以将其删除)。然后,为了获得单字和多字建议,您可以运行其中一个most_frequent_terms()或most_distinctive_terms()两个字段。然后合并结果。