Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 3

I.

Near-real-time search

- Là tính năng mới được Lucene hỗ trợ từ version 2.9.

1. Mục tiêu: Searcher có thể tìm kiếm trên những thông tin vừa được cập nhật mà không
cần phải đợi đến khi Writer gọi hàm comit() hoặc close().

2. Cách thực hiện: gọi phương thức được cung cấp bởi class IndexWriter:

IndexReader getReader();

- Phương thức này thực hiện flush tất cả thông tin trong buffer(thông tin của những
Document được thêm mới hoặc xóa nếu có) vào Directory. Sau đó tạo ra một
IndexReader(read only) mà có chứa cả thông tin của những Document mới này.
- Phương thức này tạo ra một reader mới theo cách hiệu quả nhất: tất cả những segment cũ
được sử dụng chung với những reader đã được mở trước đó cùng với segment chứa thông
tin những document vừa được cập nhật. Do đó rút ngắn đáng kể thời gian khởi tạo.
3. Tối ưu hóa thời gian tìm kiếm:
- Index-to-search delay: là khoảng thời gian từ khi những Document được thêm mới, hiệu
chỉnh hoặc xóa cho đến khi searcher thấy được những thay đổi này trong kết quả tìm
kiếm của họ.
- Việc gọi phương thức getReader() hoặc reopen một reader sẽ làm chậm băng
thông(throughput) xử lý. Nguyên nhân là do IndexWriter ngay lập tức flush thông tin
buffer trong RAM vào một segment mới thay vì có thể chờ cho tới khi những thông tin
này chứa đầy buffer RAM của nó.
4. ..............
II. Hỗ trợ đánh index và tìm kiếm dữ liệu Tiếng Việt trong Lucene: Trong Lucene, để hỗ trợ
tính năng tìm kiếm với các từ khóa không dấu, không phân biệt hoa thường... Ta cần định
nghĩa lại lớp Analyzer cùng với lớp Tokenizer riêng extend từ các lớp cơ bản có sẳn và
bổ sung thêm phần xử lý chuyển đổi kí tự có dấu thành không dấu trong quá trình tạo các
Tokenizer từ TokenStream.

1. Định nghĩa lại lớp Analyzer và Tokenizer:


a. Lớp Analyer: Cụ thể trong phương thức TokenStreamComponents
createComponents(...) của lớp Analyer mà mình xây dựng. Cấu hình các thuộc
tính cần sử dụng để đáp ứng mục tiêu split những chuỗi dữ liệu thô ban đầu thành
các term theo định dạng mong muốn dựa trên các kí tự phân biệt(khoảng trắng,
các kí tự đặc biệt ...). Chuyển đổi tất cả các term thành các kí tự thường và sử
dụng class Tokenizer đã được customize để bỏ dấu các tearm Tiếng Việt.
b. Lớp Tokenizer: Nhằm đáp ứng mục tiêu searh Tiếng Việt không dấu. Lớp này
được customize từ các lớp cơ bản đã có với mục tiêu loại bỏ dấu của các kí tự
trong các tearm Tiếng Việt trong lúc thực hiện đánh index. Việc bỏ dấu các kí tự
được thực hiện cụ thể trong hàm boolean incrementToken() của lớp Tokenizer
mà mình xây dựng. Trong đó ta gọi char[] buffer = termAtt.buffer(); để lấy
mảng các kí tự trong tearm. Tiến hành kiểm tra, nếu đó là kí tự có dấu, thay thế
các kí tự này bằng các kí tự không dấu tương ứng.
2. Xử lý khi tìm kiếm với từ khóa Tiếng Việt:
a. Sử dụng QueryParser: Tạo các QueryParser với các Analyzer tương ứng khi thực
hiện đánh index. Cụ thể trong trường hợp này, sử dụng các Lớp Analyzer mà ta
xây dựng để parse chuỗi từ khóa tìm kiếm thành các tearm chứa kí tự không dấu.
b. Sử dụng các Query cụ thể như TermQuery, PhraseQuery, FuzzyQuery,
MultiPhraseQuery ... Những Query implement nào có sử dụng các Tearm để thực
hiện tìm kiếm thì ta cần extend lại lớp đó. Bên trong bản thân mỗi lớp, tiến hành
bỏ dấu các kí tự chứa trong các tearm.
III. Concurrency, thread safety, và cơ chế locking trong Lucene

1. Thread và multi-JVM safety:

- Cùng một thư mục Index, có thể mở cùng lúc nhiều IndexReaders có trạng thái
readonly trong cùng một JVM hoặc trên nhiều JVM, cùng một máy tính hay trên
nhiều máy tính. Cùng một IndexReader instance có thể chia sẻ cho nhiều thread cùng
sử dụng.
- Chỉ cho phép một writer được mở trên một thư mục index tại một thời điểm. Lucene
sử dụng cơ chế ghi log file để thực hiện ràng buộc này. Ngay khi Writer được tạo ra,
file log được khóa lại cho đến khi Writer gọi hàm close, file log mới được giải phóng.
Nếu IndexReader thực hiện những thao tác làm thay đổi thư mục Index, nó phải ghi
log file thành công trước khi thực hiện những thay đổi đối với thư mục index.
- Những IndexReader có thể mở khi IndexWriter được tạo ra để cập nhật thông tin trên
thư mực Index. Mỗi IndexReader chỉ có thể nhìn thấy dữ liệu trong index ở thời điểm
mà nó được mở ra. Những thay đổi mà IndexWriter thực hiện sẽ không được nhìn
thấy cho đến khi writer gọi phương thức comit hoặc close và reader gọi reopened.
2. Cách thực hiện: gọi phương thức được cung cấp bởi class IndexWriter:

You might also like