1 Lọc và phân loại dữ liệu trên Web Ứng dụng xây dựng hệ quản trị nội dung PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP 1 Mục đích nội dung của ĐATN Xây dựng các luật và thuật toán để lọc và phân loại dữ liệu[.]
Trang 1Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP
1 Mục đích nội dung của ĐATN
Xây dựng các luật và thuật toán để lọc và phân loại dữ liệu trên Web, từ đó xây dựng mộtứng dụng về hệ quản trị nội dung(CMS), cụ thể là hệ thống tìm kiếm việc làm trực tiếp
2 Các nhiệm vụ cụ thể của ĐATN
Xây dựng các luật để lọc dữ liệu từ các trang web
Sử dụng công cụ Lucene để phân loại dữ liệu đã được lọc dựa trên các từ khóa
Thiết kế, thử nghiệm và triển khai ứng dụng
3 Lời cam đoan của sinh viên:
Tôi - NGUYỄN HÙNG ANH - cam kết ĐATN là công trình nghiên cứu của bản thân tôi
dưới sự hướng dẫn của thầy giáo Ths Thạc Bình Cường và đồng hướng dẫn Ths Lương Thanh Bình
Các kết quả nêu trong ĐATN là trung thực, không phải là sao chép toàn văn của bất kỳcông trình nào khác
Hà Nội, ngày 20 tháng 5 năm2008
Tác giả ĐATN
Nguyễn Hùng Anh
4 Xác nhận của giáo viên hướng dẫn về mức độ hoàn thành của ĐATN và cho phép bảovệ:
Hà Nội, ngày tháng 5 năm2008
Giáo viên hướng dẫn
Ths Thạc Bình Cường
Trang 2TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆP
Hiện nay khi xã hội ngày càng phát triển, nhu cầu việc làm của con người trở nên bứcthiết Các nhà tuyển dụng thì mong muốn tìm được các ứng viên phù hợp với công việccủa mình, trong khi những người tim việc cũng muốn tìm những công việc phù hợp vớinăng lực của mình Nhưng để các nhà tuyển dụng và người tìm việc đến với nhau quả thậtkhông dễ dàng, nhất là trong thời buổi thông tin có quá nhiều như hiện nay
Muốn giải quyết vấn đề trên, ta cần có một hệ thống trung gian phục vụ cho việc lấycác thông tin công việc của các nhà tuyển dụng và truyền đạt các nội dung đó đến nhữngngười tìm việc
Đồ án này đã xây dựng và cài đặt được hệ thống quản trị nội dung(CMS) mà cụ thể là
hệ thống tìm kiếm việc làm trực tiếp bao gồm hai chức năng chính đó là thu thập thông tin
về công việc từ các nhà tuyển dụng và phân loại các công việc đó để phục vụ nhu cầu tìmkiếm việc làm của các ứng viên Để thực hiện điều này thì đồ án đã tập trung xây dựng cáctập luật để lọc thông tin mà cụ thể là thông tin về nội dung công việc từ các trang web đăngtin tuyển dụng, đồng thời tìm hiểu và vận dụng công cụ đánh chỉ mục và tìm kiếm Lucene
để phân loại thông tin đã lọc được dựa trên các từ khóa
Trang 3Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
ABSTRACT OF THESIS
In the developing world of today, there is a huge need for job hunting amongs peopleand people While recruiters want to employ suitable candidates for their vacancies, jobseekers also hope to find good jobs that they have ability to do
However, there is a lot of difficulties in matching these job seekers with recruitersseeking such suitabe employees, especially in the world of so much information thatavailable
A job search system to connect recruiters to job seekers is needed to solve theproblem This tool gets information from recruiters then supply them to job seekers
This thesis has built and set up Content Management System(CMS), namedsupplydirect system search with two main following functions The first is gatheringinformation from recruiters about jobs and requirements The second is sorting these jobs
by what candidates want In order to do so, the essay focuses on build the rules that scrapesinformation about jobs from job search sites It search and apply the tool called Lucene tosorted information based on key words
Trang 4MỤC LỤC
PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP 1
TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆP 2
MỤC LỤC 4
DANH MỤC CÁC HÌNH VẼ 7
DANH MỤC CÁC BẢNG 8
DANH MỤC CÁC TỪ VIẾT TẮT 9
MỞ ĐẦU 11
Chương 1: Tổng quan 12
1.1 Giới thiệu chung 12
1.1.1 Hệ quản lí nội dung là gì? 12
1.1.2 Lợi ích của việc sử dụng hệ quản lí nội dung 12
1.1.3 Các sản phẩm quản lí nội dung- so sánh tính năng 14
1.1.4 Kết luận 14
1.2 Mô tả bài toàn 14
1.2.1 Vai trò của công nghệ thông tin trong việc tìm kiếm thông tin có chọn lọc 14
1.2.2 Bài toán cần xây dựng 15
1.3 Phương pháp giải quyết bài toán 15
1.3.1 Bài toán dựa trên Internet, www 15
1.3.2 Công cụ tìm kiếm Lucene 16
1.3.3 Công cụ crawler chuyên thu thập các trang web 17
Chương 2: Lọc và phân loại dữ liệu 18
2.1 Giới thiệu về các hệ thống khai thác thông tin 18
2.2 Lucene- Công cụ đánh chỉ mục và tìm kiếm 19
2.2.1 Giới thiệu về Lucene 19
2.2.1.1 Lucene làm được gì? 19
2.2.1.2 Đánh chỉ mục và tìm kiếm 20
2.2.1.2.1 Thế nào là đánh chỉ mục, tại sao nó lại quan trọng 20
2.2.1.2.2 Thế nào là tìm kiếm 20
2.2.1.3 Lucene in Action: tạo một ứng dụng mẫu 20
2.2.1.3.1 Tạo một chỉ mục 20
2.2.1.3.2 Tìm kiếm một chỉ mục 21
2.2.1.4 Tìm hiểu các lớp cơ bản trong Indexer 23
2.2.1.4.1 IndexWriter 23
2.2.1.4.2 Thư mục (directory) 23
2.2.1.4.3 Bộ phân tích (analyzer) 23
2.2.1.4.4 Bản ghi (document) 23
2.2.1.4.5 Trường(Field) 24
2.2.1.5 Tìm hiểu các lớp cơ bản trong bộ tìm kiếm 25
2.2.1.5.1 IndexSearcher 25
2.2.1.5.2 Thuật ngữ 25
2.2.1.5.3 Truy vấn 25
2.2.1.5.4 Hits 25
2.2.2 Đánh chỉ mục(Indexing) 25
2.2.2.1 Tìm hiểu quá trình đánh chỉ mục 25
2.2.2.1.1 Chuyển thành văn bản 25
2.2.2.1.2 Phân tích(analysis) 26
2.2.2.1.3 Viết chỉ mục 27
2.2.2.2 Các thao tác đánh chỉ mục cơ bản 27
2.2.2.2.1 Thêm các bản ghi vào một chỉ mục 27
2.2.2.2.2 Xóa các bản ghi ra khỏi chỉ mục 28
Trang 5Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
2.2.2.2.3 Cập nhập một bản ghi vào chỉ mục 29
2.2.2.3 Độ tin cậy Các bản ghi và các Trường 31
2.2.2.4 Kiểm soát quá trình đánh chỉ mục 31
2.2.2.4.1 Điểu chỉnh hiệu năng đánh chỉ mục 31
2.2.2.4.2 Đánh chỉ mục trong bộ nhớ: RAMDirectory 31
2.2.3 Tìm kiếm trong ứng dụng 34
2.2.3.1 Thực thi một chức năng tìm kiếm đơn giản 34
2.2.3.1.1 Tìm kiếm với thuật ngữ cụ thể 35
2.2.3.1.2 Phân tích(parse) một truy vấn được nhập vào bởi người dùng:
QueryParser 35
2.2.3.2 Sử dụng IndexSearcher 37
2.2.3.2.1 Làm việc với Hits 38
2.2.3.3 Tạo các đối tượng truy vấn 38
2.2.3.3.1 Tìm kiếm bằng thuật ngữ: TermQuery 38
2.2.3.3.2 Nối các truy vấn: BooleanQuery 39
2.2.3.3.3 Tìm kiếm theo cụm từ: PhraseQuery 39
2.2.3.3.4 Tìm kiếm theo Widcard: WildcardQuery 40
2.2.3.3.5 Tìm kiếm dựa vào các thuật ngữ tương đồng: FuzzyQuery 41
2.2.4 Phân tích 41
2.2.4.1 Sử dụng các bộ phân tích 42
2.2.4.1.1 Phân tích trong quá trình đánh chỉ mục 42
2.2.4.1.2 Phân tích QueryParser 43
2.2.4.2 Tìm hiểu bộ phân tích 43
2.2.4.2.1 Thế nào là từ tố (token) 43
2.2.4.2.2 Các bộ phân tích 44
2.2.4.3 Sử dụng các bộ phân tích có sẵn 45
2.1.4.3.1 StopAnalyzer 46
2.2.4.3.2 StandardAnalyzer 46
Chương 3: Phân tích hệ thống 47
3.1 Giới thiệu về hệ thống cần xây dựng 47
3.1.1 Giới thiệu chung về hệ thống 47
3.1.2 Mô hình hệ thống 47
3.2 Phương thức thực hiện chương trình 50
3.2.1 Giới thiệu cách xử lý đa luồng 50
3.2.2 Thiết kế 50
3.2.3 Phần tử công việc (Work Item) 51
3.2.4 Hàng làm việc (WorkQueue) 51
3.2.5 Luồng tài nguyên công việc (WorkThreadPool) 52
3.2.6 Quản lý ngoại lệ 53
3.2.7 Ứng dụng của xử lý đa luồng vào bài toán tìm việc trực tiếp 54
3.2.7.1 Lấy chi tiết link từ các trang web 54
3.2.7.2 Lấy nội dung của công việc từ một trang HTML 55
3.2.7.3 Phân loại dữ liệu 56
Chương 4: Thiết kế hệ thống 57
4.1 Thiết kế giao diện cho hệ thống 57
4.1.1 Cấu trúc của trang(sitemap) 57
4.1.2 Giao diện cho người tìm việc 58
4.1.2.1 Giao diện chính 58
4.1.2.2 Trang chủ 58
4.1.2.3 Đăng ký, đăng nhập, thay đổi mật khẩu 60
4.1.3 Giao diện cho các nhà tuyển dụng 61
Trang 64.1.3.1 Quản lý thông tin về công ty 61
4.1.3.2 Quản lý các chi nhánh của công ty 61
4.1.3.3 Tạo một chi nhánh mới 62
4.2 Thiết kế cơ sở dữ liệu 62
4.2.1 Thiết kế các quan hệ trong hệ thống 62
4.2.1.1 Quản lý người dùng 62
4.2.1.2 Thông tin về vị trí 63
4.2.1.3 Các luật lọc 64
4.2.1.4 Phân loại công việc 64
4.2.2 Thiết kế các lớp, các bảng 65
4.2.2.1 Bảng lưu thông tin người tìm việc 65
4.2.2.2 Bảng lưu thông tin danh sách công việc 66
4.2.2.3 Bảng lưu các công việc và thông tin liên quan sau khi phân loại (Web_JobPosting) 67
4.2.2.4 Bảng lưu các tập luật(Scrape_FieldScrapeRule) 68
4.2.2.5 Bảng lưu các từ khóa 69
Chương 5: Cài đặt hệ thống- kết quả thu được 70
5.1 Cài đặt và triển khai thử nghiệm ứng dụng 70
5.1.1 Cài đặt và triển khai phần mềm tìm kiếm việc làm trực tiếp 70
5.1.2 Cài đặt ứng dụng web cho hệ thống tìm kiếm việc làm 70
5.2 Một số kết quả chương trình 71
5.2.1 Kết quả của phần xử lý 71
5.2.2 Các dịch vụ cho người quản trị(admin) 72
5.2.3 Các dịch vụ cho người tìm việc 73
Chương 6: Đánh giá và hướng phát triển 75
6.1 Tổng hợp đánh giá các kết quả 75
6.2 Hướng phát triển 75
Chương 7: Tài liệu tham khảo 76
Trang 7Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
DANH MỤC CÁC HÌNH VẼ
Hình 1: Các ứng dụng tiêu biểu tích hợp Lucene 19
Hình 2: Đánh chỉ mục với Lucene chia thành 3 thao tác: chuyển dữ liệu thành văn bản, phân tích dữ liệu đó và lưu chúng vào chỉ mục(index) 26
Hình 3 : Quá trình khởi tạo bộ đệm 31
Hình 4: Một ứng dụng đa luồng sử dụng nhiều RAMDirectory cho việc đánh chỉ mục song song 34
Hình 5: Luồng từ tố với thông tin vị trí và độ dài từ tố(offset) 44
Hình 6: Mô hình hệ thống cần xây dựng 48
Hình 7: Xử lý kiểu đường ống 51
Hình 8: Cấu trúc của trang 57
Hình 9: MainNavigation 58
Hình 10: Trang chủ 59
Hình 11: Đăng ký đăng nhập, thay đổi mật khẩu 60
Hình 12: Quản lý thông tin về công ty 61
Hình 13: Quản lý các chi nhánh công ty 61
Hình 14: Tạo chi nhánh mới 62
Hình 15: Thông tin về vị trí 63
Hình 16: Các luật lọc 64
Hình 17: Phân loại công việc 64
Hình 18: Các dịch vụ cho người quản trị hệ thống 73
Hình 19: Các dịch vụ mà người tìm việc được cung cấp 74
Trang 8DANH MỤC CÁC BẢNG
Bảng 1 So sánh các tính năng của các hệ CMS phổ biến 14
Bảng 2 Các đặc trưng của trường 24
Bảng 3 Các lớp API của Lucene 35
Bảng 4 Ví dụ về các biểu thức mà QueryParser xử lý 37
Bảng 5 Các phương thức tìm kiếm chính của IndexSearcher 38
Bảng 6 Phương thức Hits cho hiệu quả truy xuất kết quả tìm kiếm 38
Bảng 7 Các bộ phân tích chính trong Lucene 46
Bảng 8 Bảng lưu thông tin người tìm việc 65
Bảng 9 Bảng lưu thông tin danh sách công việc 66
Bảng 10 Bảng lưu công việc sau khi phân loại 67
Bảng 11 Bảng lưu các tập luật 68
Bảng 12 Bảng các từ khóa 69
Trang 9Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
DANH MỤC CÁC TỪ VIẾT TẮT
VIẾT TẮT TỪ GỐC Ý NGHĨA
CSDL Cơ Sở Dữ Liệu Cơ sở dữ liệu
XML Extensible Markup Language Ngôn ngữ định dạng mở rộng URL Uniform Resource Locator
UDDI Universal Description
Discovery and Integration Mô tả, tích hợp và tìm kiếm toàn cầu WSDL Web Service Description
Language
Ngôn ngữ đặc tả Web service
HTML Hyper Text Markup
Languege Ngôn ngữ đánh dấu văn bản CMS Content Management
System
Hệ quản trị nội dung
Trang 10
LỜI CẢM ƠN
Để có thể hoàn thành tốt đồ án này, trước hết cho em gửi lời cảm ơn chân
thành nhất đến thầy giáo, Ths.Thạc Bình Cường –bộ môn Công nghệ phần mềm,
khoa Công nghệ thông tin, Trường đại học Bách khoa Hà nội – người đã giànhnhiều tâm huyết, thời gian hướng dẫn, chỉ bảo em trong suốt thời gian làm đồ án
Em cũng xin gửi lời cảm ơn chân thành đến cô giáo đồng hướng dẫn
Ths.Lương Thanh Bình người đã rất nhiệt tình hướng dẫn em trong thời gian thực
tập tốt nghiệp và làm đồ án, những ý kiến của cô đã góp phần không nhỏ để em xâydựng nên đồ án này
Em xin cảm ơn các thầy cô trong khoa Công nghệ thông tin và các thầy côtrong trường Đại học Bách Khoa Hà Nội, những người đã dìu dắt em trong suốtnăm năm qua Cảm ơn các bạn trong lớp CNPM đã đóng góp ý kiến cho đồ án này,
đặc biệt là bạn Phạm Minh Tuấn
Tác giả: Nguyễn Hùng Anh
Trang 11Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
MỞ ĐẦU
Trong thời đại ngày nay- thời đại của kỷ nguyên của công nghệ thông tin thìcông nghệ thông tin đóng vai trò là trung tâm của cả xã hội trên tất cả mọi mặt củađời sống xã hội Đối tượng chính của công nghệ thông tin chính là thông tin vì vậyphải vấn đề là phải làm sao để quản lý và sử dụng chúng một cách hợp lý và hiệuquả nhất Hiện nay các thông tin đã và đang được thu thập thật khổng lồ vượt quatầm quản lý và kiểm soát không chỉ đối với từng xí nghiệp, doanh nghiệp mà cònvượt quá tầm quản lý của các ứng dụng mang tính chia sẻ cho toàn xã hội, khôngnhững khổi lượng thông tin vô cùng to lớn mà còn vô cùng phong phú đa dạng Dovậy bài toán quản lý nội dung thông tin là cấp thiết và mang ý nghĩa thực tiễn lớn.Một trong những ứng dụng cụ thể của bài toán quản lý thông tin là ứng dụng tìmkiếm việc làm trực tiếp
Việc làm là mối quan tâm hàng đầu của mọi người trong thời điểm hiện nay,các nhà tuyển dụng muốn tuyển cho công ty mình những người có năng lực để phục
vụ tốt cho sự phát triển của công ty, trong khi những người tìm việc lại muốn tìmđược những công việc tốt, phù hợp với chuyên môn của mình Vì thế cần phải có cơchế thích hợp để lấy thông tin từ nhà tuyển dụng cung cấp cho cho những người tìmviệc, đó là cơ chế lọc và phân loại thông tin Chính vì vậy tác giả đã phát triển đề tài
“Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung” nhằmlàm cầu nối cho các nhà tuyển dụng với những người tìm việc
Trang 12Chương 1: Tổng quan
1.1 Giới thiệu chung
Sự bùng nổ của kỉ nguyên Internet đã dẫn tới một nhu cầu rất lớn, đó là nhucầu tìm kiếm , khai thác và trao đổi thông tin trên mạng internet Các website xuấthiện ngày càng nhiều, do đó cũng gia tăng một nhu cầu mới: nhu cầu quản lý, khaithác và trao đổi thông tin trên mạng Internet Những giải pháp quản trị nôi dungInternet được phát triển và ngày càng được chuẩn hóa, giúp cho các tổ chức, doanhnghiệp thuận tiện hơn trong việc xuất bản cũng như khai thác thông tin
Trong môi trường liên kết và tương tác cao như môi trường internet, việc nhậnthức và phát triển một ứng dụng theo tiêu chẩn chung của quốc tế, có khả năngtương tác cao với các hệ thống khác là một yếu tố hết sức quan trọng và cần thiết
1.1.1 Hệ quản lí nội dung là gì?
Hệ quản trị nội dung, cũng được gọi là hệ thống quản lý nội dung hay CMS
(từ Content Management System của tiếng Anh) là phần mềm để tổ chức và tạo môi
trường cộng tác thuận lợi nhằm mục đích xây dựng một hệ thống tài liệu và các loạinội dung khác một cách thống nhất Mới đây thuật ngữ này liên kết với chương
trình quản lý nội dung của website Quản lý nội dung web (web content
management) cũng đồng nghĩa như vậy.
Có rất nhiều sản phẩm khác nhau được cho là cung cấp khả năng quản lý nộidung, song khái niệm còn chưa được rõ ràng Phần lớn các giải pháp quản lý nộidung tập trung vào việc đề xuất, khảo sát/chấp nhận và triển khai, song các tínhnăng thường thay đổi theo sản phẩm Một số giải pháp tập trung vào việc phân phốitrang (page delivery), cũng như là tính năng cá nhân hoá Nhiều sản phẩm trong số
đó được tuyên bố là theo "các chuẩn mở" và tích hợp với tất cả mọi thứ "trên thếgiới này"
Nội dung ở một Website là tài sản có giá trị Nội dung phải được cập nhậtthường xuyên để cho khách thăm quan quay trở lại Một hệ thống quản lý nội dung
sẽ cho phép bạn tập trung vào việc tạo ra nội dung có chất lượng trong khi tự độnghoá một số công việc vận hành Bạn có thể giảm chi phí vận hành, tăng mức độthường xuyên của việc cập nhật nội dung, và tăng cường chất lượng và số lượng củanội dung được giới thiệu trên Website của bạn
1.1.2 Lợi ích của việc sử dụng hệ quản lí nội dung
Nhiều công ty quan tâm đến việc tìm một công cụ mà nó có thể tự động hoácác quá trình quản lý nội dung và tăng hiệu suất của những người cộng tác không cóchuyên môn về kỹ thuật Lợi ích lớn nhất của việc quản lý nội dung là ở chỗ nhữngngười sử dụng không có chuyên môn về kỹ thuật có thể gửi nội dung mà không cầnphải vượt qua những đoạn đường hẹp dễ bị tắc nghẽn vì lý do kỹ thuật Điều này rấtquan trọng đối với những môi trường chịu áp lực về thời gian và các Website màkhách hàng tự điều khiển Những lợi ích cơ bản khác bao gồm tự động hoá việcchấp nhận và triển khai nội dung Nhìn chung, những nội dung này có thể đượcphân nhóm theo các loại:
Quản lý tài sản Web
Nội dung có thể có xuất xứ từ nhiều nguồn khác nhau bao gồm cả tài sản tệp
và tài sản cơ sở dữ liệu Bạn thậm chí có thể tích hợp với những tài sản từ hệ
Trang 13Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
thống truyền thống hay các dịch vụ cung cấp các bài báo, tin tức qua một tổ chứcchung
Một số sản phẩm cho phép chúng ta lưu trữ nội dung ở cả Ngôn ngữ Đánhdấu Mở rộng (XML) và các cơ sở dữ liệu có liên quan XML cung cấp nhiềutính linh hoạt Các cơ sở dữ liệu quan hệ cung cấp tính bảo mật, tính đồng thời,bình thường hoá, và những lợi ích khác Cả hai đều cho phép sự phân tách nộidung từ nội dung được trình bầy
Các tác giả nội dung có thể thường xuyên sử dụng công cụ lựa chọn của họkhi xây dựng nội dung
Phần mềm quản lý nội dung có thể tự động hoá việc thiết lập và lưu giữ siêu
dữ liệu (metadata), tính năng cho phép các công ty tổ chức nội dung và cải tiếnviệc tìm kiếm của khách hàng
Nhiều giải pháp quản lý nội dung cung cấp một giao diện người sử dụng chocác nhiệm vụ quản lý Bạn có thể tự động hoá việc thiết lập và ấn định danh sáchcông việc, khai báo e-mail, và chấp thuận Các nhiệm vụ có thể được chỉ địnhcho các cá nhân hay các nhóm Các nhiệm vụ có thể được bắt đầu bằng tay (ví
dụ, Joe, hãy viết thông cáo báo chí này để tuyên bố việc phá sản không mong đợicủa chúng ta) hay được tự động hoá (ví dụ, hãy triển khai nội dung cho 5 máychủ Web sản xuất của chúng ta vào 3h sáng tất cả các ngày) Dòng công việc cóthể được tuỳ biến thường xuyên, song tốt nhất là để cho nó được đơn giản
Một cách thức kiểm tra (audit trail) và lịch sử thay đổi nội dung có thể đượcduy trì, điều cho phép các nhà cung cấp nội dung theo dõi và kiểm tra tốt hơnnhững thay đổi về nội dung
Các biểu mẫu (Templates)
Các biểu mẫu được thiết kế cho cả việc nhập nội dung lẫn trình bầy nội dung.Các biểu mẫu mà chúng được tạo ra để nhập nội dung được thiết kế cho nhữngngười sử dụng cuối không có chuyên môn về kỹ thuật để xây dựng nội dung.Một số sản phẩm được tuyên bố là tự động tạo ra các biểu mẫu nhập nội dungcho bạn, song nên đánh giá thật kỹ lưỡng tính năng này để đảm bảo rằng nó đápứng yêu cầu của bạn Các biểu mẫu giới thiệu được sử dụng để kết hợp nội dungvới trình bầy, và hiển thị kết quả cuối cùng cho khách thăm quan Website Cáctrang trình bầy thường bao gồm các thành phần mà chúng là những biểu mẫuđược gộp trong một biểu mẫu Các thành phần hữu ích đối với các tài sản như lànhư là các banner quảng cáo và chú thích cuối trang (footers) mà chúng đượchiển thị ở nhiều trang trong cả một Web site
Kiểm soát nguồn/tạo các phiên bản (Source control/versioning)
Nhiều giải pháp quản lý nội dung cũng cung cấp các khả năng quản lý mã nguồnnhư là tạo phiên bản, kết hợp các thay đổi và chỉ rõ cách giải quyết xung đột.Một giải pháp quản lý nội dung tốt sẽ cho phép bạn giữ các phiên bản của toàn
bộ Web site, hay các ảnh chụp nhanh (snapshots) đúng lúc - đồng thời cho phépbạn xoá các thay đổi ở cơ sở dữ liệu tại bất cứ điểm nào
Triển khai/Phân phối (Deployment/Delivery)
Trang 14 Nhiều giải pháp quản lý nội dung tự động hoá quá trình triển khai nội dung.Một số giải pháp cũng cung cấp khả năng lưu trữ/gia hạn hiệu lực của nội dungmột cách tự động.
Một số giải pháp quản lý nội dung cũng có một thành phần thời gian chạy(run time component) để thực hiện việc phân phối trang
1.1.3 Các sản phẩm quản lí nội dung- so sánh tính năng
Hiện nay với hàng ngàn hệ quản trị nội dung CMS khiến đôi khi ta khó lựa
chọn được một sản phẩm phù hợp vì các tính năng rất phong phú cũng như các chitiết kỹ thuật cần lưu ý Một khi bạn đã chọn rồi rất vất vả khi chuyển đổi sang một
hệ CMS khác Sau đây là đánh giá các tính năng của bốn hệ CMS hiện dùng phổbiến trên Thế giới cũng như tại Việt Nam
Bảng 1 So sánh các tính năng của các hệ CMS phổ biến
1.1.4 Kết luận
Hiện nay, có rất nhiều loại sản phẩm quản lý nội dung trên thị trường Các sảnphẩm này thực hiện những công việc thích hợp khác nhau và có những tính năngkhác nhau Trong đề tài này, em xin đưa ra một ứng dụng nhỏ của bài toán quản lýnội dung, đó là bài toán: Tìm kiếm việc làm trực tiếp
1.2 Mô tả bài toàn
1.2.1 Vai trò của công nghệ thông tin trong việc tìm kiếm thông tin có chọn lọc
Hiện nay việc ứng dụng công nghệ thông tin vào các lĩnh vực của đời sống xãhội ngày càng phổ biến và đem lại nhiều lợi ích Một trong các ứng dụng đó là vàolĩnh vực tìm kiếm việc làm
Trang 15Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
Với việc các công cụ tìm kiếm ngày càng được phát triển, việc tìm ra một côngviệc phù hợp với các ứng viên trở nên dễ dàng hơn, họ có thể ngồi ở nhà, lên mạng
và bắt đầu tìm kiếm thông tin về việc làm thay vì việc phải đến gõ cửa từng trungtâm môi giới việc làm hay từng công ty tuyển việc Bên cạnh đó các nhà tuyển dụngcũng có thể dễ dàng tìm được các ứng viên phù hợp bằng cách đăng tin tuyển dụngtrên website của công ty hay trên trang web trung gian thay vì phải đi phát các tờ rơinhư trước đây
Qua đó ta thấy vai trò quan trọng của hệ thống trung gian, nơi đăng tin tuyểndụng của các doanh nghiệp và cũng là nơi để các ứng viên vào để tìm kiếm các việclàm phù hợp với mình Mô hình đã được áp dụng trong thực tế, với các trang thôngtin tìm việc có uy tín trong nước cũng như quốc tế, phải kể đến :
http://www.vietnamworks.com/ và các trang tìm việc của các báo điện tử
1.2.2 Bài toán cần xây dựng
Mục tiêu của bài toán là xây dựng được hệ thống dịch vụ tìm việc đáp ứngđược các yêu cầu về thu thập thông tin công việc và phân loại công việc thành cácnhóm công việc đã được định nghĩa trước
Thu thập thông tin công việc: Trước hết phải có cơ chế thu thập thông tin
hiệu quả, có cơ chế tự động chui vào các trang web của các doanh nghiệp đãđăng ký sử dụng dịch vụ để lấy các thông tin tuyển dụng,chuẩn hóa các địnhdạng của thông tin và loại bỏ biết loại bỏ các thông tin không cần thiết Để làmđiều này nó phải xây dựng các luật lọc trên server để thực hiện các công việctrên, việc xây dựng các luật lọc sao cho hiệu quả là một điều quan trọng của quátrình xử lý, điều này giúp cho công đoạn phân loại công việc sau này được thuậnlợi hơn
Phân loại công việc: Đây là chức năng này rất quan trọng trong hệ thống, nó
cho phép sắp xếp công việc theo nội dung công việc và vị trí địa lý của nhàtuyển dụng, điều này làm cho quá trình tìm kiếm của các ứng viên trở nên dễdàng và thuận tiện hơn Việc phân loại công việc dựa trên các từ khóa( dùngcông cụ tìm kiếm của Lucene để phân loại), các từ khóa đã được định nghĩatrước, công việc sau khi phân loại thành các nhóm đã được định nghĩa trướctrong cơ sở dữ liệu(CSDL)
1.3 Phương pháp giải quyết bài toán
1.3.1 Bài toán dựa trên Internet, www
Để giải quyết bài toán, sự lựa chọn đầu tiên là Internet Lý do thật đơn giản vìInternet là mạng thông tin chung Để phổ biến thông tin cho nhiều người thì Internet
là sự lựa chọn hợp lý
Internet giúp cho việc thu thập thông tin dễ dàng và nhanh chóng hơn, nó còngiúp cho người tìm việc có thể dễ dàng tra cứu, tìm kiếm các thông tin Tóm lạiInternet giúp khả năng trao đổi thông tin rộng rãi, thông tin và dịch vụ của hệ thống
có thể được phổ cập nhanh chóng và rộng rãi, điều này giúp ứng dụng có thể trở nênphổ biến
Trang 161.3.2 Công cụ tìm kiếm Lucene
Với sự ra đời và phát triển không ngừng của Web, lượng tài liệu mà con ngườicần tổ chức, quản lý và khai thác gia tăng theo từng ngày Để tìm kiếm những thôngtin cần thiết trong kho các văn bản và trang Web này, các hệ thống tìm kiếm đã lầnlượt được phát triển và thành công nhất là các hệ thống truy vấn theo từ khóa Tuynhiên, phần lớn các công cụ tìm kiếm mạnh mẽ nhất hiện nay như Yahoo!, Google,
và MSN… là những sản phẩm thương mại và mã nguồn được giữ bí mật Điều nàydẫn tới kết quả là nhiều nhà phát triển riêng biệt sẽ phải tự mình xây dựng từ banđầu một công cụ tìm kiếm nếu hệ thống của họ cần cung cấp chức năng tìm kiếm.Đứng trước một sự lãng phí rất lớn về công sức lập trình, vào năm 1998 DougCutting đã bắt đầu tiến hành xây dựng thư viện truy vấn thông tin mã nguồn mở
Lucene với mục tiêu phát triển nó thành một thư viện truy vấn tài liệu hoàn chỉnhcho phép các nhà phát triển ứng dụng dễ dàng tích hợp chức năng tìm kiếm vào hệthống của mình
Từ phiên bản đầu tiên 0.01 được công bố vào tháng 3 năm 2000, đến khiLucene trở thành một dự án chính thức của tổ chức Apache Jakarta và bắt đầu đượcphát triển với sự đóng góp của rất nhiều lập trình viên trên thế giới, và cho đến thờiđiểm hiện nay, Lucene đã trở thành một thư viện truy vấn thông tin thật sự ổn định
và hiệu quả Lucene đã được sử dụng đế phát triển ứng dụng tìm kiếm ở hàng loạtcác tổ chức và công ty như Hewlett-Packard, FedEx, Tạp chí New Scientist, MIT’sOpenCourseWare, từ điển bách khoa toàn thư Britannica, môi trường phát triển tíchhợp Eclipse
Sự thành công của Lucene có được là do nó đã cung cấp cho nhà phát triểnnhững chức năng nổi bật sau đây:
- Là mã nguồn mở được thuần túy phát triển bằng Java, mà mọi người đều có quyền sử dụng và mở rộng
- Cung cấp một giao diện lập trình đơn giản để phát triển ứng dụng tìm kiếm
- Loại bỏ các từ vô nghĩa (Stop-Word) và đưa về từ gốc (Stemming)
- Hỗ trợ cơ chế để xử lý các ngôn ngữ khác tiếng Anh
- Hỗ trợ khả năng cập nhập và tìm kiếm trên chỉ mục một cách đồng thời
- Cung cấp các chức năng truy vấn đặc biệt như theo nhóm từ, theo biểu thức Boolean, gần đúng, trên nhiều chỉ mục cùng lúc
Một số ứng dụng tiêu biểu sử dụng Lucence là:
- Zeo: cho phép người dùng tìm kiếm trên toàn bộ nội dung email đã được lưutrữ
- Web Nutch: động cơ tìm kiếm trên Web được phát triển bởi chính Doug Cutting và Apache Jakarta
- KnowLEX EN: cung cấp chức năng tìm kiếm tài liệu trong bách khoa toànthư Wikipedia
- Aduna AutoFocus: cho phép người dùng tìm kiếm tài liệu trên cây thư mụccủa máy tính cá nhân
- Kowari: cho phép quản lý và truy vấn cơ sở tri thức RDF
Trang 17Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
- KIM: hỗ trợ tìm kiếm tài liệu theo thực thể có tên
1.3.3 Công cụ crawler chuyên thu thập các trang web
Web crawler là chương trình tự động tìm kiếm trên Internet Nó được thiết kết
để thu thập tài nguyên Internet (trang Web, hình ảnh, video, tài liệu Word, PDF hayPostScrips) , cho phép máy tìm kiếm đánh chỉ số sau đó
Cùng phương thức, nhưng một số robots lại bị sử dụng để lượm các tài nguyênhoặc để lọc địa chỉ email
Để đánh chỉ số các tài nguyên web, mỗi robot sẽ đi theo các liên kết mà nó tìmthấy tại một trang trung tâm Sau đó, mỗi trang đã duyệt sẽ được ghi nhớ lại và gáncho tần số đánh lại chỉ số dựa vào mức độ cập nhật thường xuyên hay không củatrang
Trang 18Chương 2: Lọc và phân loại dữ liệu
2.1 Giới thiệu về các hệ thống khai thác thông tin
Kỷ nguyên XXI là kỷ nguyên của thông tin điện tử, có hàng tỉ website trên thếgiới cung cấp hàng triệu tin tức mỗi ngày Nguồn thông tin trở lên vô cùng phongphú trong khi độc giả thường ít phụ thuộc vào một hệ thống phát hành Thôngthường , người ta luôn muốn tìm đến nhiều nguồn khác nhau, tìm đọc nhiều bài viết
về cùng một chủ đề Bên cạnh đó, chia sẻ tin tức là một yêu cầu thiết yếu cho cácwebsite thông tin Có nhiều hính thức chia sẻ nội dung như đăng lại toàn bộ, chỉđăng tiêu đề, mô tả, hay trích dẫn…do đó , hàng loạt các giải pháp chia sẻ , khaithác nội dung đã ra đời như Web-crawler, Web cliping, Agent, RSS, RDF, Atom,Spider , Robot, Downloader…Điểm chung của các sản phẩm này là giúp độc giảtăng tốc độ duyệt thông tin, quản lí nội dung,…
Dưới đây xin giới thiệu sơ lược về các công nghệ thông dụng :
Web-Crawler: Là công nghệ tải và xử lí nội dung HTML( tách lọc, chuẩn hóa,
…) từ Internet.Web-crawler được ứng dụng thành công nhất trong các hệ thống tìmkiếm như Google, Yahoo, MSN,…Và hiện nay, người ta còn ứng dụng Web-crawler cho các hệ thống CMS và Portal Tác dụng của nó trong các hệ này làdownload, tách lọc nội dung để các quản trị có thể phát hành lại trên website của họ.Chức năng cở bản cần có của Web-Crawler là download , tách lọc, xử lí; quản lí nộidung trong cở sở dữ liệu; cho phép đọc offline; cung cấp các giải pháp liên kết vớicác hệ thống khác
Web-clipping: xuất hiện trong thời gian gần đây dưới dạng portlet trong các hệ
Portal thương mại như của IBM, Oracle,…Là giải pháp trích xuất một phần nộidung từ một trang trên Internet, Web-clipping mới chỉ là một công nghệ tương đối
xa lạ hiện nay Chức năng cơ bản của hệ thống này là khả năng trích xuất, catche vàupdate, sửa đổi các style của nội dung nguồn và phát hành lại tự động trên website
Downloader: Đây là công nghệ thông dụng và loại bậc nhất trong các hệ khai
thác thông tin Downloader tồn tại chủ yếu dưới 2 dạng là download toàn bộwebsite và download tài nguyên trên Internet Hệ downloader trợ giúp người dùngdownload với tốc độ nhanh hơn, quản lí các url tốt hơn và bảo toàn dữ liệu khi córủi ro ( đứt mạng, tắt máy,…) Với các hệ download website, ứng dụng còn đảmbảo cấu trúc của toàn bộ site đó như giữ vững các liên kết, tổ chức lưu trữ,…
RSS Reader : Công nghệ RSS ra đời trợ giúp việc chia sẻ nội dung giữa các hệ
thống thông tin Tuy nhiên, có một loạt các sản phẩm Reader cho phép người dùngkiếm soát nội dung thông qua giải pháp này Những năm gần đây, hệ các sản phẩmnày phát triển tới mức bùng nổ , chúng tồn tại không chỉ là các sản phẩm phần mềmthuần chủng mà còn được tích hợp vào các sản phẩm mail client, browser,… Ônglớn Microsoft cũng không thể làm ngơ khi quyết định tích hợp khả năng đọc RSS
và sản phẩm Windows Longhorn, IE 7 Hàng trăm các sản phẩm phần mềm liênquan tới khai thác tài nguyên Internet đều tích hợp chức năng đọc RSS, Googledesktop search là một ví dụ Các yêu cầu tối thiểu của một hệ RSS Reader là khảnăng đọc các phiên bản khác nhau của RSS, Atom, RDF,…; phát hành các thông tin
cơ bản của nội dung tới người dùng; khả năng catche và update
Trang 19Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
2.2 Lucene- Công cụ đánh chỉ mục và tìm kiếm
2.2.1 Giới thiệu về Lucene
Lucene là phần mềm mã nguồn mở được phát triển đầu tiên bởi Doug Cutting
được giới thiệu đầu tiên vào tháng 8 năm 2000 Tháng 9 năm 2001 Lucene gia nhậpvào tổ chức Apache và hiện tại được Apache phát triển và quản lý Đó là công cụđược thiết kế và phát triển dùng để phân tích, đánh chỉ mục và tìm kiếm thông tinvới hiệu suất cao bằng java Cần lưu ý rằng Lucene không phải là một ứng dụng màchỉ là một công cụ đặc tả API cần thiết cho việc một search engine Được xây dựng
và thiết kế theo hướng hướng đối tượng nên các API cũng được cung cấp theo dạnghướng đối tượng Mặc dù thiết kế và xây dựng ban đầu từ java nhưng hiện nay cũng
đã có một số phiên bản cho các ngôn ngữ khác : Net, C++, Perl, …
2.2.1.1 Lucene làm được gì?
Lucene cho phép đánh chỉ mục và tìm kiếm thông tin trong ứng dụng củachúng ta Lucene có thể đánh chỉ mục và tìm kiếm với bất cứ dữ liệu nào và chuyểncác dữ liệu đó về dạng văn bản(textual)
Hình 1: Các ứng dụng tiêu biểu tích hợp Lucene
Lucene không quan tâm đến nguồn của dữ liệu, định dạng thậm chí là ngônngữ khi chúng ta chuyển đổi sang dạng văn bản Điều này có nghĩa là chúng ta cóthể dùng Lucene để đánh chỉ mục và tìm kiếm dữ liệu trong các file: trang web trêncác máy chủ web từ xa, các tài liệu được lưu trong các hệ thống file cục bộ như filetext, các tài liệu Microsoft Word, HTML hay PDF
Lucene cũng có thể đánh chỉ mục cho dữ liệu trong cơ sở dữ liệu(CSDL), đưa
ra cho người dùng cách tìm kiếm full-text mà nhiều CSDL không cung cấp
Trang 202.2.1.2 Đánh chỉ mục và tìm kiếm
Trái tim của tất cả bộ máy tìm kiếm là khái niệm: đánh chỉ mục(indexing)- xử
lý dữ liệu gốc thành dạng tham chiếu để dễ dàng cho việc tìm kiếm
2.2.1.2.1 Thế nào là đánh chỉ mục, tại sao nó lại quan trọng
Giả thiết rằng chúng ta cần tìm kiếm một lượng lớn các file và chúng ta muốntìm file mà chứa một từ hay câu xác định Cách chúng ta viết chương trình để thựchiện điều này? Cách tiếp cận “ngây thơ” là dò lần lượt từng file để tìm ra các từ haycác câu Cách tiếp cận này sẽ gặp khó khăn khi số lượng các file lớn Do đó việcđánh chỉ mục đã xuất hiện: để tìm một số lượng lớn các file văn bản nhanh chóng,chúng ta trước hết phải đánh chỉ mục cho văn bản đó và chuyển chúng về định dạng
mà cho phép chúng ta tìm kiếm một cách nhanh chóng, loại trừ quá trình quét tuần
tự Quá trình đó gọi là đánh chỉ mục, và đầu ra là một chỉ mục
Ta có thể xem một chỉ mục như là cấu trúc dữ liệu mà cho phép truy cập ngẫunhiên đến các từ được lưu trữ trong nó nhanh hơn Với Lucene, một chỉ mục là mộtcấu trúc dữ liệu được thiết kế đặc biệt, được lưu trong hệ thống file như là một tậpcác file chỉ mục
2.2.1.3 Lucene in Action: tạo một ứng dụng mẫu
2.2.1.3.1 Tạo một chỉ mục
Chúng ta sẽ xem cách một lớp đơn gọi Indexer(lớp đánh chỉ mục) và bốnphương thức của nó, chúng sẽ đệ qui các thư mục file hệ thống và đánh chỉ mục tấtcác các file có đuôi txt Khi bộ tạo chỉ mục thực hiện xong nó sẽ nhường chỗ chongười anh em của nó là bộ tìm kiếm (Searcher)
Sử dụng lớp đánh chỉ mục để đánh chỉ mục cho file text: cần 2 đối số
Đường dẫn tới thu mục mà chứa chỉ mục Lucene
Đường dẫn tới thư mục mà chứa các file chúng ta muốn đánh chỉ mụcSau đây là cách sử dụng lớp đánh chỉ mục Indexer
public class Indexer {
public static void main(String[] args) throws Exception {
if (args.length != 2) {
throw new Exception("Usage: java " + Indexer.class.getName()
+ " <index dir> <data dir>");
}
File indexDir = new File(args[0]); // tạo thư mục chỉ mục Lucene File dataDir = new File(args[1]); // Đánh chỉ mục cho thư mục này long start = new Date().getTime();
int numIndexed = index(indexDir, dataDir);
long end = new Date().getTime();
Trang 21Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
System.out.println("Indexing " + numIndexed + " files took "
+ (end - start) + " milliseconds");
}
// Mở chỉ mục và bắt đầu tìm kiếm thư mục
public static int index(File indexDir, File dataDir)
throws IOException {
if (!dataDir.exists() || !dataDir.isDirectory()) {
throw new IOException(dataDir
+ " does not exist or is not a directory");
}
IndexWriter writer = new IndexWriter(indexDir,
new StandardAnalyzer(), true); // 1 tạo chỉ mục Lucene
// Phương thức đệ quy gọi chính nó khi tìm kiếm thư mục
private static void indexDirectory(IndexWriter writer, File dir)
throws IOException {
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
// method to actually index a file using Lucene
private static void indexFile(IndexWriter writer, File f)
Document doc = new Document();
doc.add(Field.Text("contents", new FileReader(f))); // 3 đánh chỉ mục cho nội
dung file doc.add(Field.Keyword("filename", f.getCanonicalPath()));//4 đánh chỉ mục cho
// tên file writer.addDocument(doc);// thêm tài liêu vào chỉ mục Lucene
}
}
2.2.1.3.2 Tìm kiếm một chỉ mục
Trang 22Tìm kiếm trong Lucene là nhanh và đơn giản như đối với việc đánh chỉ mục,khả năng của các hàm là đáng kinh ngạc Chúng ta sẽ dùng bộ tìm kiếm(searcher)
để tìm các chỉ mục đã được tạo ra bởi bộ tạo chỉ mục
Trong phần trên, chúng ta đã đánh chỉ mục cho thư mục của các file text, bâygiờ chúng ta sẽ sử dụng Lucene để tìm kiếm chỉ mục để tìm các file chứa các từ, cáccâu cần tim Ví dụ, ta muốn tìm tất cả các file có chưa từ khóa java hay lucene, hoặc
ta muốn tìm các file chứa câu “system requirements”
Sử dụng bộ tìm kiếm để thực hiện việc tìm kiếm: cần 2 đối số
Đường dẫn chứa chỉ mục được tạo ra bởi bộ tạo chỉ mục
Một truy vấn dùng để tìm chỉ mục
Sau đây là cách sử dụng bộ tìm kiếm để tìm kiếm
public class Searcher {
public static void main(String[] args) throws Exception {
if (args.length != 2) {
throw new Exception("Usage: java " + Searcher.class.getName()
+ " <index dir> <query>");
}
File indexDir = new File(args[0]);
String q = args[1];
if (!indexDir.exists() || !indexDir.isDirectory()) {
throw new Exception(indexDir +
" does not exist or is not a directory.");
Directory fsDir = FSDirectory.getDirectory(indexDir, false);
IndexSearcher is = new IndexSearcher(fsDir); // 1 Mở chỉ mục
Query query = QueryParser.parse(q, "contents", // 2 phân tích truy vấn
new StandardAnalyzer());
long start = new Date().getTime();
Hits hits = is.search(query); // 3 tìm chỉ mục
long end = new Date().getTime();
System.err.println("Found " + hits.length() + /
" document(s) (in " + (end - start) +
" milliseconds) that matched query '" +
q + "':");
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i); // 4 thu tập tài liệu đối sánh
System.out.println(doc.get("filename"));
}
}
}
Trang 23Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
2.2.1.4 Tìm hiểu các lớp cơ bản trong Indexer
Các lớp cơ bản trong bộ tạo chỉ mục:
2.2.1.4.2 Thư mục (directory)
Lớp thư mục hiện thị vùng chứa của chỉ mục Lucene, đây là lớp trừu tượngcho phép các lớp con của lớp này lưu trữ chỉ mục Bộ tạo chỉ mục là một ví dụ,chúng ta dùng đường dẫn đến thư mục file hệ thống để lấy được thể hiện(instance)của Thư mục IndexWriter sau đó dùng Thư mục cụ thể - FSDirectory và tạo chỉmục trong thư mục file hệ thống Trong ứng dụng của chúng ta thường lưu chỉ mụcIndex trên đĩa, vì thế dùng FSDirectory
Một sự thực thi(implementation) của Thư mục là lớp có tên RAMDirectory, nóchứa tất cả dữ liệu trong bộ nhớ Sự thực thi này do đó hữu ích cho các chỉ mục nhỏhơn mà có thể tải vào bộ nhớ và sẽ bị hủy khỉ ứng dụng kết thúc Vì các dữ liệutrong bộ nhớ thì truy cập nhanh hơn trong đĩa cứng nên RAMDirectory thích hợpvới các tình huống mà cần truy cập nhanh đến chỉ mục trong quá trình đánh chỉ mục
và tìm kiếm
2.2.1.4.3 Bộ phân tích (analyzer)
Trước khi văn bản được đánh chỉ mục, thì văn bản đó phải qua bộ phân tích,
bộ phân tích là một khởi tạo của IndexWriter, có nhiệm vụ trích lọc văn bản trướckhi đánh chỉ mục Nó làm việc với các từ dừng(stop word)( các từ thường dùngnhưng không giúp phân biệt các bản ghi với nhau như a, an, the, in)
2.2.1.4.4 Bản ghi (document)
Một bản ghi biểu thị một tập các trường, có thể xem nó như một bản ghi ảo,một đoạn của dữ liệu như một trang web, một thư điện tử hay một file văn bản Cáctrường của bản ghi miêu tả tài liệu hay dữ liệu tương ứng với bản ghi Các dữ liệunhư tác giả, tiêu đề, ngày thay đổi đều được đánh chỉ mục và lưu trữ riêng biệt trongcác trường của bản ghi
Trang 24Trong bộ tạo chỉ mục, chúng ta tập trung đánh chỉ mục cho file văn bản, vì thếvới mỗi file văn bản tìm được ta tạo một thể hiện của lớp Thư mục, đưa nó vàotrong các trường và thêm các Bản ghi này vào chỉ mục.
2.2.1.4.5 Trường(Field)
Mỗi Bản ghi trong một chỉ mục chứa một hay nhiều tên trường, trong lớp cótên là Trường(Field) Mỗi trường tương ứng với mẩu của dữ liệu mà được truy vẫnhay được thu thập từ chỉ mục trong khi tìm kiếm Lucene đưa ra 4 loại trường:
Từ khóa(keyword): không được phân tích, nhưng được đánh chỉ mục
và lưu trong chỉ mục đúng với nguyên bản Loại này thích hợp với cáctrường mà giá trị gốc cần được giữ trọn vẹn như URL, các đường dẫn file,các số bảo mật xã hội, số điện thoại
Không đánh chỉ mục(UnIndexed): không được phân tích cũng nhưđánh chỉ mục, nhưng giá trị của trường được lưu trong chỉ mục Loại nàythích hợp với các trường cần hiện thị kết quả tìm kiếm( như URL hay khóachính của CSDL)
Không lưu trữ( UnStored): ngược lại với không đánh chỉ mục, trườngnày được phân tích và đánh chỉ mục nhưng không được lưu trong chỉ mục.Các trường loại này thích hợp cho việc đánh chỉ mục số lượng lớn các vănbản mà không cần thu thập dạng gốc của chúng, như thân của trang webhay các loại khác của tài liệu văn bản
Văn bản(text): được phân tích và đánh chỉ mục, các trường loại này cóthể được tìm kiếm lại nhưng phải chú ý đến kích thước của trường Nếu dữliệu được đánh chỉ mục là một chuỗi nó sẽ được lưu, nhưng nếu dữ liệuđược lấy từ bộ đọc(reader) thì nó sẽ không được lưu
Tất cả các trường đều có tên và giá trị Bảng sau tóm tắt đặc trưng của cáctrường khác nhau:
Phương thức/kiểu của trường Phân
cá nhân, Ngày
liệu: PDF, HTML
Field.UnStored(String, String) có có Tiêu đề tài liệu
và nội dung Field.Text(String, String) có có có Tiêu đề tài liệu
Trang 25Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
2.2.1.5 Tìm hiểu các lớp cơ bản trong bộ tìm kiếm
Các lớp cơ bản cần để thực hiện thao tác tìm kiếm:
IndexSearcher is = new IndexSearcher(
FSDirectory.getDirectory("/tmp/index", false));
Query q = new TermQuery(new Term("contents", "lucene"));
Hits hits = is.search(q);
2.2.1.5.2 Thuật ngữ
Thuật ngữ là đơn vị cơ bản của việc tìm kiếm, tương tự như đối tượng Trường,thuật ngữ bao gồm một cặp chuỗi: tên của trường và giá trị của trường Chú ý rằngđối tượng thuật ngữ cũng bao gồm trong quá trình đánh chỉ mục, tuy nhiên chúngđược tạo ra bởi Lucene nên ta không cần quan tâm đến chúng trong khi đánh chỉmục Trong quá trình tìm kiếm ta phải xây dựng các đối tượng Thuật ngữ và dùngchúng với Truy vấn thuật ngữ (termQuery):
Query q = new TermQuery(new Term(" contents" , " lucene" ));
Hits hits = is.search(q);
Đoạn mã trên chỉ thị cho Lucene tìm tất cả các bản ghi mà chứa từ lucenetrong trường có tên contents
Trang 26ta đã giới hạn ví dụ để đánh chỉ mục và tìm kiếm là các file txt Để ta có thể hiểunội dung và cách dùng các Trường thì thật không hề đơn giản.
Giả sử ta cần đánh chỉ mục cho định dạng PDF Để chuẩn bị cho việc đánh chỉmục, ta phải tìm cách lấy thông tin văn bản tù các tài liệu PDF và dùng dữ liệu thuđược để tạo các Tài liệu và các Trường Lucene Ta có thể thấy các phương thứcField luôn mang giá trị String, trong một số trường hợp còn có cả giá trị Date vàReader, không có phương thức nào chấp nhận kiểu Java PDF ngay cả khi kiểu đótồn tại Ta cũng gặp tình huống tương tụ khi muốn đánh chỉ mục các tài liệuMicrosoft Word Ngay cả khi chúng ta giải quyết vấn đề này với các tài liệu dạngXML hay HTML là các tài liệu cùng các ký tự thuần văn bản, thì chúng ta vẫn cầnkhôn khéo cho việc chuẩn bị dữ liệu để đánh chỉ mục tránh việc đánh chỉ mục vớicác phần tử(element) của XML hay các thẻ(tag) của HTML
Hình 2: Đánh chỉ mục với Lucene chia thành 3 thao tác: chuyển dữ liệu thành văn bản, phân tích dữ liệu đó và lưu chúng vào chỉ mục(index)
2.2.2.1.2 Phân tích(analysis)
Khi chuẩn bị dữ liệu cho việc đánh chỉ mục và tạo các Bản ghi Lucene gắn với
các Trường(Field) ta có thể gọi phương thức addDocument(Document) của
IndexWriter Khi đó, trước tiên Lucene phân tích dữ liệu để làm cho dữ liệu đó
tương thích với việc đánh chỉ mục, sau đó nó sẽ chia dữ liệu văn bản thành các
Trang 27Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
đoạn(chunk) hoặc các từ tố(token) và thực hiện một số thao tác trên đó Ví dụ, các
từ tố có thể được chuyển thành chữ thường trước khi đánh chỉ mục làm cho việc tìmkiếm thuận lợi hơn, việc làm này cũng có thể loại bỏ những từ tố không có nghĩa từđầu vào như các từ các từ: a, an, the, in, on trong văn bản tiếng Anh
2.2.2.1.3 Viết chỉ mục
Sau khi đầu vào được phân tích, chúng đã sẵn sàng để thêm(add) vào chỉ mục.Lucene lưu đầu vào trong một cấu trúc dữ liệu có tên chỉ mục đảo(inverted index).Cấu trúc dữ liệu này làm hiệu quả sử dụng không gian đĩa trong khi cho phép tìmkiếm nhanh từ khóa Cách làm của cấu trúc đảo ngược này là nó dùng các từ tố lấyđược từ các tài liệu đầu vào như là các khóa tìm kiếm thay vì coi văn các tài liệunhư các thực thể trung tâm Hay nói cách khác, thay vì cố gắng trả lời câu hỏi “ từnào được chứa trong bản này” thì cấu trúc này lại đưa ra câu trả lời “ những bản ghichứa từ X?”
2.2.2.2 Các thao tác đánh chỉ mục cơ bản
2.2.2.2.1 Thêm các bản ghi vào một chỉ mục
Đoạn code dưới đây sẽ tạo ra một chỉ mục có tên index-dir lưu trong thư mục
file tạm của hệ thống: /tmp trên Unix hay C:\TEMP trên Windowns Ta dùng
SimpleAnalyzer để phân tích văn bản đầu vào và sau đó đánh chỉ mục hai Bản ghi
đơn giản, mỗi tài liệu chứa cả 4 loại Trường: Từ khóa(keyword), Không chỉmục(UnIndexed), Không lưu(Unstored) và văn bản(text)
public abstract class BaseIndexingTestCase extends TestCase {
protected String[] keywords = {"1", "2"};
protected String[] unindexed = {"Netherlands", "Italy"};
protected String[] unstored = {"Amsterdam has lots of bridges", "Venice has lots
of canals"}; protected String[] text = {"Amsterdam", "Venice"};
protected Directory dir;
protected void setUp() throws IOException {
for (int i = 0; i < keywords.length; i++) {
Document doc = new Document();
doc.add(Field.Keyword("id", keywords[i]));
doc.add(Field.UnIndexed("country", unindexed[i]));
doc.add(Field.UnStored("contents", unstored[i]));
doc.add(Field.Text("city", text[i]));
Trang 28protected Analyzer getAnalyzer() {
return new SimpleAnalyzer();
Ví dụ 2.2: Chuẩn bị chỉ mục mới trước khi kiểm tra
Từ lớp BaseIndexingTestCase này ta sẽ mở rộng cho các lớp thử khác trong
phần này, ta sẽ làm rõ một vài chi tiết quan trọng BaseIndexingTestCase sẽ tạo chỉmục ngay khi phương thức setUp() được gọi Setup() được gọi trước khi kiểm trađược thực hiện
Các bản ghi hỗn tạp(Heterogeneous)
Một tính năng thuận tiện của Lucene là cho phép các Tài liệu với tập cácTrường khác nhau có thể cùng tồn tại trong cùng chỉ mục Điều này có nghĩ là ta cóthể dùng chỉ mục đơn để tổ chức các Tài liệu mà thể thiện các thực thể khác nhau
Ví dụ, ta có thể dùng các Tài liệu để thể hiện các san phẩm bán lẻ với các Trườngnhư và , và các tài liệu biểu thị con người với các Trường như tên, tuổi và giớitính
Nối vào các Trường(Appendable Fields)
Giả sử ta có mọt ứng dụng mà sinh ra một mảng các từ đồng nghĩa, và ta muốndùng Lucene để đánh đánh chỉ mục các từ cơ sở của tất cả các từ đồng nghĩa đó.Một cách làm là ta lặp tất cả các từ đồng nghĩa và nối chúng vào một Chuỗi, sau đó
ta có thể sử dụng để tạo ra Trường Lucene Cách khác đơn giản hơn là đánh chỉ mụctất cả các từ đồng nghĩa cùng với các từ cơ sở để thêm vào cùng Trường với các giátrị khác nhau, như:
String baseWord = "fast";
String synonyms[] = String {"quick", "rapid", "speedy"};
Document doc = new Document();
doc.add(Field.Text("word", baseWord));
for (int i = 0; i < synonyms.length; i++) {
doc.add(Field.Text("word", synonyms[i]));
}
Lúc đó, Lucene sẽ nối tất cả các từ với nhau và đánh chỉ mục chúng theo
trường word, điều này cho phép ta có thể dùng bất cứ từ nào khi tìm kiếm.
2.2.2.2.2 Xóa các bản ghi ra khỏi chỉ mục
Dù hầu hết các ứng dụng có liên quan đến lấy các Tài liệu từ chỉ mục Lucenenhưng trong một số trường hợp ta cũng cần xóa chúng đi Ví dụ, một tờ báo xuấtbản có thể muốn giữ các tin tức cuối tuần có giá trị trong chỉ mục có thể tìm kiếm.Các ứng dụng khác có thể muốn xóa tất cả các Tài liệu(bản ghi) mà chứa thuật ngữ
Trang 29Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
Xóa bản ghi là việc sử dụng một lớp không thích hợp gọi là IndexReader Lớpnày không xóa các Bản ghi khỏi chỉ mục ngay lập tức Thay vào đó,lớp này đánhdấu các bản ghi như là đã xóa, Bản ghi thực sự bị xóa cho đến khi phương thứcclose() của IndexReader được gọi Xét ví dụ sau: Phương thức xóa bản ghi thừa kếlớp BaseIndexingTestCase, nghĩa là trước khi phương thức test chạy, lớpBaseIndexingTestCase sẽ tạo lại hai chỉ mục Bản ghi:
public class DocumentDeleteTest extends BaseIndexingTestCase {
public void testDeleteBeforeIndexMerge() throws IOException {
IndexReader reader = IndexReader.open(dir);
assertEquals(2, reader.maxDoc()); // Số bản gi tiếp là 2
assertEquals(2, reader.numDocs());// 2 bản ghi trong chỉ mục
reader.delete(1); // Xóa Bản ghi có ID là 1
assertTrue(reader.isDeleted(1));// Bản ghi đã bị xóa
public void testDeleteAfterIndexMerge() throws IOException {
IndexReader reader = IndexReader.open(dir);
public class DocumentUpdateTest extends BaseIndexingTestCase {
public void testUpdate() throws IOException {
assertEquals(1, getHitCount("city", "Amsterdam"));
IndexReader reader = IndexReader.open(dir);
reader.delete(new Term("city", "Amsterdam"));// Xóa từ “Amsterdam” trong
// Trường city của bản ghi reader.close();
Trang 30assertEquals(0, getHitCount("city", "Amsterdam")); //Xác nhận bản ghi đã
// xóa IndexWriter writer = new IndexWriter(dir, getAnalyzer(),false);
Document doc = new Document();
protected Analyzer getAnalyzer() {
return new WhitespaceAnalyzer();
}
private int getHitCount(String fieldName, String searchString)
throws IOException {
IndexSearcher searcher = new IndexSearcher(dir);
Term t = new Term(fieldName, searchString);
Query query = new TermQuery(t);
Hits hits = searcher.search(query);
int hitCount = hits.length();
Cập nhật bằng cách xóa theo lô
Ví dụ trên, ta đã xóa và thêm một bản ghi Nếu cần xóa và thêm nhiều Bản ghithì cách tốt nhât là làm theo lô theo các bước:
Trang 31Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
2.2.2.3 Độ tin cậy Các bản ghi và các Trường
Hình dung rằng ta phải viết một ứng dụng để đánh chỉ mục và tìm kiếm thưđiện tử của một tổ chức Cách ta thực hiện việc này như thế nào?
Độ tin cậy bản ghi(Document boosting) là tính năng mà làm một yêu cầu nhưvậy đơn giản đối với sự thi hành Mặc định tất cả các Bản ghi không có độ tin cậyhoặc chúng có hệ số tin cậy như nhau và bằng 1 Bằng cách thay dổi hệ số tin cậy,
ta có thể chỉ ra là Bản ghi này quan trọng hay kém quan trọng so với Bản ghi kháctrong chỉ mục
2.2.2.4 Kiểm soát quá trình đánh chỉ mục
Khi đánh chỉ mục với các bộ bản ghi nhỏ và vừa thì có thể thực hiện tốt bằngcách cài đặt Lucene mặc định Tuy nhiên, nếu ứng dụng làm việc với các chỉ mụclớn, ta sẽ phải kiểm soát quá trình đánh chỉ mục để đảm bảo hiệu năng tối ưu choviệc đánh chỉ mục Vi vụ, khi ta đánh chỉ mục cho nhiều triệu bản ghi và muốn tốc
độ của quá trình mất vài phút thay vì hàng giờ Máy tính của ta có thể dư thừa bộnhớ(RAM), nhưng ta phải biết cách sử dụng nó Lucene có nhiều tham số cho phép
ta kiểm soát hiệu năng và tài nguyên trong quá trình đánh chỉ mục
2.2.2.4.1 Điểu chỉnh hiệu năng đánh chỉ mục
Trong một ứng dụng đánh chỉ mục tiêu biểu, thắt cổ chai là quá trình ghi tệpchỉ mục lên đĩa
Hình 2.2 cho thấy, khi các Bản ghi mới được thêm vào chỉ mục Lucene, chúngđược khởi tạo bộ đệm trong bộ nhớ thay vì ghi ngay lập tức lên đĩa
Bộ đệm này được thực hiện vì lý do hiệu năng, lớp IndexWriter đưa ra nhiềubiến cho phép ta chỉnh sửa kích thước bộ đệm
Hình 3 : Quá trình khởi tạo bộ đệm
2.2.2.4.2 Đánh chỉ mục trong bộ nhớ: RAMDirectory
Trong phần trước, ta đã nói tới Lucene thực hiện bộ đệm trong bằng cách giữcác bản ghi mới thêm vào trong bộ nhớ trước khi ghi chúng lên đĩa Điều này được
Trang 32thực hiện một cách tự đồng và trong suốt khi sử dụng FSDirectory, thực thi tệp cơbản Directory Nhưng ta muốn kiểm soát việc đánh chỉ mục, sử dụng bộ nhớ và đẩy
bộ nhớ đệm lên đĩa(disk), ta có thể dùng RAMDirectory để thực hiện việc này
RAMDirectory và FSDirectory
Mọi thao tác thì FSDirectory làm trên đĩa cứng còn RAMDirectory thực hiệntrong bộ nhớ, do đó nhanh hơn Mã(code) trong ví dụ 2.5 tạo ra hai chỉ mục: mộtđược thực hiện bởi FSDirectory và một được thực hiện bởi RAMDirectory
public class FSversusRAMDirectoryTest extends TestCase {
private Directory fsDir;
private Directory ramDir;
private Collection docs = loadDocuments(3000, 5);
protected void setUp() throws Exception {
String fsIndexDir = System.getProperty("java.io.tmpdir", "tmp") + System.getProperty("file.separator") + "fs-index";
ramDir = new RAMDirectory(); //Tạo Bản ghi có nội dung chứa trong RAM
fsDir = FSDirectory.getDirectory(fsIndexDir, true); // Tạo bản ghi mà nội dung
//được lưu trong ổ cứng }
public void testTiming() throws IOException {
long ramTiming = timeIndexWriter(ramDir);
long fsTiming = timeIndexWriter(fsDir);
assertTrue(fsTiming > ramTiming); // RAMDirectory nhanh hơn FSDirectory System.out.println("RAMDirectory Time: " + (ramTiming) + " ms");
System.out.println("FSDirectory Time : " + (fsTiming) + " ms");
}
private long timeIndexWriter(Directory dir) throws IOException {
long start = System.currentTimeMillis();
addDocuments(dir);
long stop = System.currentTimeMillis();
return (stop - start);
}
private void addDocuments(Directory dir) throws IOException {
IndexWriter writer = new IndexWriter(dir, new SimpleAnalyzer(),true);
for (Iterator iter = docs.iterator(); iter.hasNext();) {
Document doc = new Document();
String word = (String) iter.next();
private Collection loadDocuments(int numDocs, int wordsPerDoc) {
Collection docs = new ArrayList(numDocs);
Trang 33Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
for (int i = 0; i < numDocs; i++) {
StringBuffer doc = new StringBuffer(wordsPerDoc);
for (int j = 0; j < wordsPerDoc; j++) {
Dù có cách tốt hơn để xây dựng tiêu chuẩn, tiêu chuẩn này cũng đủ minh họa
ưu điểm về hiệu năng của RAMDirectory so với FSDirectory Nếu ta thực hiện ví
dụ 2.5 trên và thêm các giá trị của mergeFactor và minMergeDocs, thì ta thấy tốc
độ đánh chỉ mục của FSDirectory gần bằng với tốc độ của RAMDirectory Tuynhiên cũng cần lưu lý rằng nếu không có các tham số thêm vào thì FSDirectorykhông bao giờ nhanh được như RAMDirectory
Đánh chỉ mục theo lô bằng cách sử dụng RAMDirectory như bộ đệm
Nếu ta muốn cải thiện hiệu năng của việc đánh chỉ mục với Lucene và thựchiện các phương thức: mergeFactor, maxMergeDocs, maxMergeDocs của lớpIndexWriter một cách hiệu quả, ta phải sử dụng RAMDirectory để ghi bộ đệm tớiFSDirectory Cách làm đơn giản như sau:
1 Tạo một chỉ mục FSDirectory
2 Tạo một chỉ mục RAMDirectory
3 Thêm các Bản ghi vào chỉ mục RAMDirectory
4 Mỗi lần như thế đẩy tất các các bản ghi trong bộ đệm củaRAMDirectory vào FSDirectory
5 Quay lại bước 3
Ta có thể chuyển các quy tắc đó vào đoạn giã mã của Lucene như sau:
FSDirectory fsDir = FSDirectory.getDirectory("/tmp/index",true);
RAMDirectory ramDir = new RAMDirectory();
IndexWriter fsWriter = IndexWriter(fsDir,
new SimpleAnalyzer(), true);
IndexWriter ramWriter = new IndexWriter(ramDir,
new SimpleAnalyzer(), true);
while (there are documents to index) {
Trang 34ramWriter = new IndexWriter(ramDir, new SimpleAnalyzer(),
true);
}
}
Đánh chỉ mục song song bằng cách sử dụng đa chỉ mục
Ý tưởng sử dụng RAMDirectory như một bộ đệm có thể thực hiện được, nhưhình 2.3 Ta có thể tạo ra ứng dụng đánh chỉ mục đa luồng bằng cách sử dụng nhiềuchỉ mục RAMDirectory song song với nhau, trong mỗi luồng ta trộn chỉ mục đơn
trên đĩa bằng cách sử dụng phương thức addIndexes(Directory[]) của IndexWriter
Hình 4: Một ứng dụng đa luồng sử dụng nhiều RAMDirectory cho việc đánh chỉ mục song song
2.2.3 Tìm kiếm trong ứng dụng
2.2.3.1 Thực thi một chức năng tìm kiếm đơn giản
Nếu ta muốn thêm chức năng tìm kiếm vào trong ứng dụng, ta phải lấy dữ liệu
đã được đánh chỉ mục, hiện tại đã xuất hiện cách tìm kiếm full-text cung cấp đếncho người dùng Lucene đã cung cấp nhiều cách thức tìm kiếm hiệu quả cho phép tatích hợp vào ứng dụng
Trong phần này ta sẽ tìm hiểu các lớp API của Lucene được dùng để tích hợpvào chức năng tìm kiếm
IndexSearcher Đầu vào cho việc tìm kiếm chỉ mục Tất cả việc tìm
kiếm đều qua IndexSearcher bằng việc sử dụng nhiều
Trang 35Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
phương thức search
Query( và các lớp
con) Tập trung vào các truy vấn đặc biệt
QueryParser Xử lý biểu thức nhập vào
Hits Truy xuất đến kết quả tìm kiếm, Hits được trả từ
phương thức search của IndexSearch
Bảng 3 Các lớp API của Lucene
Khi ta truy vấn đến chỉ mục Lucene, tập các kết quả(hit) được trả về, các kếtquả này sẽ có các điểm số mặc định Lucene tính toán điểm(một giá trị số tươngứng) cho mỗi bản ghi được truy vấn Trong đa số ứng dụng hiện thị kết quả tìmkiếm, người dùng thường chỉ truy xuất vào vài bản ghi đầu, vì thế sẽ không cầnthiết thu thập tất cả các kết quả mà chỉ cần lấy các bản ghi mà được hiển thị tớingười dùng
2.2.3.1.1 Tìm kiếm với thuật ngữ cụ thể
IndexSearcher là lớp trung tâm được dùng để tìm kiếm các bản ghi trong chỉmục, lớp này có nhiều phương thức tìm kiếm Ta có thể tìm kiếm với thuật ngữ cụ
thể bằng cách sử dụng phương thức search cơ bản Thuật ngữ là một giá trị được
ghép với tên trường của thuật ngữ, trong trường hợp này là chủ đề (subject)
Ta sẽ truy vấn các từ ant và junit, các từ này đã được đánh chỉ mục Ví dụ 3.1thực hiện truy vấn thuật ngữ và nhận về bản ghi mà nó tìm thấy Lucene cung cấpnhiều loại Truy vấn, TermQuery là loại cơ bản nhất
public class SearchingTest extends LiaTestCase {
public void testTerm() throws Exception {
IndexSearcher searcher = new IndexSearcher(directory);
Term t = new Term("subject", "ant");
Query query = new TermQuery(t);
Hits hits = searcher.search(query);
assertEquals("JDwA", 1, hits.length());
t = new Term("subject", "junit");
hits = searcher.search(new TermQuery(t));
assertEquals(2, hits.length());
searcher.close();
}
}
Ví dụ 3.1 Giải thích việc tìm kiếm đơn giản sử dụng TermQuery
Đối tượng Hits được trả về từ kết quả tìm kiếm, Hits truy xuất bên trong cácBản ghi Các bản ghi hoàn chỉnh không được trả về ngay lập tức, chúng được gọikhi có yêu cầu
2.2.3.1.2 Phân tích(parse) một truy vấn được nhập vào bởi người dùng:
QueryParser
Hai chức năng mà hầu hết ứng dụng tìm kiếm đều yêu cầu là: phân tích cácbiểu thức truy vấn phức tạp và truy xuất đến dữ liệu được trả về Phương thức tìm
Trang 36kiếm của Lucene đưa ra đối tượng Query Việc phân tích một biểu thức truy vấn làhành động điều chỉnh các truy vấn được người dùng nhập vào thành các đối tượngTruy vấn thích hợp Đoạn mã sau phân tích hai biểu thức truy vấn và xác nhận cáchành động Sau khi nhận về các kết quá, ta thu thập các tiêu đề(title) từ bản ghi đầutiên tìm được:
public void testQueryParser() throws Exception {
IndexSearcher searcher = new IndexSearcher(directory);
Query query = QueryParser.parse("+JUNIT +ANT -MOCK",
"contents",new SimpleAnalyzer());
Hits hits = searcher.search(query);
assertEquals(1, hits.length());
Document d = hits.doc(0);
assertEquals("Java Development with Ant", d.get("title"));
query = QueryParser.parse("mock OR junit",
QueryParser.
QueryParser cần bộ phân tích(analyzer) để chia các đoạn truy vấn thành các
thuật ngữ Xét ví dụ trên, trong biểu thức thứ nhât, truy vấn gồm toàn chữ hoa Cácthuật ngữ của trường nội dung, tuy nhiên, chúng sẽ được đưa về dạng chữ thường
khi đánh chỉ mục QueryParser trong ví dụ này sử dụng SimpleAnalyzer, sẽ chuyển
thành chữ thường trước khi xây dựng đối tượng Query QueryParser chỉ tìm kiếmđọan mà sử dụng bộ phân tích
Sử dụng QueryParser
QueryParser có phương thức parse(), là phương thức dùng đơn giản nhất:
static public Query
parse(String query, String field, Analyzer analyzer)
throws ParseException
Chuỗi(String) truy vấn(query) là biểu thức đã được phân tích, ví dụ như :
“+cat+dog” Tham số thứ 2, trường(field) là tên của trường mặc định gắn với cácthuật ngửtong biểu thức Tham số cuối cùng là một bộ phân tích(analyzer) Phương
thức testQueryParser() của ví dụ trên đã giải thích cách dùng của phương thứuc
parse().
Xử lý các biểu thức truy vấn cơ bản với QueryParser
QueryParser sẽ chuyển các biểu thức truy vấn thành các kiểu truy vấn đượcxây dựng sẵn trong Lucene
Biểu thức truy
vấn
Các bản ghi tương ứng java Chứa thuật ngữ java trong trường mặc định
java junit chứa thuật ngữ java hoặc junit hoặc cả hai trong
Trang 37Lọc và phân loại dữ liệu trên Web-Ứng dụng xây dựng hệ quản trị nội dung
java or junit trường mặc định
+java + junit
java AND junit
Chứa cả java và junit trong trường mặc định
Title : ant Chứa thuật ngữ ant trong trường title
java* Chứa các thuật ngữ bắt đầu với java như
javaserver, java.net java~ Chứa các thuật ngữ mà kết thức với từ java, như
Bởi đường dẫn file hệ thống
Ta nên sử dụng hàm khởi tạo Thư mục, hàm này tách bạch việc tìm kiếm với
việc đánh chỉ mục Trong ví dụ test ở trên- LiaTestCase, cung cấp thư
mục(directory), thực thi một Thư mục Hàm này thực sự thực thi FSDirectory được
tải từ file chỉ mục hệ thống Phương thức setUp() mở một chỉ mục sử dụng phương
thức FSDirectory.getDirectory, với đường dẫn chỉ mục được định nghĩa trong JVM
public abstract class LiaTestCase extends TestCase {
private String indexDir = System.getProperty("index.dir");
protected Directory directory;
protected void setUp() throws Exception {
IndexSearcher searcher = new IndexSearcher(directory);
Sau khi khởi tao IndexSearcher, ta gọi phương thức của nó là search để thựchiện việc tìm kiếm
Trang 38Bảng 5 Các phương thức tìm kiếm chính của IndexSearcher
IndexSearcher chỉ tìm kiếm các chỉ mục đã tồn tại tại thời điểm khiIndexSearcher được khởi tạo Nếu việc đánh chỉ mục xảy ra cùng thời điểm với việctìm kiếm thì các bản ghi mới được đánh chỉ mục sẽ không xuất hiện trong kết quảtìm kiếm
2.2.3.2.1 Làm việc với Hits
Khi gọi phương thức search(Query) ta có ngay đối tượng Hits sẵn sàng để sửdụng Kết quả của tìm kiếm được truy xuất thông qua Hits Đối tượng Hits cungcấp truy xuất hiệu quả tới kết quả tìm kiếm Các kết quả được sắp xếp tương ứngvới các từ
Có 4 phương thức trong thể hiện của Hits, chúng được liệt kê trong bảng 6
Phương thức Hits Giá trị trả về
length() Số các bản ghi có trong tập Hits
score(n) chuẩn hóa điểm của n bản ghi đầu tiên( điểm từ 0 đến
1 )
Bảng 6 Phương thức Hits cho hiệu quả truy xuất kết quả tìm kiếm
Đối tượng Hits sẽ lưu một số các bản ghi
2.2.3.3 Tạo các đối tượng truy vấn
2.2.3.3.1 Tìm kiếm bằng thuật ngữ: TermQuery
Cách cơ bản nhất để tìm kiếm một chỉ mục là dùng một thuật ngữ cụ thể.Thuật ngữ là phần nhỏ nhất đã được đánh chỉ mục, bao gồm tên trường và cặp giátrị văn bản Ví dụ 3.1 cung cấp một cách tìm kiếm cho thuật ngữ cụ thể Mã này xâydựng một đối tượng Thuật ngữ:
Term t = new Term("contents", "java");
Một TermQuery truy xuất một Thuật ngữ đơn:
Query query = new TermQuery(t);
Tất cả bản ghi có chứa từ java trong trường contents được trả về bởi quá trìnhtìm kiếm bằng cách sử dụng TermQuery
TermQuery rất hữu ích cho việc thu thập các bản ghỉ bằng khóa Nếy bản ghi
đã được đánh chỉ mục sử dụng Field.Keyword(), các giá trị giống nhau có thể được