[Discussion] Thảo luận về cách phương pháp tìm kiếm trong Database |
08/02/2007 07:41:25 (+0700) | #1 | 40622 |
soccon
Member
|
0 |
|
|
Joined: 23/10/2005 17:18:03
Messages: 28
Offline
|
|
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" [i]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)[/i]
b. Các record có chứa chuỗi "con" hoặc "vit" hoặc "bau" [i]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)[/i]
Để 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. |
|
|
|
|
[Question] Re: Thảo luận về cách phương pháp tìm kiếm trong Database |
22/05/2009 11:30:34 (+0700) | #2 | 181430 |
lequi
Member
|
0 |
|
|
Joined: 29/04/2007 18:13:32
Messages: 77
Offline
|
|
chủ đề này rất hay và cũng là chủ đề em đang vướng mắc, mong ai có thể giải đáp |
|
|
|
|
[Question] Re: Thảo luận về cách phương pháp tìm kiếm trong Database |
22/05/2009 12:34:28 (+0700) | #3 | 181434 |
myquartz
Member
|
0 |
|
|
Joined: 04/01/2005 04:58:30
Messages: 563
Offline
|
|
20 triệu ko là gì với các hệ CSDL mạnh, ví dụ Oracle, MS SQL hoặc MySQL/Postgres. Đối với thao tác tìm kiếm/cập nhật bản ghi đơn lẻ (có primary/unique index) sẽ nhanh chóng. Nhưng sẽ tệ hại nếu dùng lệnh mang tính tác động tới 1 range.
Tôi từng làm việc với bảng có tới 400 triệu row kia, lơ mơ gõ nhầm lệnh tạo lại index hoặc nếu phải xoá đi 10 triệu trong 400 đó, thì chịu khó chờ vài tiếng đồng hồ dù máy tính rất mạnh (32 CPU cơ )).
Do đó, nếu làm với bảng to vậy, nên cẩn thận với index và kiểm tra kỹ từng câu lệnh SQL của mình, sẽ không sao cả. |
|
|
|
|
[Question] Thảo luận về cách phương pháp tìm kiếm trong Database |
22/05/2009 17:51:31 (+0700) | #4 | 181449 |
qtra004
Member
|
0 |
|
|
Joined: 19/04/2004 22:36:57
Messages: 298
Location: Kiwiland
Offline
|
|
[quote=soccon]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" [i]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)[/i]
b. Các record có chứa chuỗi "con" hoặc "vit" hoặc "bau" [i]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)[/i]
Để 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.[/quote]
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. |
|
Carpe diem quam minimum credula postero |
|
|
|
|
|
|
Users currently in here |
1 Anonymous
|
|
Powered by JForum - Extended by HVAOnline
hvaonline.net | hvaforum.net | hvazone.net | hvanews.net | vnhacker.org
1999 - 2013 ©
v2012|0504|218|
|
|