doctests/geo_index.py (103 lines of code) (raw):

# EXAMPLE: geoindex import redis from redis.commands.json.path import Path from redis.commands.search.field import TextField, GeoField, GeoShapeField from redis.commands.search.indexDefinition import IndexDefinition, IndexType from redis.commands.search.query import Query r = redis.Redis() # REMOVE_START try: r.ft("productidx").dropindex(True) except redis.exceptions.ResponseError: pass try: r.ft("geomidx").dropindex(True) except redis.exceptions.ResponseError: pass r.delete("product:46885", "product:46886", "shape:1", "shape:2", "shape:3", "shape:4") # REMOVE_END # STEP_START create_geo_idx geo_schema = ( GeoField("$.location", as_name="location") ) geo_index_create_result = r.ft("productidx").create_index( geo_schema, definition=IndexDefinition( prefix=["product:"], index_type=IndexType.JSON ) ) print(geo_index_create_result) # >>> True # STEP_END # REMOVE_START assert geo_index_create_result # REMOVE_END # STEP_START add_geo_json prd46885 = { "description": "Navy Blue Slippers", "price": 45.99, "city": "Denver", "location": "-104.991531, 39.742043" } json_add_result_1 = r.json().set("product:46885", Path.root_path(), prd46885) print(json_add_result_1) # >>> True prd46886 = { "description": "Bright Green Socks", "price": 25.50, "city": "Fort Collins", "location": "-105.0618814,40.5150098" } json_add_result_2 = r.json().set("product:46886", Path.root_path(), prd46886) print(json_add_result_2) # >>> True # STEP_END # REMOVE_START assert json_add_result_1 assert json_add_result_2 # REMOVE_END # STEP_START geo_query geo_result = r.ft("productidx").search( "@location:[-104.800644 38.846127 100 mi]" ) print(geo_result) # >>> Result{1 total, docs: [Document {'id': 'product:46885'... # STEP_END # REMOVE_START assert len(geo_result.docs) == 1 assert geo_result.docs[0]["id"] == "product:46885" # REMOVE_END # STEP_START create_gshape_idx geom_schema = ( TextField("$.name", as_name="name"), GeoShapeField( "$.geom", as_name="geom", coord_system=GeoShapeField.FLAT ) ) geom_index_create_result = r.ft("geomidx").create_index( geom_schema, definition=IndexDefinition( prefix=["shape:"], index_type=IndexType.JSON ) ) print(geom_index_create_result) # True # STEP_END # REMOVE_START assert geom_index_create_result # REMOVE_END # STEP_START add_gshape_json shape1 = { "name": "Green Square", "geom": "POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))" } gm_json_res_1 = r.json().set("shape:1", Path.root_path(), shape1) print(gm_json_res_1) # >>> True shape2 = { "name": "Red Rectangle", "geom": "POLYGON ((2 2.5, 2 3.5, 3.5 3.5, 3.5 2.5, 2 2.5))" } gm_json_res_2 = r.json().set("shape:2", Path.root_path(), shape2) print(gm_json_res_2) # >>> True shape3 = { "name": "Blue Triangle", "geom": "POLYGON ((3.5 1, 3.75 2, 4 1, 3.5 1))" } gm_json_res_3 = r.json().set("shape:3", Path.root_path(), shape3) print(gm_json_res_3) # >>> True shape4 = { "name": "Purple Point", "geom": "POINT (2 2)" } gm_json_res_4 = r.json().set("shape:4", Path.root_path(), shape4) print(gm_json_res_4) # >>> True # STEP_END # REMOVE_START assert gm_json_res_1 assert gm_json_res_2 assert gm_json_res_3 assert gm_json_res_4 # REMOVE_END # STEP_START gshape_query geom_result = r.ft("geomidx").search( Query( "(-@name:(Green Square) @geom:[WITHIN $qshape])" ).dialect(4).paging(0, 1), query_params={ "qshape": "POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))" } ) print(geom_result) # >>> Result{1 total, docs: [Document {'id': 'shape:4'... # STEP_END # REMOVE_START assert len(geom_result.docs) == 1 assert geom_result.docs[0]["id"] == "shape:4" # REMOVE_END