从 Redisearch 索引中获取单词列表,按最常见的出现排序
Get list of words from Redisearch index, sorted by most common occurrence
我在 Python 中创建了一个简单的重新搜索索引:
>>> 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'
然后我可以搜索特定的词,效果很好:
>>> 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'}
]}
有没有一种快速提取单词列表的方法?我的目标是这样的结果:
{ Result{4 total, counts:
[ Word { 'word': 'kevin', 'count': 3},
Word { 'word': 'dad', 'count': 2 },
Word { 'word': 'paul', 'count': 1 },
Word { 'word': 'robber', 'count': 1 } ] }
我看过 this example 如何使用 nltk
和 zincrby
进行字数统计,但想知道是否已经有办法从 redisearch
.
目前唯一可以做到这一点的方法是使用聚合 (https://oss.redislabs.com/redisearch/Aggregations.html)。你可以询问所有的结果,然后加载你感兴趣的字段,用','分割句子并计算每个短语出现的次数。查询将如下所示:
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"
注意以下几点:聚合的目的是聚合结果集。存在限制结果集大小的配置变量。一旦达到此限制,搜索查询将不会 return 所有结果,聚合阶段也不会处理所有结果。可以配置其中一些变量来增加这些限制(例如 MAXEXPANSIONS),但如果您打算处理数百万个结果,您最终将达到这些限制(并且您的查询将需要很长时间才能完成)。
正确的方法是使用比“*”更具体的查询来减少结果集,然后使用聚合对较小的结果集进行额外计算。
我在 Python 中创建了一个简单的重新搜索索引:
>>> 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'
然后我可以搜索特定的词,效果很好:
>>> 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'}
]}
有没有一种快速提取单词列表的方法?我的目标是这样的结果:
{ Result{4 total, counts:
[ Word { 'word': 'kevin', 'count': 3},
Word { 'word': 'dad', 'count': 2 },
Word { 'word': 'paul', 'count': 1 },
Word { 'word': 'robber', 'count': 1 } ] }
我看过 this example 如何使用 nltk
和 zincrby
进行字数统计,但想知道是否已经有办法从 redisearch
.
目前唯一可以做到这一点的方法是使用聚合 (https://oss.redislabs.com/redisearch/Aggregations.html)。你可以询问所有的结果,然后加载你感兴趣的字段,用','分割句子并计算每个短语出现的次数。查询将如下所示:
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"
注意以下几点:聚合的目的是聚合结果集。存在限制结果集大小的配置变量。一旦达到此限制,搜索查询将不会 return 所有结果,聚合阶段也不会处理所有结果。可以配置其中一些变量来增加这些限制(例如 MAXEXPANSIONS),但如果您打算处理数百万个结果,您最终将达到这些限制(并且您的查询将需要很长时间才能完成)。 正确的方法是使用比“*”更具体的查询来减少结果集,然后使用聚合对较小的结果集进行额外计算。