我正在使用以下测试代码来试验使用 RedisJSON 数据的 RediSearch。我希望client.ft(candles_index).search("4h")
返回candles
列表中的 JSON 数据,但没有返回任何结果。
我一直在使用redis-py中的一些单元测试作为我的一些代码的参考,并且我还包含了运行时输出,以显示我一直用来尝试的一些输出看看我可能哪里出错了。
.
我已经尝试对,和之间的架构中的根引用进行各种调整..
,看看它是否可能是根匹配问题,但似乎不是。$.
$..
回答
我想我一定是$..
在我的早期测试中错误地测试了路径模式的变化。那是让这个为我工作的秘诀。更新了代码和结果,以及我在这里找到的另一个变体
import json
import redis
from redis.commands.json.path import Path
from redis.commands.search.indexDefinition import IndexDefinition, IndexType
from redis.commands.search.field import TextField
roots = ('candles', 'symbols')
symbols = [
{
"name": "DOGEUSDT",
"id": 19948
}
]
candles = [
{
"stream_name": "dogeusdt@kline_4h",
"symbol_name": "DOGEUSDT",
"symbol_id": 19948,
"timeframe_name": "4h",
"timeframe_id": 1914,
"open_time": 1639699200000,
"open": 1.1,
"high": 1.2,
"low": 1.3,
"close": 1.4,
"close_time": 1639713599999,
"candle_id": 1
}
]
client = redis.Redis()
client.flushall()
candles_index = 'candles'
symbols_index = 'symbols'
index_names = [candles_index, symbols_index]
candle_index_definition = IndexDefinition(index_type=IndexType.JSON, prefix=[candles_index])
candle_index_schema = (
TextField('$..stream_name', as_name='stream_name'),
TextField('$..symbol_name', as_name='symbol_name'),
TextField('$..timeframe_name', as_name='timeframe_name'),
)
for index in index_names:
try:
client.ft(index).info()
except Exception as e:
pass
else:
print(f'{index} {client.ft(index).info()}')
print('dropping index')
try:
client.ft(index).dropindex()
except Exception as e:
pass
client.ft(candles_index).create_index(candle_index_schema, definition=candle_index_definition)
for root in roots:
client.json().set(root, Path.rootPath(), [])
for candle in candles:
client.json().arrappend('candles', Path.rootPath(), candle)
print(f"client.json().get('candles'):\n{json.dumps(client.json().get('candles'),indent=2)}")
print(f'')
print(f'client.ft(candles_index).info():\n{client.ft(candles_index).info()}')
print(f'')
print(f'client.ft(candles_index).search("*"):\n{client.ft(candles_index).search("*")}')
print(f'')
print(f'client.ft(candles_index).search("4h"):\n{client.ft(candles_index).search("4h")}')
print(f'')
print(f'client.ft(candles_index).search("@timeframe_name:(4h)"):\n{client.ft(candles_index).search("@timeframe_name:(4h)")}')
# python3 test.py
client.json().get('candles'):
[
{
"stream_name": "dogeusdt@kline_4h",
"symbol_name": "DOGEUSDT",
"symbol_id": 19948,
"timeframe_name": "4h",
"timeframe_id": 1914,
"open_time": 1639699200000,
"open": 1.1,
"high": 1.2,
"low": 1.3,
"close": 1.4,
"close_time": 1639713599999,
"candle_id": 1
}
]
client.ft(candles_index).info():
{'index_name': 'candles', 'index_options': [], 'index_definition': [b'key_type', b'JSON', b'prefixes', [b'candles'], b'default_score', b'1'], 'attributes': [[b'identifier', b'$..stream_name', b'attribute', b'stream_name', b'type', b'TEXT', b'WEIGHT', b'1'], [b'identifier', b'$..symbol_name', b'attribute', b'symbol_name', b'type', b'TEXT', b'WEIGHT', b'1'], [b'identifier', b'$..timeframe_name', b'attribute', b'timeframe_name', b'type', b'TEXT', b'WEIGHT', b'1']], 'num_docs': '1', 'max_doc_id': '2', 'num_terms': '3', 'num_records': '3', 'inverted_sz_mb': '1.811981201171875e-05', 'total_inverted_index_blocks': '3', 'offset_vectors_sz_mb': '3.814697265625e-06', 'doc_table_size_mb': '8.487701416015625e-05', 'sortable_values_size_mb': '0', 'key_table_size_mb': '2.765655517578125e-05', 'records_per_doc_avg': '3', 'bytes_per_record_avg': '6.3333334922790527', 'offsets_per_term_avg': '1.3333333730697632', 'offset_bits_per_record_avg': '8', 'hash_indexing_failures': '0', 'indexing': '0', 'percent_indexed': '1', 'gc_stats': [b'bytes_collected', b'0', b'total_ms_run', b'0', b'total_cycles', b'0', b'average_cycle_time_ms', b'-nan', b'last_run_time_ms', b'0', b'gc_numeric_trees_missed', b'0', b'gc_blocks_denied', b'0'], 'cursor_stats': [b'global_idle', 0, b'global_total', 0, b'index_capacity', 128, b'index_total', 0]}
client.ft(candles_index).search("*"):
Result{1 total, docs: [Document {'id': 'candles', 'payload': None, 'json': '[{"stream_name":"dogeusdt@kline_4h","symbol_name":"DOGEUSDT","symbol_id":19948,"timeframe_name":"4h","timeframe_id":1914,"open_time":1639699200000,"open":1.1,"high":1.2,"low":1.3,"close":1.4,"close_time":1639713599999,"candle_id":1}]'}]}
client.ft(candles_index).search("4h"):
Result{1 total, docs: [Document {'id': 'candles', 'payload': None, 'json': '[{"stream_name":"dogeusdt@kline_4h","symbol_name":"DOGEUSDT","symbol_id":19948,"timeframe_name":"4h","timeframe_id":1914,"open_time":1639699200000,"open":1.1,"high":1.2,"low":1.3,"close":1.4,"close_time":1639713599999,"candle_id":1}]'}]}
client.ft(candles_index).search("@timeframe_name:(4h)"):
Result{1 total, docs: [Document {'id': 'candles', 'payload': None, 'json': '[{"stream_name":"dogeusdt@kline_4h","symbol_name":"DOGEUSDT","symbol_id":19948,"timeframe_name":"4h","timeframe_id":1914,"open_time":1639699200000,"open":1.1,"high":1.2,"low":1.3,"close":1.4,"close_time":1639713599999,"candle_id":1}]'}]}