Làm chức năng tìm kiếm cho web

Chào ạ,
Em đang làm website có chức năng tìm kiếm (bao gồm tìm bằng keyword và các checkbox, radio button trên thanh lọc, thanh menu) các giá trị tìm kiếm là các thuộc tính của sản phẩm
Em có 2 hướng để làm như sau :
Cách 1 : gắn thẻ cho sản phẩm, giống như hashtag trên facebook. bằng cách thêm một bảng hashtag

+-----+--------+-------+-----+
| ID  | Name   | Price | tag |
+-----+--------+-------+-----+
| 001 | Apple  | 300$  | 1   |
+-----+--------+-------+-----+
| 002 | Orange | 499$  | 23  |
+-----+--------+-------+-----+
| 003 | Lemon  | 500$  | 124 |
+-----+--------+-------+-----+
+-----+---------------+
| tag | name          |
+-----+---------------+
| 1   | xuất xứ Mỹ    |
+-----+---------------+
| 2   | Khuyến mãi    |
+-----+---------------+
| 3   | giao tận nơi  |
+-----+---------------+
| 4   | giá trên 400$ |
+-----+---------------+

lấy mã tag (1,2,3,4) này gán cho các thẻ HTML trên giao giao diện VD < button value="4">Sản phẩm giá trên 400$< button> rồi trong code backed cũng lấy giá trị này để xử lý cũng như truy vấn database. Nhìn vào mã tag này là biết được người người dùng muốn tìm sản phẩm nào !

Cách 2 : Không thêm bảng phụ tag mà viết function search bằng câu lệnh SQL, cho join hết tất cả các bảng lại với nhau rồi “quét” hết tất cả các cột theo giá trị cần tìm.

Theo em thì cách 1 có nhực điểm là tạo thêm bảng phụ không cần thiết trong database, còn cách 2 thì có thể tốn thời gian truy vấn, giảm hiệu năng của server hoặc có thể không đáng kể.

Cho em hỏi ở ngoài đời thực, trong các dự án thực tế thì người ta triển khai chức năng search này như thế nào ? em cảm ơn !

Người ta sử dụng một Search Engine chuyên dụng phục vụ cho việc tìm kiếm chứ không tìm kiếm trực tiếp vào database. Giữa Search Engine và database có cái connector để có thể trao đổi được dữ liệu.

8 Likes

Cảm ơn bác đã phản hồi, Với quy mô làm đồ án môn học thì chọn cách nào trong 2 cách trên vậy bác ?

Đồ án môn học thì cậu chọn cách nào cũng được, tùy vào bài toán của cậu. Trong bài toán của cậu, cách 2 tốt hơn, do cách 1 rất không mềm dẻo (nếu 1 sản phẩm có nhiều tag thì sao? Và khi 1 sản phẩm bị chuyển tag thì sao? Và tiêu chí nào để cậu đánh tag cho từng sản phẩm?).
Cơ mà, join hết các bảng với nhau không ổn lắm đâu. Cậu chỉ cần join bảng phù hợp, và có index phù hợp là được.

5 Likes

Làm đồ án thì lượng dữ liêu thường ít, và database cũng đơn giản, nên dù có viết query phức tạp, join tùm lum thì cũng không ảnh hưởng lắm đến tốc độ search.

Bạn có thể xài ajax để search ngay lúc user input luôn cũng được, query thẳng vô database luôn cũng xong.

Có 1 cách nữa, là bạn có thể load dữ liệu từ database ra json để đó sẵn, user search gì thì cứ lấy thông tin từ file json đó. JSON có thể lấy full data từ databse hoạc lấy 1 phần thông tin (như ID, tag để sau đó query thẳng vô database cho nhanh cũng được). Cách này nghe ngu ngu, nhưng với những thông tin không cần bảo mật, không sợ crawl, thì cũng ngon lắm, handle dữ liệu vài triệu records vẫn ngon nha. Mà quan trọng là nó không khó làm.

7 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?