首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从搜索索引中获取单词列表,按最常见的情况排序

从搜索索引中获取单词列表,按最常见的情况排序
EN

Stack Overflow用户
提问于 2019-09-21 14:56:04
回答 1查看 476关注 0票数 1

我有一个简单的搜索索引,我用Python创建了一个索引:

代码语言:javascript
运行
复制
>>> from redisearch import Client, TextField
>>> c = Client('common_words')
>>> c.create_index((TextField('body'),))
b'OK'
>>> c.add_document('ibiza', body='kevin paul dad')
b'OK'
>>> c.add_document('england', body='kevin dad')
b'OK'
>>> c.add_document('bank', body='kevin robber')
b'OK'

然后,我可以搜索一个特定的单词,它非常有用:

代码语言:javascript
运行
复制
>>> c.search('kevin')
Result{3 total, docs:
   [Document {'id': 'bank', 'payload': None, 'body': 'kevin robber'},
    Document {'id': 'england', 'payload': None, 'body': 'kevin dad'},
    Document {'id': 'ibiza', 'payload': None, 'body': 'kevin paul dad'}
   ]}

有没有一种快速的方法可以在出现的情况下列出一个单词列表?我的目标是得到这样的结果:

代码语言:javascript
运行
复制
{ Result{4 total, counts:
   [ Word { 'word': 'kevin', 'count': 3},
     Word { 'word': 'dad', 'count': 2 },
     Word { 'word': 'paul', 'count': 1 },
     Word { 'word': 'robber', 'count': 1 } ] }

我看过这个例子关于如何使用nltkzincrby来进行单词计数,但不知道是否已经有了从redisearch获得这一信息的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-22 07:42:33

目前唯一可以这样做的方法是使用聚合(https://oss.redislabs.com/redisearch/Aggregations.html)。您可以询问所有结果,然后加载您感兴趣的字段,将句子拆分为“”,并计算每个短语出现的次数。查询将如下所示:

代码语言:javascript
运行
复制
127.0.0.1:6379> FT.AGGREGATE idx * LOAD 1 @test APPLY "split(@test, ' ')" as s 
GROUPBY 1 @s REDUCE count 0 as count
1) (integer) 4
2) 1) s
   2) "paul"
   3) count
   4) "1"
3) 1) s
   2) "kevin"
   3) count
   4) "3"
4) 1) s
   2) "dad"
   3) count
   4) "2"
5) 1) s
   2) "robber"
   3) count
   4) "1"

注意:聚合的目的是聚合结果集。有一些配置变量限制了结果集的大小。一旦达到此限制,搜索查询将不会返回所有结果,聚合阶段也不会处理所有结果。可以配置其中的一些变量来增加这些限制(例如MAXEXPANSIONS ),但是如果您打算处理数百万个结果,您最终将达到这些限制(而且您的查询将需要很长时间才能完成)。正确的方法是使用比'*‘更具体的查询来减少结果集,然后使用聚合对较小的结果集进行额外的计算。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58041427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档