1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
# EXAMPLE: py_home_json
"""
JSON examples from redis-py "home" page"
https://redis.io/docs/latest/develop/connect/clients/python/redis-py/#example-indexing-and-querying-json-documents
"""
# STEP_START import
import redis
from redis.commands.json.path import Path
import redis.commands.search.aggregation as aggregations
import redis.commands.search.reducers as reducers
from redis.commands.search.field import TextField, NumericField, TagField
from redis.commands.search.index_definition import IndexDefinition, IndexType
from redis.commands.search.query import Query
import redis.exceptions
# STEP_END
# STEP_START connect
r = redis.Redis(decode_responses=True)
# STEP_END
# REMOVE_START
try:
r.ft("idx:users").dropindex(True)
except redis.exceptions.ResponseError:
pass
try:
r.ft("hash-idx:users").dropindex(True)
except redis.exceptions.ResponseError:
pass
r.delete("user:1", "user:2", "user:3", "huser:1", "huser:2", "huser:3")
# REMOVE_END
# STEP_START create_data
user1 = {
"name": "Paul John",
"email": "paul.john@example.com",
"age": 42,
"city": "London"
}
user2 = {
"name": "Eden Zamir",
"email": "eden.zamir@example.com",
"age": 29,
"city": "Tel Aviv"
}
user3 = {
"name": "Paul Zamir",
"email": "paul.zamir@example.com",
"age": 35,
"city": "Tel Aviv"
}
# STEP_END
# STEP_START make_index
schema = (
TextField("$.name", as_name="name"),
TagField("$.city", as_name="city"),
NumericField("$.age", as_name="age")
)
indexCreated = r.ft("idx:users").create_index(
schema,
definition=IndexDefinition(
prefix=["user:"], index_type=IndexType.JSON
)
)
# STEP_END
# Tests for 'make_index' step.
# REMOVE_START
assert indexCreated
# REMOVE_END
# STEP_START add_data
user1Set = r.json().set("user:1", Path.root_path(), user1)
user2Set = r.json().set("user:2", Path.root_path(), user2)
user3Set = r.json().set("user:3", Path.root_path(), user3)
# STEP_END
# Tests for 'add_data' step.
# REMOVE_START
assert user1Set
assert user2Set
assert user3Set
# REMOVE_END
# STEP_START query1
findPaulResult = r.ft("idx:users").search(
Query("Paul @age:[30 40]")
)
print(findPaulResult)
# >>> Result{1 total, docs: [Document {'id': 'user:3', ...
# STEP_END
# Tests for 'query1' step.
# REMOVE_START
assert str(findPaulResult) == (
"Result{1 total, docs: [Document {'id': 'user:3', 'payload': None, "
+ "'json': '{\"name\":\"Paul Zamir\",\"email\":"
+ "\"paul.zamir@example.com\",\"age\":35,\"city\":\"Tel Aviv\"}'}]}"
)
# REMOVE_END
# STEP_START query2
citiesResult = r.ft("idx:users").search(
Query("Paul").return_field("$.city", as_field="city")
).docs
print(citiesResult)
# >>> [Document {'id': 'user:1', 'payload': None, ...
# STEP_END
# Tests for 'query2' step.
# REMOVE_START
citiesResult.sort(key=lambda doc: doc['id'])
assert str(citiesResult) == (
"[Document {'id': 'user:1', 'payload': None, 'city': 'London'}, "
+ "Document {'id': 'user:3', 'payload': None, 'city': 'Tel Aviv'}]"
)
# REMOVE_END
# STEP_START query3
req = aggregations.AggregateRequest("*").group_by(
'@city', reducers.count().alias('count')
)
aggResult = r.ft("idx:users").aggregate(req).rows
print(aggResult)
# >>> [['city', 'London', 'count', '1'], ['city', 'Tel Aviv', 'count', '2']]
# STEP_END
# Tests for 'query3' step.
# REMOVE_START
aggResult.sort(key=lambda row: row[1])
assert str(aggResult) == (
"[['city', 'London', 'count', '1'], ['city', 'Tel Aviv', 'count', '2']]"
)
# REMOVE_END
# STEP_START make_hash_index
hashSchema = (
TextField("name"),
TagField("city"),
NumericField("age")
)
hashIndexCreated = r.ft("hash-idx:users").create_index(
hashSchema,
definition=IndexDefinition(
prefix=["huser:"], index_type=IndexType.HASH
)
)
# STEP_END
# REMOVE_START
assert hashIndexCreated
# REMOVE_END
# STEP_START add_hash_data
huser1Set = r.hset("huser:1", mapping=user1)
huser2Set = r.hset("huser:2", mapping=user2)
huser3Set = r.hset("huser:3", mapping=user3)
# STEP_END
# REMOVE_START
assert huser1Set
assert huser2Set
assert huser3Set
# REMOVE_END
# STEP_START query1_hash
findPaulHashResult = r.ft("hash-idx:users").search(
Query("Paul @age:[30 40]")
)
print(findPaulHashResult)
# >>> Result{1 total, docs: [Document {'id': 'huser:3',
# >>> 'payload': None, 'name': 'Paul Zamir', ...
# STEP_END
# REMOVE_START
assert str(findPaulHashResult) == (
"Result{1 total, docs: [Document " +
"{'id': 'huser:3', 'payload': None, 'name': 'Paul Zamir', " +
"'email': 'paul.zamir@example.com', 'age': '35', 'city': 'Tel Aviv'}]}"
)
# REMOVE_END
r.close()
|