Computer >> Máy Tính >  >> Lập trình >> Redis

Lập chỉ mục, Truy vấn và Tìm kiếm Toàn văn của Tài liệu JSON với Redis

RedisJSON và RediSearch cho đến nay là các mô-đun Redis phổ biến nhất trong đám mây của chúng tôi. (Xem Hình 1) Hình ảnh docker của RedisJSON và RediSearch (đi kèm với Redis) được kéo hơn 2000 lần mỗi ngày. Đây là lý do tại sao chúng tôi nghĩ về Itamar Haber, nhà truyền bá công nghệ tại Redis, như một người có tầm nhìn xa khi ông viết phiên bản đầu tiên 4 năm trước. Vào tháng 4, chúng tôi đã đưa ra một số thông báo tại RedisConf liên quan đến JSON, khả năng lập chỉ mục và tìm kiếm toàn văn bản. Hôm nay, chúng tôi vui mừng thông báo bản xem trước riêng tư của các tính năng này.

Trong blog này, chúng tôi sẽ cung cấp cho bạn tổng quan về các khả năng hiện tại của RedisJSON. Sau đó, chúng ta sẽ đi sâu vào phần khả năng mới của bản xem trước riêng tư này. Khả năng lập chỉ mục, truy vấn và sử dụng tìm kiếm toàn văn trên các tài liệu JSON bằng cách sử dụng RediSearch là tính năng mới thú vị nhất của phiên bản này. Cuối cùng, chúng tôi sẽ chỉ cho bạn cách nhanh chóng bắt đầu.

Lập chỉ mục, Truy vấn và Tìm kiếm Toàn văn của Tài liệu JSON với Redis

Các khả năng của JSON

Khi bạn không có RedisJSON, bạn lập mô hình các tài liệu lồng nhau trong Redis bằng cách sử dụng cấu trúc dữ liệu Chuỗi.

Nhưng, điều gì sẽ xảy ra nếu chúng tôi cần cập nhật một phần con của tài liệu?

Để duy trì tính nguyên tử của hoạt động, chúng tôi sẽ cần:

  1. XEM tài liệu
  2. Đọc phiên bản trước và giải mã hóa nó
  3. Nhúng bản cập nhật vào giao dịch Redis
  4. Tuần tự hóa thành JSON và cập nhật tài liệu
  5. Thực hiện giao dịch

Chúng tôi có thể cần thử lại tất cả các bước này nếu một khách hàng khác cập nhật tài liệu trong quá trình này.

Tuy nhiên, với RedisJSON, chúng tôi có thể thực hiện cập nhật này với một giao dịch nguyên tử duy nhất :

Hãy xem xét một ví dụ khác, một ví dụ mà bạn có một JSON lớn, nhưng chỉ yêu cầu một phần con của tài liệu đó trong ứng dụng của bạn.

Không có RedisJSON:

Bạn phải:

  1. Truy xuất toàn bộ chuỗi json, được tuần tự hóa thành một chuỗi
  2. Hủy số hóa JSON
  3. Trích xuất phần phụ bạn cần

Với RedisJSON, bạn chỉ có thể truy xuất dữ liệu bạn yêu cầu bằng một lệnh duy nhất, giảm thiểu chu kỳ CPU, chi phí mạng và quan trọng nhất là độ trễ.

Như bạn có thể thấy, RedisJSON đơn giản hóa các thao tác trên tài liệu JSON. Phiên bản GA hiện tại của RedisJSON (v1.0) là phiên bản mà cộng đồng đang sử dụng rộng rãi và giải quyết chính xác những thiếu sót của việc lập mô hình cấu trúc lồng nhau với cấu trúc dữ liệu chuỗi. Dưới đây là tổng quan về một số khả năng chính của nó.

Lưu trữ (hoặc cập nhật) tài liệu JSON được liên kết với khóa trong Redis

Thay thế một phần con (ví dụ:giá trị chuỗi của một khóa)

Thêm một mục vào bộ sưu tập hoặc bản đồ

Trích xuất toàn bộ tài liệu

Trích xuất một phần của nó bằng cách sử dụng một tập hợp con của JSONPath

RedisJSON 2.0:Bản phát hành bản xem trước riêng tư

Chúng tôi đã công bố phiên bản này tại RedisConf 2021 và hôm nay chúng tôi vui mừng thông báo rằng phiên bản này có sẵn dưới dạng bản xem trước riêng tư cho một nhóm khách hàng Redis Enterprise được chọn của chúng tôi — và là một ứng cử viên phát hành cho cộng đồng của chúng tôi. Phiên bản này có ba tính năng chính, đó là hỗ trợ đầy đủ biểu thức JSONPath, hỗ trợ Active-Active (với Redis Enterprise) và khả năng lập chỉ mục, truy vấn và sử dụng tìm kiếm toàn văn trên tài liệu JSON với RediSearch. Nhưng còn nhiều hơn thế nữa! Hãy đi sâu vào các tính năng mới.

Được viết lại bằng RUST

Ngôn ngữ lập trình hệ thống là một họ các ngôn ngữ hướng đến tính hiệu quả. Các chương trình được viết bằng các ngôn ngữ này thường nhẹ và mang lại hiệu suất tốt nhất. Đây là lý do tại sao Redis đã được viết trong lịch sử bằng C. Nó cũng giải thích tại sao Redis có thể đạt được độ trễ cực thấp và thông lượng cao. Hầu hết các mô-đun Redis được viết bằng C, C ++ hoặc Rust, là những ngôn ngữ thuộc cùng một họ.

JSON đặc biệt được phục vụ tốt bởi cộng đồng Rust bao gồm tuần tự hóa JSON và triển khai JSONPath rất nhanh và hiệu quả. Mang lại lợi ích của những triển khai đó cho người dùng Redis là điều hiển nhiên và chỉ yêu cầu ánh xạ giữa API mô-đun Redis và Rust.

Hỗ trợ đầy đủ cho JSONPath

Và đây là lợi ích của việc viết lại RUST này. Phiên bản mới này bao gồm hỗ trợ toàn diện của JSONPath. Giờ đây, có thể sử dụng tất cả các biểu thức JSONPath.

Đã cung cấp một tài liệu JSON

Ký tự đại diện (trước đây được giới hạn ở mục đầu tiên)

Trích xuất các lát

Một ví dụ nâng cao hơn với biểu thức bộ lọc

Hỗ trợ Active-Active

Active-Active là một tính năng được cung cấp bởi Redis Enterprise. Active-Active cho phép bạn sao chép cơ sở dữ liệu của mình thành một số cụm Redis Enterprise được phân phối theo địa lý. Người dùng có thể kết nối với cụm gần nhất với độ trễ đọc và ghi cục bộ.

Việc triển khai dựa trên công nghệ Kiểu dữ liệu nhân bản (CRDT) không có xung đột. Trong khi triển khai nó cho hầu hết các cấu trúc dữ liệu cốt lõi được Redis hỗ trợ, Redis đã phát triển kiến ​​thức và kinh nghiệm vững chắc được xác nhận bởi triển khai mới này dành cho JSON.

Các nhà phát triển ứng dụng hiện có thể dựa vào điều này để xây dựng các ứng dụng phân tán theo địa lý bằng cách sử dụng các tài liệu JSON. Dưới đây là một ví dụ về sự liên tiếp của các hoạt động trong một môi trường hoạt động tích cực với hai cụm:

Lập chỉ mục, Truy vấn và Tìm kiếm Toàn văn của Tài liệu JSON với Redis

Hãy xem chi tiết của từng hoạt động:

  • T1:Một ứng dụng khách đặt tài liệu JSON trên Cluster 1.
  • T2:Quá trình đồng bộ hóa sao chép tài liệu trên Cluster 2.
  • T3:Cả hai cụm đều chứa cùng một tài liệu.
  • T4:Một ứng dụng khách thêm màu xanh lam vào mảng màu trong Cụm 1 và đồng thời, một ứng dụng khác đang thêm màu xanh lục vào cùng một mảng trong Cụm 2.
  • T5:Quá trình đồng bộ hóa kết hợp hoạt động và cập nhật tài liệu trên cả hai cụm.
  • T6:Cả hai cụm đều chứa cùng một tài liệu.

Chúng tôi sẽ giải thích kỹ hơn về tất cả các quy trình đồng bộ hóa khi khả năng này ở chế độ Xem trước Công khai, nhưng nếu bạn quan tâm đến khả năng này, đừng ngần ngại liên hệ ngay tại support@redis.com.

RediSearch 2.2:Bản phát hành Xem trước Riêng tư

Blog này cũng thông báo về sự sẵn có của bản xem trước riêng tư cho RediSearch 2.2 (dưới dạng bản xem trước riêng tư cho một nhóm khách hàng Redis Enterprise được chọn của chúng tôi và với tư cách là một ứng cử viên phát hành cho cộng đồng của chúng tôi).

Trong phần này, chúng tôi sẽ mô tả các tính năng mới được cung cấp bởi bản phát hành RediSearch mới này. Nhưng trước tiên, đây là lý do tại sao chúng tôi phát hành hai mô-đun phổ biến đó cùng nhau:

Lập chỉ mục, truy vấn và tìm kiếm toàn văn tài liệu JSON

Tính năng mới đặc biệt này sẽ nâng khả năng JSON của Redis lên một cấp độ hoàn toàn mới. Không chỉ là một cửa hàng Key-Value, cho đến nay, RediSearch đã cung cấp khả năng lập chỉ mục và tìm kiếm trên các hàm băm. Bên dưới, RedisJSON 2.0 tiết lộ một API công khai nội bộ. Nội bộ, vì API này tiếp xúc với các mô-đun khác đang chạy bên trong nút Redis. Công khai, vì bất kỳ mô-đun nào cũng có thể sử dụng API này. RediSearch 2.2 cũng vậy!

Bằng cách thể hiện khả năng của nó cho các mô-đun khác, RedisJSON cung cấp cho RediSearch khả năng lập chỉ mục tài liệu JSON để người dùng hiện có thể tìm tài liệu bằng cách lập chỉ mục và truy vấn nội dung. Các mô-đun kết hợp này cung cấp cho bạn cơ sở dữ liệu tài liệu hướng JSON mạnh mẽ, độ trễ thấp !

Hãy xem nó trông như thế nào.

Trước tiên, chúng ta nên điền vào cơ sở dữ liệu bằng tài liệu JSON bằng lệnh JSON.SET.

Để tạo một chỉ mục mới, chúng tôi sử dụng lệnh FT.CREATE. Lược đồ của chỉ mục hiện chấp nhận các biểu thức JSONPath. Kết quả của biểu thức được lập chỉ mục và liên kết với một thuộc tính (tại đây:title).

Giờ đây, chúng tôi có thể thực hiện truy vấn tìm kiếm và tìm tài liệu JSON của mình bằng FT.SEARCH:

Tổng hợp trên các tài liệu JSON

Tổng hợp là một tính năng mạnh mẽ của RediSearch có thể được sử dụng để tạo báo cáo phân tích hoặc thực hiện các truy vấn kiểu tìm kiếm theo từng khía cạnh. Giờ đây, RediSearch có thể truy cập tài liệu JSON, có thể tải bất kỳ giá trị nào từ tài liệu JSON bằng cách sử dụng biểu thức JSONPath và sử dụng nó trong một đường dẫn cho dù giá trị đó có được lập chỉ mục hay không.

Hãy tạo một chỉ mục:

Thêm tài liệu JSON vào cơ sở dữ liệu:

Và thực hiện một phép tính đơn giản bằng cách sử dụng hai giá trị số được trích xuất từ ​​tài liệu JSON:

Linh hoạt hơn trong chiến lược lập chỉ mục

Với phiên bản RediSearch mới, giờ đây có thể lập chỉ mục cùng một giá trị (trường trên mã băm hoặc Giá trị JSON từ tài liệu JSON) với các tham số khác nhau. Đây là một trường hợp sử dụng điển hình, được giải quyết bằng tính năng mới này:

Hãy có một cơ sở dữ liệu chứa các tài liệu thuộc các danh mục.

Khi sử dụng loại TAG, bạn có thể dễ dàng lọc kết quả tìm kiếm của mình theo bất kỳ danh mục nào:

Nhưng nếu bạn cũng muốn có thể thực hiện tìm kiếm toàn văn trên các danh mục thì sao?

Cho đến nay, với hàm băm, bạn phải sao chép giá trị thành hai trường, điều này sẽ tiêu tốn gấp đôi bộ nhớ.

Đây là lúc FT.CREATE… AS trở nên tiện dụng hơn nhiều. Hãy quay lại tài liệu hay và đơn giản của chúng ta:

… Và sử dụng tính năng AS mới:

… Và…

Chơi lô tô! Giờ đây, chúng tôi có thể lọc theo thẻ và thực hiện tìm kiếm toàn văn trong cùng một trường, mà không cần phải sao chép dữ liệu.

Hồ sơ truy vấn

Độ phức tạp về thời gian của hầu hết các lệnh Redis đều được ghi chép rõ ràng. Ví dụ, HMGET có độ phức tạp là O (N), "trong đó N là số trường được yêu cầu." Với RediSearch, bạn có thể viết các truy vấn nâng cao. Tuy nhiên, độ phức tạp của các lệnh FT.SEARCH và FT.AGGREGATE phụ thuộc vào độ phức tạp của truy vấn.

Chúng tôi muốn cung cấp cho bạn các công cụ để hiểu điều gì đang xảy ra khi truy vấn được thực thi, để tìm ra thời gian sử dụng và cách tối ưu hóa truy vấn. Lệnh FT.PROFILE mới trả về một cây hiển thị các bước chính được RediSearch sử dụng để thực hiện truy vấn. Đối với mỗi bước, một thông tin thời gian được cung cấp.

Vậy điều gì sẽ xảy ra bên trong RediSearch khi chúng tôi thực hiện một truy vấn với một tìm kiếm mờ?

Hãy xem một ví dụ:

Chúng tôi đã sẵn sàng để lập hồ sơ truy vấn của chúng tôi. Hãy chạy cấu hình và phân tách kết quả cấu hình.

redis.cloud:6379> FT.PROFILE idx SEARCH LIMITED QUERY "%hello%"

Đầu tiên chúng tôi nhận được kết quả. Hữu ích khi kiểm tra xem truy vấn cấu hình có trả về những gì được mong đợi hay không.

Đây là tổng thời gian, được gọi là "thời gian hồ sơ", vì nó bao gồm thời gian dành cho việc thu thập thông tin hồ sơ.

Thời gian dành cho việc phân tích cú pháp truy vấn và xây dựng kế hoạch thực thi:

Đây là thời gian dành cho việc tìm các kết quả phù hợp mờ trong từ điển:

Và cuối cùng, bạn đã bao giờ tự hỏi ý nghĩa của việc xây dựng một kết quả tìm kiếm chưa? Chúng ta cần tính điểm toàn văn cho mỗi tài liệu, sắp xếp chúng theo điểm, và cuối cùng là tải các trường. Với thông tin này, bạn có thể xác định các nút thắt cổ chai, thực hiện truy vấn nhanh hơn và cải thiện hiệu suất của máy chủ.

Cách bắt đầu

Chúng tôi tin rằng những khả năng mới này là yếu tố thay đổi cuộc chơi cho các nhà phát triển ứng dụng và cộng đồng Redis. Đây là cách bạn bắt đầu.

Sử dụng hình ảnh docker của bản xem trước

Để bắt đầu, bạn có thể kéo hình ảnh docker sau với thẻ:preview:

docker run -p 6379:6379 redis/redismod:preview

Ngoài ra, bạn có thể biên dịch từ các thẻ phát hành RC1 (v2.2.0 cho RediSearch, v2.0.0 cho RedisJSON) trên cả hai kho và tải chúng vào Redis.

Sau khi thiết lập và chạy, bạn có thể thử tất cả các lệnh trên hoặc với hướng dẫn bắt đầu nhanh này. Chúng tôi cũng sẽ ra mắt một loạt blog về RedisMart , một ứng dụng bán lẻ trực tuyến mà chúng tôi đã giới thiệu trong bài phát biểu quan trọng của RedisConf 2021. RedisMart tận dụng RediSearch và RedisJSON được triển khai theo cách phân phối theo địa lý để mang lại trải nghiệm bán lẻ trực tuyến tốt nhất. Trong loạt bài này, chúng tôi sẽ hướng dẫn bạn từng bước về cách chúng tôi xây dựng ứng dụng này.

Phát triển bằng các phiên bản mới nhất của các ứng dụng khách tương thích

Danh sách khách hàng sau đây hiện đang được nâng cấp để bạn có thể sử dụng các tính năng mới với trải nghiệm tốt dành cho nhà phát triển. Kiểm tra các bản phát hành mới nhất và / hoặc các yêu cầu kéo (tại thời điểm này hầu hết chúng đang hỗ trợ phiên bản xem trước trên các nhánh chính).

RedisJSON RediSearch
Node.js redis-modules-sdk redis-modules-sdk
Java JredisJSON JRediSearch
.NET NRedisJSON NRediSearch
Python redisjson-py redisearch-py

Tham gia cộng đồng

Chúng tôi hoan nghênh mọi phản hồi, báo cáo lỗi, yêu cầu tính năng trong khi chúng tôi làm việc hướng tới Tính khả dụng chung. Để lại phản hồi trên các trang web tài liệu hoặc trong kho github của RediSearch (trên Github) hoặc RedisJSON (trên Github) hoặc liên hệ với chúng tôi trên Discord.