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

Những mẩu tin ngắn hàng ngày dành cho bạn
  • Tin tức sáng sớm, mọi người còn nhớ vụ kiện của Ryan Dahl - hay nói đúng hơn là của nhóm Deno với Oracle về cái tên JavaScript không?

    Oracle đã phản hồi rằng họ không từ bỏ cái tên JavaScript đâu 🫣

    https://x.com/deno_land/status/1876728474666217739

    » Xem thêm
  • Mọi người nghỉ tết sớm rồi hay sao á? Nhiên cái nguyên tuần nay traffic giảm hẳn luôn 😳. Một mình tuôi nói kể cũng buồn, ai đi ngang qua đọc được thì thả một "còm men" cho vui cửa vui nhà nha. Nói gì cũng được vì ẩn danh cả mà 😇🔥

    » Xem thêm
  • Có người hỏi mình là cập nhật tin tức ở đâu mà nhanh thế, hay là kiếm ra được mấy cái tools, mấy cái projects... ở đâu mà nhiều thế? Thì có một nguồn xa tận chân trời mà gần ngay trước mắt đó chính là trang Github Trending này đây.

    Trang này thống kê lại các kho lưu trữ đang có lượt "star" nhiều nhất theo ngày/tuần/tháng. Nó còn xem theo được ngôn ngữ cơ, mà mỗi ngôn ngữ lại kiểu như một chủ đề á. Ví dụ Python thì hót rần rần về AI, LLMs..., Rust thì bao tools siêu mạnh, còn Go thì... đồ chơi liên tục 😁. Trong khi JavaScript 🫣😑

    » 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

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên 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
Bấm hoặc cuộn mạnh để sang bài mới