3.1.2. Tìm hiểu các lớp đối tượng tìm kiếm
Giao diện tìm kiếm cơ bản của Lucenec cung cấp tương tự như trong lập chỉ mục. Chỉ có một vài class là cần thiết để thực hiện các hoạt động tìm kiếm.
IndexSearcher: mở tập chỉ mục đã được tạo trước bởi đối tượng IndexWriter và
tiến hành tìm kiếm trên nó. Nó cung cấp một số phương pháp tìm kiếm, một số trong số đó được thực hiện trong class Searcher của nó.
Term: là đơn vị cơ bản nhất để tìm kiếm. Đối tượng Term cần hai tham số:
tham số thứ nhất cho biết tên của Field và tham số thứ hai cho biết giá trị của Field đó. Đối tượng Term cũng tham gia vào quá trình lập chỉ mục. Trong quá trình tìm kiếm, có thể xây dựng các đối tượng Term và sử dụng chúng cùng với TermQuery.
Query: lớp đối tượng truy vấn thông tin. Thư viện Lucene hỗ trợ một số loại
truy vấn như: TermQuery, BooleanQuery, PhraseQuery, PrefixQuery, … Tất cả các đối tượng truy vấn này đều được dẫn xuất từ lớp cha Query.
Term Query: là loại truy vấn cơ bản nhất được hỗ trợ trong Lucene, và nó là
một trong những loại truy vấn nguyên thủy. Nó được sử dụng cho phù hợp với tài liệu chứa lĩnh vực cụ thể.
Hit: là lớp đối tượng đơn giản chứa con trỏ để xếp hạng kết quả tìm kiếm tài
liệu phù hợp với một truy vấn nhất định. Đối với hiệu suất tìm kiếm, Hit không load từ
tập chỉ mục tất cả các tài liệu phù hợp với truy vấn. Mỗi tài liệu trong danh sách sẽ có mã xác định docID để truy xuất đến tài liệu kết quả.
3.2 Lập chỉ số trong Lucene
Để tìm kiếm các tập tin được lưu trữ trong ổ đĩa cứng hoặc tìm email, trang web hoặc dữ liệu trong cơ sở dữ liệu, Lucene có thể hỗ trợ người dùng làm được điều đó. Tuy nhiên trước khi tìm kiếm dữ liệu thì tập dữ liệu phải được lập chỉ mục.
3.2.1. Các tiến trình lập chỉ số
a. Chuyển đổi sang dạng văn bản
Để tiến hành index được trong Lucene thì trước hết phải chuyển đổi dữ liệu thành dạng văn bản thuần túy(plain text,như file .txt chẳng hạn). Điều này quan trọng bởi vì dữ liệu được lưu trữ dưới nhiều dạng file khác nhau (pdf, word, excel, powerpoint, html…), trong đó Lucene chỉ hỗ trợ index các Field dạng String, Date hoặc đối tượng Reader mà thôi. Để thực hiện được điều này không đơn giản. Chẳng hạn, chúng ta cần lập chỉ mục cho các tập tài liệu được định dạng PDF. Để chuẩn bị quá trình lập chỉ mục trước tiên phải truy xuất các thông tin văn bản từ tài liệu PDF để
tạo ra các trường Document và Field trong Lucene.
b. Phân tích (Analysis)
Mỗi khi chuẩn bị cho việc index và tạo ra đối tượng Document với các Field thì
Lucene sẽ phân tích dữ liệu này sao cho phù hợp nhất với việc index. Để làm điều này, Lucene sẽ phân chia dữ liệu thành các chuỗi hoặc là các kí tự thông qua việc lựa chọn các toán tử thực thi trên chúng. Chẳng hạn như việc phân tích thành các kí tự thường,
hoặc bỏ đi các từ ngữ không có nghĩa gọi là stop words (a, an, the, in, on, và so on)
trong văn bản tiếng anh.
c. Tiến trình lập chỉ số (index writing)
Sau khi dữ liệu được phân tích nó sẽ sẵn sàng cho việc lập chỉ mục. Lucene sẽ chứa dữ liệu này theo cấu trúc inverted index (chỉ mục đảo). Hiệu quả đáng kể với cấu trúc này trong tiết kiệm dung lượng ổ đĩa và cho phép tìm kiếm nhanh hơn các từ khóa trong quá trình search. Nguyên tắc của nó là thay vì phải tìm kiếm các từ nào chứa trong tài liệu đó thì với cấu trúc này sẽ tối ưu hóa việc tìm ra câu trả lời “tài liệu nào
Hình 3.1 Các thao tác chính trong tiến trình lập chỉ mục [16]
Lucene cung cấp những API cơ bản thực hiện đánh chỉ mục trên toàn nội dung văn bản và sau đó có thể tìm kiếm dựa trên tập tin chỉ mục đảo (inverted index) mà Lucene tạo ra khi thực hiện lập chỉ mục.
3.2.2 Các toán tử cơ bản trong lập chỉ số với Lucene
Lucene hỗ trợ các toán tử giúp thực hiện việc đánh chỉ mục như:
Thêm các tài liệu mới để lập chỉ mục (Adding documents to an index): Thêm tài liệu mới (Document) cùng các trường (Fields): Keyworks,UnIndexed,UnStored và
Text. Trong mỗi tài liệu lại có thể có chứa nhiều Fields cùng tồn tại, và trong mỗi
Fields lại có thêm nhiều giá trị khác nhau.
Xóa tập tài liệu ra khỏi chỉ mục: (Removing Documents from an index) Sử dụng
lớp IndexReader với phương thức delete() có thể dễ dàng xóa bỏ tài liệu được chỉ định ra khỏi chỉ mục. Lucene sẽ xem như các tài liệu này được đánh dấu như là sẽ xóa. Tuy nhiên việc này chỉ có thể thực hiện khi gọi hàm close().
Hủy bỏ việc xóa tài liệu (Undeleting Documents): Như đã đề cập,việc thực sự
xóa bỏ tài liệu khi gọi phương thức close() của lớp IndexReader. Do đó trước khi thực sự xóa tài liệu này thì chỉ cần gọi phương thức undeleteAll() của cùng lớp IndexReader trước đó sẽ xóa bỏ đi các tài liệu được đánh dấu xóa bỏ.
Cập nhật tài liệu trong tập chỉ mục (Updating Documents in an index): Lucene
không hỗ trợ thưc hiện việc cập nhật tài liệu, thay vào đó ta sẽ xóa bỏ tài liệu và sau đó thêm lại tài liệu mới thay thế. Chú ý rằng để đảm bảo tốc độ thực thi thì tốt nhất việc xóa bỏ và thêm tài liệu mới nên thực hiện theo khối, không nên xen lẫn giữa việc xóa và thêm tài liệu mới.
3.2.3 Khuếch đại các tài liệu và các trường
Trong quá trình index không phải tất cả các tài liệu và trường (Documents and Fields) cũng có độ ưu tiên như nhau, gọi là điểm ưu tiên (Score). Nếu như có ý định sắp xếp kết quả trả về trong quá trình tìm kiếm theo nhưng tiêu chí nào đó chẳng hạn như là sắp xếp theo điểm ưu tiên thì chúng ta cần phải boost tài liệu hoặc trường cần sắp xếp. Mặc định tất cả các tài liệu đều không có boost hoặc là boost là 1.0. Do đó muốn thay đổi độ ưu tiên này chỉ cần gọi hàm setBoost(float) cho Document hoặc Field nào đó mà ta mong muốn. Độ ưu tiên (độ boost) càng cao thì tài liệu càng quan trọng và ngược lại .
3.2.4 Điều khiển tiến trình lập chỉ số
Với các ứng dụng nhỏ thì việc index dữ liệu là không lớn, ta hoàn toàn có thể mặc định index theo cài đặt của Lucene. Tuy nhiên với các ứng dụng lớn, khi mà dung lượng tài liệu lên đến hàng triệu thì tốc độ index là điều hết sức quan trọng, thay vì phải mất hàng giờ thì có thể chỉ mất hàng phút mà thôi.
Điều chỉnh việc thực thi đánh chỉ mục: Trong các ứng dụng đánh chỉ mục điển hình thì trở ngại chính là việc ghi chỉ mục xuống đĩa. Vì vậy phải điều chỉnh làm sao cho Lucene tự “thông minh” trong việc đánh chỉ mục với các tài liệu mới cũng như bổ sung các file có sẵn.
Hình 3.2 Bộ nhớ đệm giúp cải thiện hiệu suất lập chỉ mục của Lucene [16]
Như đã thấy, mỗi khi thêm tài liệu mới vào chỉ mục chúng sẽ được khởi tạo vào trong bộ nhớ đệm thay vì ghi trực tiếp xuống đĩa. Sử dụng bộ nhớ đệm này có nhiều lí do và quan trọng hàng đầu vẫn là cải thiện tốc độ index. Lucene cho phép điều chỉnh các tham số này một cách dễ dàng.