RediSearch 2.0 public preview! Hầu hết features major release này driven by feedback bạn, focus cải thiện developer experience và enhanced scalability. Nhưng bài blog tập trung giúp bạn bắt đầu dùng RediSearch 2.0 mới data indexing capabilities và cách tốt hơn tạo index.
Có rich query và aggregation engine trong Redis database mở cửa nhiều ứng dụng mới vượt caching. Dùng Redis làm primary database ngay khi cần complex query, không thêm complexity code update và index data. Tất cả với speed, reliability, scalability nổi tiếng Redis!
Xem thêm what's new, xem Introducing RediSearch 2.0
Bắt đầu
Prerequisites
Để bắt đầu RediSearch 2.0, cần:
- Docker
- Redis command-line interface. 2 option chính:
- redis-cli, đi kèm Redis
- RedisInsight, free GUI streamlined Redis app development, cũng có CLI.
Lấy Redis database với RediSearch enabled
Cài đặt và dùng RediSearch 2.0 nhiều cách:
- Redis Enterprise Cloud
- Redis Enterprise Software
- RediSearch binaries
- RediSearch sources
- Docker image
Để đơn giản, bài này dùng Docker images. (Nếu đã cài RedisSearch 2.0, jump next section.) Khởi động Redis instance với Docker, mở terminal chạy:
> docker run -it --rm --name redis-search-2 \ -p 6379:6379 \ redis/redisearch:2.0.0
Lưu ý: Container tự remove khi exit (–rm parameter).
Kết nối Redis và insert data
Dùng Redis client yêu thích, kết nối RediSearch database.
Nếu khởi động Redis instance với Docker, dùng lệnh sau dùng redis-cli embedded trong container:
> docker exec -it redis-search-2 redis-cli
Nếu dùng Redis Insight, add RediSearch instance và vào CLI.
Insert data
Sẵn sàng insert data. Ví dụ dùng movie data stored as Redis Hashes, insert vài phim:
> HSET movie:11002 title "Star Wars: Episode V - The Empire Strikes Back" plot "Luke Skywalker begins Jedi training with Yoda." release_year 1980 genre "Action" rating 8.7 votes 1127635 (integer) 6 > HSET movie:11003 title "The Godfather" plot "The aging patriarch of an organized crime dynasty transfers control of his empire to his son." release_year 1972 genre "Drama" rating 9.2 votes 1563839 (integer) 6
Database giờ có 2 Hashes. Dễ retrieve info dùng lệnh sau, nếu biết key movie (movie:11002):
> HMGET movie:11002 title rating 1) "Star Wars: Episode V - The Empire Strikes Back" 2) "8.7"
Nhưng làm sao query database lấy list movie dựa trên title, genre, hoặc release_year?
Với "core" Redis data structures, tự manage index dùng Sets associate genre đến list movie IDs, ví dụ, và thêm nhiều code vào app manage và query index.
Nhưng với RediSearch chỉ cần define index associated với data và để database manage chúng. Dùng query engine query/search data dùng secondary indices.
Tạo RediSearch index cho movies
Tạo index, phải define schema list field và type được index, dùng trong query.
Ví dụ này index 4 field:
- Title
- Release year
- Rating
- Genre
Tạo index dùng lệnh FT.CREATE:
> FT.CREATE idx:movie ON hash PREFIX 1 "movie:" SCHEMA title TEXT SORTABLE release_year NUMERIC SORTABLE rating NUMERIC SORTABLE genre TAG SORTABLE OK
Trước khi chạy query, xem kỹ FT.CREATE:
- idx:movie: tên index, dùng khi query
- ON hash: kiểu cấu trúc được index. (Lưu ý RediSearch 2.0 chỉ support Hash, nhưng parameter này cho phép index cấu trúc khác tương lai.)
- PREFIX 1 "movie:": prefix key nên index. Là list, nên vì chỉ index movie:* key số là 1. Muốn index movies và TV shows cùng field, dùng: PREFIX 2 "movie:" "tv_show:"
- SCHEMA …: định nghĩa schema, field, type index. Nhìn thấy dùng TEXT, NUMERIC, TAG, SORTABLE parameters.
RediSearch 2.0 engine sẽ scan database dùng PREFIX values, update index dựa trên schema definition. Làm cho dễ dàng thêm index vào existing application dùng Hashes, không cần đổi code.
Xem index info lệnh sau:
> FT.INFO idx:movie 1) index_name 2) idx:movie ... 46) 1) global_idle 2) (integer) 0 ...
Giờ sẵn sàng dùng index và query database.
Query movie database
Phần này dùng FT.SEARCH command và syntax; lưu ý mục tiêu bài post là get started, stick to basics, không deep dive. Tìm hiểu thêm RediSearch tại documentation và tutorial.
Full-text search queries
RediSearch là full-text search engine, cho phép app chạy powerful queries kiểu Google. Ví dụ, search tất cả movie chứa thông tin "war"-related, chạy:
> FT.SEARCH idx:movie "war" RETURN 3 title release_year rating 1) (integer) 1 2) "movie:11002" 3) 1) "title" 2) "Star Wars: Episode V - The Empire Strikes Back" 3) "release_year" 4) "1980" 5) "rating" 6) "8.7"
Nhìn thấy movie Star Wars: Episode V—The Empire Strikes Back tìm thấy, dù chỉ dùng "war" match "Wars" trong title. Vì title indexed as text, field tokenized và stemmed.
Cũng, command không specify field, nên "war" (và related words) search trong tất cả text fields của index. Muốn search specific field, dùng @field notation:
> FT.SEARCH idx:movie "@title:war" RETURN 3 title release_year rating
Chạy thêm full-text search queries trên dataset đơn giản này, demo ở đây (Note: giữ document ngắn, kết quả query không show):
Prefix matches:
> FT.SEARCH idx:movie "emp*" RETURN 3 title release_year rating
Fuzzy search:
> FT.SEARCH idx:movie "%gdfather%" RETURN 3 title release_year rating
Unions:
> FT.SEARCH idx:movie "war | %gdfather% " RETURN 3 title release_year rating
Thêm info query syntax tại RediSearch documentation.
Tag field search
Dùng tag field "genre" tìm tất cả movie "drama":
> FT.SEARCH idx:movie "@genre:{Drama}" RETURN 3 title release_year rating
1) (integer) 1
2) "movie:11003"
3) 1) "title" 2) "The Godfather"
3) "release_year" 4) "1972"
5) "rating" 6) "9.2"
Cú pháp @field:{value} chỉ search trong tag field. Thêm info tag filter tại RediSearch documentation.
Update database và query
Cho đến nay, data query tạo trước index và indexed khi tạo index. Thay đổi bằng cách thêm movie mới:
> HSET "movie:11005" title "Star Wars: Episode VI - Return of the Jedi" plot "The Rebels destroy the Empire's Death Star." release_year 1983 genre "Action" rating 8.3 votes 906260 (integer) 6
Dùng lại query trước:
> FT.SEARCH idx:movie "war" RETURN 3 title release_year rating 1) (integer) 2 2) "movie:11005" 3) 1) "title" 2) "Star Wars: Episode VI - Return of the Jedi" 3) "release_year" 4) "1983" 5) "rating" 6) "8.3" 4) "movie:11002" 5) 1) "title" 2) "Star Wars: Episode V - The Empire Strikes Back" 3) "release_year" 4) "1980" 5) "rating" 6) "8.7"
Nhìn thấy movie mới auto-indexed.
Tương tự, nếu delete hoặc expire movie, index tự update, như đây:
> EXPIRE "movie:11002" 15 (integer) 1
Đợi 15 giây chạy search query, movie bị removed khỏi index.
Khá powerful khi muốn ephemeral search và để database manage expiration data và index. Thêm info ephemeral search tại blog post The Case for Ephemeral Search.
Đi đâu từ đây?
Bài post chia sẻ basics RediSearch, demo indexing data transparent từ application code. Chức năng này mới RediSearch 2.0, vì 1.x developer phải dùng FT.ADD command index data.
Ngoài search và indexing, RediSearch cũng có powerful data aggregation capabilities, covered trong documentation, tutorial, online course.
Tutorial chứa same data, nhưng bigger dataset và more sample queries và aggregation. Cũng chứa app demo dùng RediSearch với Java, Python, Node.js. Tìm hiểu thêm tại:
- RediSearch web page
- RediSearch 2.0 Tutorial
- Rediscover Use Cases and Projects