Как получить идентификаторы документов из FT.AGGREGATE с помощью Redisearch?
Я хотел бы объединить документы и вернуть только идентификаторы документов.
Как это сделать?
2 ответа
Решение
С агрегатом вы можете иногда возвращать результаты, которые не имеют ничего общего с идентификатором документа (например, если вы группируете по некоторому полю, а затем возвращаете размеры групп). Вот почему совокупный результат не содержит идентификатор документа. Если ваша конкретная агрегация сохраняет идентификатор документа, то можно поместить его в сам документ как неиндексированное поле и затем вернуть его.
Например:
127.0.0.1:6379> FT.CREATE idx SCHEMA name TEXT SORTABLE docid TAG SORTABLE NOINDEX
OK
127.0.0.1:6379> FT.ADD idx doc1 1.0 FIELDS name name1 docid doc1
OK
127.0.0.1:6379> FT.ADD idx doc2 1.0 FIELDS name name2 docid doc2
OK
127.0.0.1:6379> FT.ADD idx doc3 1.0 FIELDS name name1 docid doc3
OK
127.0.0.1:6379> FT.AGGREGATE idx * GROUPBY 1 @name REDUCE TOLIST 1 @docid as docids
1) (integer) 2
2) 1) name
2) "name2"
3) docids
4) 1) "doc2"
3) 1) name
2) "name1"
3) docids
4) 1) "doc1"
2) "doc3"
В последних версиях RediSearch выражение
LOAD {nargs} {property}
позволяет загружать идентификатор документа с помощью
@__key
, на который можно ссылаться на более поздних этапах агрегатного конвейера:
FT.AGGREGATE idx * LOAD 1 @__key GROUPBY 1 @type REDUCE TOLIST 1 @__key as keys