<![CDATA[Latest posts for the topic "Thảo luận về cách phương pháp tìm kiếm trong Database"]]> /hvaonline/posts/list/23.html JForum - http://www.jforum.net Thảo luận về cách phương pháp tìm kiếm trong Database và record nào có số lượng xuất hiện cao nhất thì sẽ lên đầu (khả năng sắp xếp này nếu được thì tuyệt nhưng không được cũng không sao) b. Các record có chứa chuỗi "con" hoặc "vit" hoặc "bau" và record nào có số lượng xuất hiện cao nhất thì sẽ lên đầu (khả năng sắp xếp này nếu được thì tuyệt nhưng không được cũng không sao) Để thực hiện điều trên tôi đã nghĩ tới 2 giải pháp: 1. Dùng fulltext trong SQL nhưng không khả thi do không thể sắp xếp theo thứ tự độ ưu tiên a, b được. Có thể do trình độ hiểu biết có hạn nên chưa tìm được cách sắp xếp, nếu có bạn nào biết xin vui lòng chia xẻ hướng dẫn cho tôi. 2. Tôi thiết kế thêm 2 bảng, 1 bảng chứa các từ khóa (ví dụ: con, vit, bau) và bảng thứ 2 chứa ID của từ khóa và ID của Record chứa từ khóa đó. Cụ thể: tblKeyword(K_ID, K_Word) và tblRecordID(R_ID, R_KeywordID, R_RecordID, R_Hits) Với phương pháp này thì có vẻ giai quyết được ổn thỏa các yêu cầu trên khi ta JOIN 2 bảng này với nhau và với điều kiện là K_Word = từ khóa cần tìm (Sau khi Split chuỗi từ cần tìm) và ORDER By tổng số R_Hits của một từ khóa. Nhưng phương án này có nhược điểm là với khoảng 500.000 từ khóa (K_Word) trong từ điển Tiếng Việt sẽ tương đương với 500.000 record trong bảng tblKeyword. Và với mỗi record bản tin khoảng 10.000 từ sẽ sinh ra khoảng 6-7000 record trong tblRecordID (do loại bỏ các từ giống nhau) thì chỉ cần sau một thời gian số record bản tin lên đến khoảng 2-30.000 record thì sẽ sinh ra khoảng 20.000.000 record trong bảng tblRecordID. Đó thật sự là một con số quá lớn. Do vậy tôi rất hy vọng trong các bạn có những người đã từng phải giải quyết những vấn đề tương tự như trên có ý kiến đóng góp, chia sẻ. Rất cám ơn các bạn đã đọc tin này. Mong chờ sự hồi âm của tất cả các bạn. PS: Tôi hiện đang dùng CSDL MS SQL 2000 và trang web chạy trên nền ASP. Server dùng riêng nên hoàn toàn có thể cấu hình theo ý muốn.]]> /hvaonline/posts/list/6982.html#40622 /hvaonline/posts/list/6982.html#40622 GMT Re: Thảo luận về cách phương pháp tìm kiếm trong Database /hvaonline/posts/list/6982.html#181430 /hvaonline/posts/list/6982.html#181430 GMT Re: Thảo luận về cách phương pháp tìm kiếm trong Database /hvaonline/posts/list/6982.html#181434 /hvaonline/posts/list/6982.html#181434 GMT Thảo luận về cách phương pháp tìm kiếm trong Database

soccon wrote:
Tôi hiện đang gặp một vấn đề, rất mong mọi người quan tâm cùng thảo luận. Hiện tôi phải làm một công cụ tìm kiếm trong CSDL cho một trang web với yêu cầu là người sử dụng có thể tìm được gần đúng hoặc chính xác cho yêu cầu của mình. Ví dụ: 1. Nếu người sử dụng nhập vào ô tìm kiếm chuỗi / "con vit bau" / (có dấu nháy) thì phải hiện thị cho người dùng tất cả các record có chứa chuỗi "con vit bau" với thứ tự từ trên xuống các record nào xuất hiện nhiều nhất. (yêu cầu này có thể không làm cũng được, nhưng nếu có thì thật tuyệt vời) 2. Nếu người dùng nhập chuỗi / con vit bau / (không có dấu nháy) thì phải hiện thị được cho người dung tất cả những record nào có chứa những từ "con", "vit", "bau" với thứ tự từ trên xuống theo độ ưu tiên là: a. Các record có chứa chuỗi "con vit bau" đứng liền nhau theo thứ tự "con vit bau" và record nào có số lượng xuất hiện cao nhất thì sẽ lên đầu (khả năng sắp xếp này nếu được thì tuyệt nhưng không được cũng không sao) b. Các record có chứa chuỗi "con" hoặc "vit" hoặc "bau" và record nào có số lượng xuất hiện cao nhất thì sẽ lên đầu (khả năng sắp xếp này nếu được thì tuyệt nhưng không được cũng không sao) Để thực hiện điều trên tôi đã nghĩ tới 2 giải pháp: 1. Dùng fulltext trong SQL nhưng không khả thi do không thể sắp xếp theo thứ tự độ ưu tiên a, b được. Có thể do trình độ hiểu biết có hạn nên chưa tìm được cách sắp xếp, nếu có bạn nào biết xin vui lòng chia xẻ hướng dẫn cho tôi. 2. Tôi thiết kế thêm 2 bảng, 1 bảng chứa các từ khóa (ví dụ: con, vit, bau) và bảng thứ 2 chứa ID của từ khóa và ID của Record chứa từ khóa đó. Cụ thể: tblKeyword(K_ID, K_Word) và tblRecordID(R_ID, R_KeywordID, R_RecordID, R_Hits) Với phương pháp này thì có vẻ giai quyết được ổn thỏa các yêu cầu trên khi ta JOIN 2 bảng này với nhau và với điều kiện là K_Word = từ khóa cần tìm (Sau khi Split chuỗi từ cần tìm) và ORDER By tổng số R_Hits của một từ khóa. Nhưng phương án này có nhược điểm là với khoảng 500.000 từ khóa (K_Word) trong từ điển Tiếng Việt sẽ tương đương với 500.000 record trong bảng tblKeyword. Và với mỗi record bản tin khoảng 10.000 từ sẽ sinh ra khoảng 6-7000 record trong tblRecordID (do loại bỏ các từ giống nhau) thì chỉ cần sau một thời gian số record bản tin lên đến khoảng 2-30.000 record thì sẽ sinh ra khoảng 20.000.000 record trong bảng tblRecordID. Đó thật sự là một con số quá lớn. Do vậy tôi rất hy vọng trong các bạn có những người đã từng phải giải quyết những vấn đề tương tự như trên có ý kiến đóng góp, chia sẻ. Rất cám ơn các bạn đã đọc tin này. Mong chờ sự hồi âm của tất cả các bạn. PS: Tôi hiện đang dùng CSDL MS SQL 2000 và trang web chạy trên nền ASP. Server dùng riêng nên hoàn toàn có thể cấu hình theo ý muốn. 
Tôi thấy bạn dùng SQL full text search function là đúng hướng rồi. Bạn có thể sắp xếp bằng cách Order by rank trong search query của bạn. Còn khi mà người dùng nhập từ khóa không dấu nháy thì bạn tách ra 2 query, query bạn return những từ khóa trong dấu nháy (bạn thêm vào), query thứ 2 thì cho từ khóa không dấu nháy. MSSQL 2000 thì không có optimise performence bằng SQL 2005 đâu. Mình khuyên bạn nên xem lại Full Text Search Engine trên MSDN với lại tính chuyện upgrade lên SQL Sever 2005 đi. ]]>
/hvaonline/posts/list/6982.html#181449 /hvaonline/posts/list/6982.html#181449 GMT