Получить список слов из индекса Redisearch, отсортированный по наиболее частым вхождениям - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть простой индекс повторного поиска, который я создаю в 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 } ] }

Я смотрел на этот пример того, как подсчитать количество слов, используя nltk и zincrby, но подумал:уже был способ получить это изначально от redisearch.

1 Ответ

0 голосов
/ 22 сентября 2019

Единственный способ сделать это в настоящее время - использовать агрегацию (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"

Обратите внимание на следующее: цель агрегации - агрегировать набор результатов. Существуют переменные конфигурации, которые ограничивают размер набора результатов. Как только вы достигнетеИз-за этого ограничения поисковый запрос не будет возвращать все результаты, а этап агрегации не будет обрабатывать все результаты. Можно настроить некоторые из этих переменных для увеличения этих ограничений (например, MAXEXPANSIONS), но если вы намеревались обработать миллионырезультатов, вы в конечном итоге достигнете этих пределов (а также ваш запрос займет много времени.) Правильный путь, чтобы перейти к нему, чтобы уменьшить набор результатов, используя более конкретный запрос, чем '*', и после использования агрегации для выполнениядополнительный расчет на меньшем наборе результатов.

...