Thiết lập gợi ý tìm kiếm (auto-complete) bằng Redisearch

Thiết lập gợi ý tìm kiếm (auto-complete) bằng Redisearch

Tin ngắn hàng ngày dành cho bạn
  • Rust sinh ra để tái định nghĩa nhiều thứ. Trong đó chắc phải kể đến JavaScript. Từ đầu năm đến giờ các công cụ làm từ Rust mà để cho JavaScript dùng đếm sương sương cũng vài ba cái rồi. Mới đây nhất là Oxc.

    Oxc là một công cụ phân tích cú pháp (parser), kiểm tra lỗi (lint), định dạng (formatter), chuyển đổi (transformer), minifier... tất cả đều được viết bằng Rust, trong một công cụ duy nhất.

    Mặc dù vẫn đang trong quá trình xây dựng nhưng thử nhìn điểm hiệu năng của nó so với swc hoặc eslint mà xem 🫣

    » Xem thêm
  • Mấy hôm nay, à mà cũng không hẳn, do sự kiện WWDC vừa rồi nên Apple lại bị dân cư mạng mang ra bàn tán rằng rốt cục thì các tính năng AI của họ đang ở đâu? Trong khi các hãng khác đang lao mình vào việc mang AI lên thiết bị, phần mềm của họ thì Apple lại đang có vẻ... không quan tâm lắm.

    Thậm chí mới đây các nhà nghiên cứu của Apple cho rằng các mô hình LLM sẽ "sụp đổ hoàn toàn về độ chính xác" khi được đưa ra các vấn đề cực kỳ phức tạp. Chỉ ra rằng suy luận chỉ là huyễn hoặc thì ngay lập tức đã có nhiều bài phản bác nghiên cứu này. Một lần nữa cho thấy rằng Apple đang suy nghĩ điều gì với AI trên thiết bị của họ?

    Mình thì nghĩ đơn giản thôi, Apple có vẻ đang gặp khó khăn với việc tạo ra AI cho riêng họ. Tức là khó khăn ngay từ đoạn thu thập dữ liệu để đào tạo rồi. Họ luôn tỏ ra tôn trọng quyền riêng tư của người dùng nên chẳng lẽ lại lên mạng đi xào nấu dữ liệu ở khắp nơi, hoặc "chôm" dữ liệu dưới máy người dùng lên? Chắc chắn, họ cũng không muốn cung cấp thêm dữ liệu người dùng cho các bên thứ 3 như OpenAI.

    Nhưng nhờ những khó khăn này biết đâu họ lại tìm ra được hướng đi mới. Ai cũng chọn phần dễ thì gian khổ để phần cho ai 😁. À mình không phải là "fan" của Apple, chỉ là thấy cái nào phù hợp thì dùng thôi 🤓

    » Xem thêm
  • Người "nhạy cảm" với markdown đó là khi thấy một thư viện tạo khung soạn thảo mới là nhảy ngay vào xem nó có gì mới. Milkdown/milkdown là một ví dụ.

    Xem thử thì thấy ổn phết mọi người ạ. Vài nữa thử tích hợp vào opennotas xem sao. Mang tiếng là ứng dụng ghi chú hỗ trợ markdown cơ mà cái thư viện tiptap nó không chịu làm thêm phần hỗ trợ markdown 😩. Dùng thư viện ngoài thì vẫn chưa ngon cho lắm.

    » Xem thêm

Vấn đề

Tìm kiếm là một trong những tính năng quan trọng trên bất kì trang web nào. Thông qua chức năng tìm kiếm, người dùng có thể dễ dàng khám phá nội dung trang web của bạn hơn.

Có nhiều cách để cung cấp cho người dùng tính năng tìm kiếm. Chẳng hạn như chúng ta phân danh mục cho họ lựa chọn hoặc đặt các thẻ (tags) để sàng lọc nội dung, hoặc cung cấp một ô tìm kiếm cho họ thoải mái nhập nội dung tuỳ ý.

Ngày nay trải nghiệm người dùng ngày càng được đặt lên hàng đầu, nhiệm vụ của người quản trị là phải làm sao cho người dùng ít phải động tay động chân nhất. Nhất là không phải để họ phải phân vân khi sử dụng một tính năng nào đó trên trang web, vì điều đó sẽ tăng tỉ lệ khách hàng rời đi. Nếu bạn đã cung cấp tính năng tìm kiếm thì liệu có thể làm gì để người dùng cảm thấy tìm kiếm hữu ích hơn?

Lấy một ví dụ trang web của bạn bán rất nhiều phụ kiện thời trang và một trong số đó đang là sản phẩm trending có tên như "đồng hồ thời trang", "đồng hồ siêu nhân"... Vậy thì làm sao khi người dùng chỉ cần nhập "đồng" thì lập tức những từ khoá bạn thiết lập từ trước sẽ hiện ra gợi ý cho người dùng?

Auto-completion

Auto-completion

Auto-completion là một tính năng mà Redisearch cung cấp để gợi ý tìm kiếm. Cách hoạt động của Auto-completion rất đơn giản đó là bạn tạo ra một chỉ mục dành riêng cho việc gợi ý ra những cụm từ phù hợp với từ khóa cần tìm kiếm.

RediSearch cũng cho phép gợi ý mờ, nghĩa là bạn có thể nhận được kết quả cho từ khoá ngay cả khi người dùng mắc lỗi chính tả. Điều này đạt được bằng cách sử dụng Levenshtein Automaton, cho phép tìm kiếm hiệu quả trong Khoảng cách Levenshtein. Sau đó, các đề xuất được tính trọng số dựa trên cả điểm số (score) và khoảng cách Levenshtein của chúng so với từ khoá do người dùng nhập.

Tuy nhiên, việc tìm kiếm mờ (đặc biệt là các tiền tố rất ngắn) sẽ cho ra một số lượng lớn các gợi ý. Trên thực tế, tìm kiếm mờ cho bất kỳ chữ cái đơn lẻ nào sẽ duyệt qua toàn bộ từ điển, vì vậy bạn nên sử dụng tính năng này một cách cẩn thận, vì sử dụng chúng phải đánh đổi tốc độ tìm kiếm cũng như tài nguyên máy chủ.

Cách thiết lập

Chúng ta chỉ cần tạo ra các chỉ mục dùng cho tính năng gợi ý, xác định điểm (score) để ưu tiên mức độ hiển thị kết quả cho kết quả tìm kiếm.

Ví dụ trong blog của tôi có các bài viết liên quan đến chủ đề Node.js, một trong số đó là các bài "node.js là gì, node.js event loop, node.js tự học..." nên tôi muốn khi người dùng nhập vào tìm kiếm "node.js" thì nó sẽ gợi ý ra những cụm từ trên.

127.0.0.1:6379> FT.SUGADD article "node.js là gì" 100
(integer) 1

127.0.0.1:6379> FT.SUGADD article "node.js event loop" 200
(integer) 2

127.0.0.1:6379> FT.SUGADD article "node.js tự học" 300
(integer) 3

Sau đó thử tìm kiếm gợi ý:

127.0.0.1:6379> FT.SUGGET article "node.js" MAX 5 WITHSCORES
node.js tự học
106.06601715087891
node.js event loop
57.735027313232422
node.js là gì
37.79644775390625

MAX 5 là lấy 5 kết quả đầu tiên, WITHSCORES là hiển thị điểm, điểm càng cao thì càng được ưu tiên. Sở dĩ thứ tự kết quả như trên là lúc thêm suggest tôi đã xác định điểm của "node.js tự học" là cao nhất (300) rồi giảm dần cho các cụm từ sau.

Suggest hỗ trợ tìm kiếm khi người dùng nhập sai ký tự. Ví dụ "nodejs", "nopejs", "nope.js"... nhờ vào thuật toán tính toán khoảng cách Levenshtein. Tuy nhiên đi cùng với đó là vấn đề hiệu suất sẽ giảm đi đôi chút. Để áp dụng chỉ cần thêm từ khóa FUZZY vào trong câu truy vấn.

127.0.0.1:6379> FT.SUGGET article "nope.js" FUZZY MAX 5 WITHSCORES
node.js tự học
106.06601715087891
node.js event loop
57.735027313232422
node.js là gì
37.79644775390625

Auto-completion hiện tại chỉ hỗ trợ từ khóa prefix, tức là chỉ gợi ý được nếu từ khóa đầu vào là những từ ở đầu các cụm từ. Như ví dụ trên, redis chỉ gợi ý được khi tìm kiếm "no", "node", "node.js"... chứ không thể tìm kiếm các từ "event", "là"... Hy vọng các bản cập nhật tiếp theo Auto-completion sẽ hỗ trợ tìm kiếm ở bất kì vị trí nào trong cụm từ.

Để nghiên cứu nhiều hơn bạn có thể xem thêm ở Redis Auto-completion.

Tổng kết

Gợi ý tìm kiếm là tính năng hữu ích mà rất nhiều trang web đang sử dụng. Thông qua cách đó giúp nâng cao trải nghiệm người dùng dựa trên những từ khoá mà người dùng quan tâm để gợi ý đến một cụm từ cụ thể hơn. Những cụm từ đó có thể là "hot trend" hay nội dung chủ lực của website của bạn mong muốn được người dùng quan tâm, khám phá.

Auto-completion của Rediseach còn mang lại nhiều lợi ích hơn dựa vào tính sáng tạo của bạn. Chẳng hạn tự động hoá chỉ mục tìm kiếm liên tục cập nhật các cụm từ gợi ý dựa theo dữ liệu tìm kiếm thu thập được của người dùng để tạo thành "hot trend" tìm kiếm.

Cao cấp
Hello

5 bài học sâu sắc

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (1)

Nội dung bình luận...
Avatar
Thành Đỗ2 năm trước

Nghĩa là mình vẫn phải tạo một index rồi thêm data tìm kiếm vào chứ nó không dựa theo data sẵn có được à bạn

Trả lời
Avatar
Xuân Hoài Tống2 năm trước

Đúng rồi bạn ơi, tính năng này chỉ hỗ trợ tạo data trong index để hỗ trợ suggest thôi