Summary
I'll be demonstrating various Redis Search operations with the ioredis (Nodejs) client lib in this post.
Data Set Creation
A random set of objects are created and are then saved in Redis as hash sets.
const pipeline = client.pipeline();
for (let i=0; i < NUM; i++) {
const colors = (COLORS.sort(() => .5 - Math.random())).slice(0, Math.floor(Math.random() * COLORS.length))
const fields = {
'textField': `text${Math.floor(Math.random() * NUM)}`,
'numericField': Math.floor(Math.random() * NUM),
'tagField': colors
};
await pipeline.hmset(`item:${i}`, fields);
}
await pipeline.exec();
Index Creation
await client.call('FT.CREATE', 'idx', 'ON', 'HASH', 'PREFIX', '1', 'item:', 'SCHEMA',
'textField', 'TEXT', 'SORTABLE',
'numericField', 'NUMERIC', 'SORTABLE',
'tagField', 'TAG'
);
Search Operations
//Search for exact match in a Text field
let result = await client.call('FT.SEARCH', 'idx', '@textField:text1');
//Search for a range in a Numeric field
result = await client.call('FT.SEARCH', 'idx', '@numericField:[1,3]');
//Search for a match in a Tag Field
result = await client.call('FT.SEARCH', 'idx', '@tagField:{blue}');
Aggregation Operations
//Aggregate on a text field across all hashes in the index
let result = await client.call('FT.AGGREGATE', 'idx', '*', 'GROUPBY', '1', '@textField',
'REDUCE', 'COUNT', '0', 'AS', 'CNT');
//Search on a numeric range and then apply the SQRT function to a numeric field in the matches
const upper = Math.floor(Math.random() * NUM) + 1;
result = await client.call('FT.AGGREGATE', 'idx', `@numericField:[0,${upper}]`,
'APPLY', 'SQRT(@numericField)', 'AS', 'SQRT');
//Search for logical OR of two tag values and use a CURSOR. Limit return
//to 2 values to illustrate looping on a cursor.
result = await client.call('FT.AGGREGATE', 'idx', '@tagField:{ yellow | red }',
'LOAD', '3', '@textField', '@numericField', '@tagField',
'WITHCURSOR', 'COUNT', '2'
);
console.log('FT.AGGREGATE idx @tagField:{ yellow | red } LOAD 3 @textField @numericField @tagField WITHCURSOR COUNT 2');
let items = result[0];
let cursor = result[1];
while (true) {
for (let item of items) {
if (Array.isArray(item)) {
console.log(JSON.stringify(item))
}
}
if (cursor) {
result = await client.call('FT.CURSOR', 'READ', 'idx', cursor, 'COUNT', '2');
items = result[0];
cursor = result[1];
}
else {
break;
}
}
Index Alteration
await client.call('FT.ALTER', 'idx', 'SCHEMA', 'ADD', 'newField', 'TEXT', 'SORTABLE');
let result = await client.call('FT.INFO', 'idx');
Source
Copyright ©1993-2024 Joey E Whelan, All rights reserved.