Hướng dẫn redisearch nodejs - tìm kiếm lại nodejs

Chúng tôi đã chọn lưu trữ dữ liệu người dùng và vị trí của chúng tôi trong băm Redis. Băm là một sự phù hợp tuyệt vời để lưu trữ các đối tượng miền. Hãy nhớ lại rằng chúng tôi đã chọn để lưu trữ mỗi người dùng trong một hàm băm có khóa chứa ID người dùng. Ví dụ: đây là người dùng 852 như đã thấy trong RedisInsight:

Hướng dẫn redisearch nodejs - tìm kiếm lại nodejs

Nếu bạn đang sử dụng Redis-Cli, bạn có thể xem người dùng 852 với lệnh HGETALL:

127.0.0.1:6379> hgetall ncc:users:852
1) "id"
2) "852"
3) "firstName"
4) "Dominik"
5) "lastName"
6) "Schiffmann"
7) "email"
8) ""
9) "password"
10) "$2b$05$xbkSwODz1tWqdE7xWb393eiYIQcdiEdbbvhK88.Xr9sW7WxdI26qi"
11) "numCheckins"
12) "9353"
13) "lastCheckin"
14) "1488517098363"
15) "lastSeenAt"
16) "124"

Lưu trữ dữ liệu trong băm có nghĩa là chúng ta có thể dễ dàng truy xuất các nội dung của băm, miễn là chúng ta biết chìa khóa. Vì vậy, thật tầm thường khi tìm kiếm người dùng 852, nhưng làm thế nào chúng ta có thể thực hiện bất kỳ hoạt động nào sau đây?

  • Nhận người dùng có địa chỉ email là .
  • Tìm tất cả người dùng được nhìn thấy lần cuối tại vị trí 124.
  • Tìm tất cả người dùng có từ 1000 đến 3000 lần kiểm tra.
  • Tìm tất cả các vị trí trong bán kính 10 dặm của tọa độ vĩ độ / kinh độ nhất định và có ít nhất xếp hạng 3 sao.

Redis là cơ sở dữ liệu khóa/giá trị. Điều này có nghĩa là mô hình dữ liệu của nó được tối ưu hóa để truy xuất theo khóa. Các truy vấn ở trên không thể được giải quyết bằng cách biết chỉ khóa băm - chúng tôi cần một số cơ chế khác để lập chỉ mục dữ liệu của chúng tôi.

Theo truyền thống trong cơ sở dữ liệu khóa/giá trị, điều này có nghĩa là thêm mã để tạo và cập nhật thủ công các chỉ mục. Ví dụ: để giải quyết truy vấn "Người dùng nào có địa chỉ email ", chúng tôi có thể tạo khóa chuỗi mới chứa địa chỉ email đó, với giá trị là ID của người dùng:

127.0.0.1:6379> set ncc:users:byemail: 852
OK

Bây giờ, nếu chúng tôi muốn nhận chi tiết người dùng của Dominik chỉ được cung cấp địa chỉ email của anh ấy, chúng tôi có một quy trình hai bước cần tuân theo:

  1. Tra cứu ID người dùng cho người dùng liên quan đến địa chỉ email chúng tôi có.
  2. Sử dụng ID người dùng đó để truy xuất các giá trị từ băm của người dùng.

127.0.0.1:6379> get ncc:users:byemail:
"852"
127.0.0.1:6379> hgetall ncc:users:852
1) "id"
2) "852"
3) "firstName"
4) "Dominik"
5) "lastName"
6) "Schiffmann"
7) "email"
8) ""
9) "password"
10) "$2b$05$xbkSwODz1tWqdE7xWb393eiYIQcdiEdbbvhK88.Xr9sW7WxdI26qi"
11) "numCheckins"
12) "9353"
13) "lastCheckin"
14) "1488517098363"
15) "lastSeenAt"
16) "124"

Chúng tôi cũng cần cập nhật thông tin này và đồng bộ với các thay đổi đối với băm tại ncc:users:852 trong mã ứng dụng của chúng tôi.

Các loại chỉ mục thứ cấp khác có thể được tạo bằng cách sử dụng các loại dữ liệu Redis khác. Ví dụ: chúng tôi có thể sử dụng tập hợp được sắp xếp Redis làm chỉ mục thứ cấp, cho phép chúng tôi thực hiện các truy vấn phạm vi như "Tìm tất cả người dùng có từ 1000 đến 3000 lần kiểm tra". Một lần nữa, chúng tôi phải điền và duy trì cấu trúc dữ liệu bổ sung này trong mã ứng dụng.

Mô -đun Redisearch giải quyết tất cả các vấn đề này cho chúng tôi và hơn thế nữa. Đây là một công cụ tìm kiếm lập chỉ mục, truy vấn và toàn văn cho redis tự động theo dõi các thay đổi đối với dữ liệu trong băm được lập chỉ mục. Redisearch cung cấp một ngôn ngữ truy vấn linh hoạt để trả lời các câu hỏi như "Tìm cho tôi tất cả các phòng tập thể dục với ít nhất xếp hạng 3 sao và hơn 200 lần kiểm tra trong vòng 10 dặm của Oakland, California" mà không cần thêm mã để xây dựng hoặc duy trì cấu trúc dữ liệu thứ cấp trong ứng dụng của chúng tôi .

Xem video để xem cách sử dụng Redisearch trong ứng dụng ví dụ của chúng tôi.

Trong bài tập này, bạn sẽ hoàn thành việc triển khai một tuyến đường sử dụng Redisearch để trả về tất cả người dùng có Checkin cuối cùng ở một địa điểm nhất định.

Mở thư mục node-js-crash-course bằng IDE của bạn và tìm tệp

127.0.0.1:6379> set ncc:users:byemail: 852
OK
0.

Trong tệp này, bạn sẽ thấy một tuyến đường được triển khai một phần. Để hoàn thành bài tập này, bạn sẽ cần thay thế dòng này:

const searchResults = await redis.performSearch(
redis.getKeyName('usersidx'),
'TODO... YOUR QUERY HERE',
);

với một chứa truy vấn Redisearch chính xác để trả về người dùng có trường "LastSeenat" được đặt thành giá trị của locationID. Bạn sẽ cần sử dụng cú pháp "phạm vi số" cho việc này, vì trường "LastSeenat" đã được lập chỉ mục dưới dạng một số. Hãy chắc chắn kiểm tra tài liệu Cú pháp Query cho Redisearch để nhận trợ giúp với điều này.

Để thử mã của bạn, hãy đảm bảo rằng thành phần máy chủ API đang chạy:

(Hãy nhớ rằng, điều này sẽ sử dụng Nodemon để khởi động lại máy chủ bất cứ khi nào bạn lưu thay đổi mã).

Sau đó, chỉ trình duyệt của bạn tại

127.0.0.1:6379> set ncc:users:byemail: 852
OK
2. Nếu truy vấn của bạn là chính xác, bạn sẽ thấy đầu ra tương tự như sau (người dùng thực tế có thể khác nhau, chỉ cần đảm bảo rằng giá trị của
127.0.0.1:6379> set ncc:users:byemail: 852
OK
3 cho mỗi khớp khớp với ID vị trí bạn cung cấp - 33 trong trường hợp này):

[
{
"id": "238",
"firstName": "Jonas",
"lastName": "Nielsen",
"numCheckins": "7149",
"lastCheckin": "1515248028256",
"lastSeenAt": "33"
},
{
"id": "324",
"firstName": "Frans",
"lastName": "Potze",
"numCheckins": "8623",
"lastCheckin": "1515976232073",
"lastSeenAt": "33"
},
...
]

Để giúp bạn phát triển truy vấn của mình, hãy sử dụng chế độ xem Redisearch trong RedisInsight hoặc lệnh ft.search trong redis-cli. Dưới đây là một ví dụ về cách nhập truy vấn với RedisInsight (tôi đang tìm người dùng có tên "Laura"):

Hướng dẫn redisearch nodejs - tìm kiếm lại nodejs

Hãy nhớ chọn chỉ mục

127.0.0.1:6379> set ncc:users:byemail: 852
OK
4, vì bạn đang làm việc với dữ liệu người dùng tại đây.

Truy vấn, chỉ mục và tìm kiếm toàn văn trong redis:

Tìm Bigfoot Restfuly với Express + Redisearch:

Các nguồn lực khác:

  • Ru203, truy vấn, lập chỉ mục và tìm kiếm toàn văn tại Đại học Redis
  • Redisearch, trang chủ chính thức
  • Nghiên cứu bắt đầu hướng dẫn