I recently wrote an article about using RediSearch as the main database on What is RediSearch? Estacks is using RediSearch as a database!. Along with that, I explained why I chose RediSearch for the full-text search feature in RediSearch, making the search functionality of my blog more powerful and useful for readers.
Everything is working great so far, but there's one problem - Redis does not have a JSON data type, and I want to work with JSON data in the most user-friendly way possible. During my research, I discovered that Redis provides a module called RedisJSON that allows me to do just that. If you are using Redis or RediSearch and want to work with JSON data, this is a fantastic solution.
RedisJSON is a module that provides JSON support for Redis. RedisJSON allows you to store, update, and retrieve JSON values in the Redis database just like any other Redis data type. RedisJSON also works with RediSearch, allowing you to index and query JSON documents.
127.0.0.1:6379> JSON.SET obj $ '{"title": "Hello Developers - What to Drink and Code Today?", "url": "https://2coffee.dev"}'
"OK"
127.0.0.1:6379> JSON.GET obj $
[{"title":"Hello Developers - What to Drink and Code Today?","url":"https://2coffee.dev"}]
To use RedisJSON, you need to install Redis v6.x on your server. Redis provides several different methods for loading the RedisJSON module. Two popular methods are:
loadmodule /path/to/module/target/release/librejson.so
$ redis-server --loadmodule /path/to/module/librejson.so
Where /path/to/module is the path to your Redis installation directory. For example:
$ redis-server --loadmodule /usr/lib/redis/module/librejson.so
For more details, you can refer to the official documentation page.
As mentioned above, RedisJSON provides us with many syntaxes to store, update, or retrieve JSON values.
127.0.0.1:6379> JSON.SET obj $.year 2022
OK
127.0.0.1:6379> JSON.SET obj $.users '["admin"]'
OK
127.0.0.1:6379> JSON.ARRAPPEND obj $.users '"hoaitx"'
2
127.0.0.1:6379> JSON.GET obj $
[{"title":"Hello Developers - What to Drink and Code Today?","url":"https://2coffee.dev","year":2022,"users":["admin","hoaitx"]}]
127.0.0.1:6379> JSON.DEL obj
"OK"
To see the complete list of JSON data manipulation commands, you can visit the Commands documentation page
To use RedisJSON with RediSearch, you need to have RediSearch v2.2 or higher and RedisJSON v2.0 or higher installed on your Redis server.
Then, create a schema in RediSearch to serve the search:
127.0.0.1:6379> FT.CREATE article ON JSON PREFIX 1 article: SCHEMA $.title AS title TEXT $.content as content TEXT $.view AS view NUMERIC
OK
To add data to the Schema, use the JSON.SET
command:
127.0.0.1:6379> JSON.SET article:1 $ '{"title": "2coffee", "content": "Hello Developers - What to Drink and Code Today?", "view": 0}'
Then, you can perform full-text search using RediSearch syntax:
127.0.0.1:6379> FT.SEARCH article '@title:%coffee%'
1
article:1000
$
{"title":"2coffee","content":"Hello Developers - What to Drink and Code Today?","view":0}
Starting from RediSearch 2.6.0, you can also perform full-text search on attributes that are an array of strings.
127.0.0.1:6379> JSON.SET article:1 $ '{"title": ["2coffee", "hicoffee"], "content": "Hello Developers - What to Drink and Code Today?", "view": 0}'
127.0.0.1:6379> FT.SEARCH article '@title:%coffee%'
Starting from RediSearch 2.6.1, you can perform search on attributes that are an array of numbers (NUMERIC).
127.0.0.1:6379> JSON.SET article:1 $ '{"title": ["2coffee", "hicoffee"], "content": "Hello Developers - What to Drink and Code Today?", "view": [0, 1, 2]}'
127.0.0.1:6379> FT.SEARCH article '@view:[0 1]'
The syntax above will return records with any value in view
satisfying >= 0 and <= 1.
There are many other syntaxes to support indexing and searching documents, which you can explore in the official documentation.
If you are familiar with working with NoSQL, RedisJSON provides a convenient way to handle JSON data without worrying about data inconsistency. SQL databases have long integrated JSON data types, giving us more options in organizing data.
RedisJSON seamlessly integrates with RediSearch for indexing and searching, providing both storage convenience and the powerful full-text search capabilities of RediSearch and the speed of Redis. I'm using this trio of tools, what are your plans for upcoming projects? :D
Hello, my name is Hoai - a developer who tells stories through writing ✍️ and creating products 🚀. With many years of programming experience, I have contributed to various products that bring value to users at my workplace as well as to myself. My hobbies include reading, writing, and researching... I created this blog with the mission of delivering quality articles to the readers of 2coffee.dev.Follow me through these channels LinkedIn, Facebook, Instagram, Telegram.
Comments (3)