- vừa được xem lúc

Tìm kiếm và truy vấn dữ liệu Redis sử dụng RediSearch với Nodejs

0 0 1

Người đăng: Mòe vui vẻ

Theo Viblo Asia

Tổng quan về RediSearch

RediSearch là một module của Redis, được thiết kế để cung cấp khả năng truy vấn, lập chỉ mục phụ và tìm kiếm toàn văn (full-text search) cho dữ liệu được lưu trữ trong Redis.

Nói một cách đơn giản, RediSearch mở rộng chức năng của Redis, biến nó không chỉ là một key-value store hay bộ nhớ đệm (cache) mà còn là một công cụ tìm kiếm hiệu suất cao.

Các tính năng chính của RediSearch bao gồm:

  • Tìm kiếm toàn văn: Cho phép tìm kiếm thông minh trên các trường văn bản trong dữ liệu Redis, hỗ trợ các tính năng như stemming (đưa từ về dạng gốc), stop words (bỏ qua các từ phổ biến không mang nhiều ý nghĩa) và fuzzy matching (cho kết quả gần đúng ngay cả khi có lỗi chính tả).
  • Lập chỉ mục phụ: Tạo chỉ mục trên dữ liệu Redis, giúp tăng tốc độ truy vấn và cho phép thực hiện các truy vấn phức tạp. RediSearch sử dụng các chỉ mục nén, đảo ngược (compressed, inverted indexes) để lập chỉ mục nhanh chóng và sử dụng bộ nhớ hiệu quả.
  • Ngôn ngữ truy vấn phong phú: Cung cấp một ngôn ngữ truy vấn linh hoạt để tìm kiếm dữ liệu, bao gồm tìm kiếm cụm từ chính xác, lọc theo số, tìm kiếm trong các trường cụ thể, và thực hiện các phép toán logic (AND, OR, NOT).
  • Truy vấn tổng hợp (Aggregations): Cho phép nhóm kết quả tìm kiếm và thực hiện các hàm thống kê như đếm (count), tính tổng (sum), trung bình (average), giá trị nhỏ nhất (min) và lớn nhất (max).
  • Hỗ trợ nhiều kiểu dữ liệu: Có thể lập chỉ mục và tìm kiếm trên nhiều loại dữ liệu khác nhau trong Redis, bao gồm cả tài liệu JSON khi kết hợp với mô-đun RedisJSON.
  • Hiệu suất cao và độ trễ thấp: Tận dụng tốc độ của Redis để cung cấp khả năng tìm kiếm nhanh chóng, phù hợp cho các ứng dụng thời gian thực.
  • Tìm kiếm vector (Vector search): Hỗ trợ tìm kiếm tương đồng vector, hữu ích cho các ứng dụng như tìm kiếm ngữ nghĩa, hệ thống gợi ý.

Khi nào nên cân nhắc sử dụng RediSearch?

  • Khi bạn cần tích hợp khả năng tìm kiếm mạnh mẽ vào ứng dụng đang sử dụng Redis.
  • Khi muốn một giải pháp tìm kiếm hiệu suất cao với chi phí bộ nhớ được tối ưu.
  • Như một giải pháp thay thế cho các công cụ tìm kiếm chuyên dụng khác như Elasticsearch, đặc biệt nếu hệ thống của bạn đã có sẵn Redis.

Sử dụng RediSearch với Nodejs

Cài đặt Redis

Ở đây, bạn có thể sử dụng Redis Stack. Đây là bộ sản phẩm được tích hợp sẵn các module mạnh mẽ nhất của Redis như RediSearch, RedisJSON,... nhằm thống nhất và đơn giản hóa trải nghiệm của nhà phát triển khi làm việc với Redis. Cài đặt Redis Stack bằng docker:

docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 -e REDIS_ARGS="--requirepass mypassword" redis/redis-stack:latest

Sử dụng RediSearch với Nodejs

Cài đặt package @redis/search:

npm i @redis/search

Giả sử, bạn cần tìm kiếm từ kho sách với các thuộc tính: title, description, authors, categories, price. Trước khi có thể thực hiện bất kỳ tìm kiếm nào, chúng ta cần cho RediSearch biết cách lập chỉ mục dữ liệu của mình và sử dụng khóa Redis nào để tìm dữ liệu đó. Lệnh FT.CREATE sẽ tạo chỉ mục RediSearch.

import { createClient, SchemaFieldTypes } from 'redis'; (async () => { const client = createClient({ url: 'redis://:mypassword@127.0.0.1:6379/0', }); await client.connect(); try { await client.ft.create('idx:book', { '$.title': { type: SchemaFieldTypes.TEXT, AS: 'title', SORTABLE: true }, '$.description': { type: SchemaFieldTypes.TEXT, AS: 'description', }, '$.authors': { type: SchemaFieldTypes.TAG, AS: 'authors' }, '$.categories': { type: SchemaFieldTypes.TAG, AS: 'categories' }, '$.price': { type: SchemaFieldTypes.NUMERIC, AS: 'price', SORTABLE: true }, }, { ON: 'JSON', PREFIX: 'noderedis:book' }); console.log('Successfully created index.'); } catch (e) { if (e.message === 'Index already exists') { console.log('Index exists already, skipped creation.'); } else { // Something went wrong, perhaps RediSearch isn't installed... console.error(e); } }
})();

Thêm dữ liệu mẫu:

 const books = [ { "title": "Cuộc Phiêu Lưu Bất Tận", "description": "Một câu chuyện kỳ thú về những vùng đất chưa được khám phá và những bí mật cổ xưa.", "authors": ["Nguyễn Văn An", "Trần Thị Bích"], "categories": ["Phiêu Lưu", "Giả Tưởng"], "price": 250000 }, { "title": "Bí Mật Của Dòng Sông", "description": "Hành trình tìm lại ký ức đã mất bên dòng sông huyền bí.", "authors": ["Lê Minh Cường"], "categories": ["Trinh Thám", "Tâm Lý"], "price": 180000 }, { "title": "Ngôi Sao Phương Bắc", "description": "Câu chuyện tình yêu vượt qua thử thách của số phận và khoảng cách.", "authors": ["Phạm Thu Hà"], "categories": ["Lãng Mạn", "Hiện Đại"], "price": 220000 }, { "title": "Lập Trình Cho Tương Lai", "description": "Hướng dẫn toàn diện về các ngôn ngữ lập trình và công nghệ mới.", "authors": ["Hoàng Đức Trung", "Vũ Ngọc Mai"], "categories": ["Công Nghệ", "Giáo Dục", "Khoa Học Máy Tính"], "price": 350000 }, { "title": "Ẩm Thực Việt Nam Tinh Túy", "description": "Khám phá những món ăn truyền thống và hiện đại của Việt Nam.", "authors": ["Đỗ Thị Kim Chi"], "categories": ["Ẩm Thực", "Văn Hóa"], "price": 280000 }, // ... Add more data here ] for (let index = 0; index < books.length; index++) { const element = books[index]; await client.json.set(`noderedis:book:${index}`, '$', element) }

Sau khi tạo index và thêm dữ liệu vào Redis, chúng ta đã có thể truy vấn dữ liệu sử dụng hàm ft.search.

Sau đây là một vài truy vấn mẫu để tham khảo: Tìm những sách có giá = 150k:

await client.ft.search('idx:book', '@price:[150000 150000]')

Tìm những sách có giá <= 150k:

await client.ft.search('idx:book', '@price:[0 150000]')

Tìm tất cả những text field chứa từ "con người" (ở ví dụ này là cả tilte và description)

await client.ft.search('idx:book', 'con người')

Tìm sách có tiêu đề chứa từ "robot"

await client.ft.search('idx:book', '@title:robot')

Fuzzy search (cho phép bạn tìm các tài liệu có từ ngữ gần giống với từ mà bạn tìm kiếm)

await client.ft.search('idx:book', '@title:%Đôg%') // Sai số tối đa là 1 chữ cái
await client.ft.search('idx:book', '@title:%%Đnôg%%') //Sai số tối đa là 2 chữ cái
//Tăng số lượng ký tự % để tăng giới hạn sai số

Tìm sách thuộc thể loại tâm lý học

await client.ft.search('idx:book', `@categories:{Tâm Lý Học}`)

Tìm sách không thuộc thể loại tâm lý học

await client.ft.search('idx:book', `-@categories:{Tâm Lý Học}`) // Thêm dấu "-" đằng trước

Tìm sách thuộc cả thể loại tâm lý học và kỹ năng mềm

await client.ft.search('idx:book', `@categories:{Tâm Lý Học} @categories:{Kỹ Năng Mềm}`)

Tìm sách thuộc thể loại tâm lý học hoặc kỹ năng mềm

await client.ft.search('idx:book', `@categories:{Tâm Lý Học|Xã Hội Học}`)

RediSearch còn hỗ trợ rất nhiều truy vấn hay ho khác để các bạn áp dụng (Tham khảo documentationquery syntax reference).

Nguồn tham khảo:

https://redis.io/docs/latest/develop/interact/search-and-query

https://www.npmjs.com/package/@redis/search

https://redis.io/about/about-stack

https://hub.docker.com/r/redis/redis-stack

Bình luận

Bài viết tương tự

- vừa được xem lúc

Caching đại pháp 2: Cache thế nào cho hợp lý?

Caching rất dễ. Mình không nói đùa đâu, caching rất là dễ. Ai cũng có thể làm được chỉ sau 10 phút đọc tutorial. Nó cũng giống như việc đứa trẻ lên 3 đã có thể cầm bút để vẽ vậy.

0 0 134

- vừa được xem lúc

Caching đại pháp 1: Nấc thang lên level của developer

Bí quyết thành công trong việc đáp ứng hệ thống triệu user của những công ty lớn (và cả công ty nhỏ). Tại sao caching lại là kỹ thuật tối quan trọng để phù phép ứng dụng rùa bò của chúng ta thành siêu phẩm vạn người mê.

0 0 88

- vừa được xem lúc

Cache dữ liệu Nodejs với Redis

Một tí gọi là lý thuyết để anh em tham khảo. Cache là gì. Lợi ích của việc cache data. .

0 0 122

- vừa được xem lúc

Nguyên tắc hoạt động của redis server

Sự ra đời của Redis. . Câu chuyện bắt đầu khi tác giả của Redis, Salvatore Sanfilippo. (nickname: antirez), cố gắng làm những công việc gần như là không.

0 0 103

- vừa được xem lúc

Viết ứng dụng chat realtime với Laravel, VueJS, Redis và Socket.IO, Laravel Echo

Xin chào tất cả các bạn, đây là một trong những bài post đầu tiên của mình. Sau bao năm toàn đi đọc các blog tích luỹ được chút kiến thức của các cao nhân trên mạng.

0 0 921

- vừa được xem lúc

Tìm hiểu tổng quan về Redis

1. Lời mở đầu.

0 0 379