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.