2

我正在使用以下测试代码来试验使用 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}]'}]}
4

1 回答 1

0

我的测试存在缺陷,并且我没有正确测试我提供给工作解决方案的参考,即:

candle_index_schema = (
    TextField('$..stream_name', as_name='stream_name'),
    TextField('$..symbol_name', as_name='symbol_name'),
    TextField('$..timeframe_name', as_name='timeframe_name'),
    )

用答案和示例更新了原始问题。

于 2021-12-18T12:19:48.960 回答