I.1.1.
Phương
pháp tìm kiếm
IndexSearch
đảm bảo việc trực tiếp liên hệ với Index, và xử lí việc tạo nên các Topdoc của
Lucene.Sau khi truy vấn được phân thích thành truy vấn chuẩn thì sẽ truy vấn
đến IndexSearch và cho lại kết quả
Steps 1:
Chọn Directory
nơi Index lưu trữ
Steps 2:
Tạo Analyzer để sử dụng
Steps 3:
Tạo Query (Phân tích Query bằng QueryParser)
Steps 4:
Nhận Index
Searcher and Search
Steps 5
:
Hiển thị
kết quả
I.1.1.
Thành
phần tìm kiếm
Query and QueryParser : Lucene cung cấp nhiều cách để truy vấn nội
dung của chỉ mục. Truy
vấn luôn luôn dựa vào nội dung của lĩnh vực (fields) để phân
tích.Truy vấn bao gồm các truy vấn dài, phạm
vi truy vấn, truy vấn cụm từ, truy vấn đại diện.Có
thể được truy vấn kết hợp bằng toán tử Boolean.
QueryParser : đơn giản hóa giao diện với một cách thức chuẩn với việc người dùng phải nhập vào các truy vấn.Truy vấn là một tập
hợp các yêu
cầu tùy chọn bắt
đầu bằng '+' (bắt buột bao gồm) và'-' (không được bao
gồm)
Một yêu cầu có thể là 1 term (từ ngữ) duy nhất như "hello" cho lĩnh vực tìm kiếm mặc định, một từ ngữ (term) tìm kiếm cho một lĩnh vực được lựa chọn.
Việc đánh chỉ số (Score) được tính toán thông qua những từ ngữ giống nhau xuất hiện
nhiều. Việc Lucene đánh chỉ số và xếp hạng các tài liệu được đánh giá rất cao (xem ở chương tiếp thep )
TopDocs :
Phương pháp tìm kiếm của IndexSearcher trả về nhóm chỉ số cao (NUM_RESULTS) tài liệu phù hợp với câu truy vấn và sắp xếp
theo chỉ số (score) của nó.
Tìm kiếm
nội dung của các lĩnh vực (Fields) của tài liệu được thông qua Index Searcher.TopDoc chi là nội dung Lucene , định danh tài liệu (giá trị của chỉ số trong Top
Docs)
Chỉ Fields đã được lập chỉ mục với Field.Store.YES có thể được lấy ra sau khi tìm kiếm. Bất kỳ meta-data khác muốn lấy ra đều áp dụng nó
Analyzer :
Sử dụng các phương pháp phân tích từ ngữ tương tự như việc lập chỉ mục cho các tài liệu . Lucene cung cấp hệ tiêu chuẩn phân tích để tránh nhầm lẫn việc phân tích ngôn
ngữ
Luke :
Chúng ta có thể sử dụng ứng dụng Luke để thực
hiện các câu truy vấn với giao diện trực quan. Luke cũng có thể được sử dụng để kiểm tra nội dung của index và để tối ưu hóa công cụ tìm kiếm.
I.2.
Dữ
Liệu Lucene
I.2.1.
Dữ liệu Index
·
Một
chỉ mục ( Index ) bao gồm 1 chuỗi các tài liệu (Documents)
·
Mỗi
tài liệu (Documents) bao gồm 1 chuỗi các lĩnh vực (Field)
·
Mỗi
lĩnh vực (Field) bao gồm 1 chuỗi các từ
ngữ (Terms)
·
Mỗi
từ ngữ (Terms) là một cặp string cho tên và giá trị
Hình
12 : Mô tả dữ liệu
Các string
ở 2 lĩnh vục (Field) khác nhau được xem như là 2 từ ngữ (Term) khác nhau.Như
vậy mỗi từ ngữ (term) được biểu diển như 1 cặp xâu chữ (string),Mỗi chỉ mục (index)
của Lucene có thể bao gồm nhiều chỉ mục (index) nhỏ hay còn gọi là segments.Mỗi
segments là 1 chỉ mục hoàn toàn độc lập mà có thể tìm kiếm riêng lẻ .Và được
lập bằng cách :
·
Tạo
1 segments cho mỗi tài liệu mới thêm vào
·
Xáp
nhập các segments hiện tại
Tìm kiếm có thể bao gồm nhiều segments và/hoặc nhiều Index khác nhau.Mỗi
chỉ số có khả năng bao gồm tập hợp các
segments.
Bên trong Lucene lưu tài liệu bởi một số nguyên (interger) các tài
liệu.Tài liệu đầu tiên được thêm vào chỉ mục Index mang số 0,và mỗi tài liệu
tiếp theo được thêm vào một số lớn hơn số cũ .Và mã số tài liệu có thể thay đổi
nên lưu ý khi lưu trữ Index ngoài Lucene.Sự thay đổi có thể do nhiều lí do .
Mỗi phân đoạn chỉ mục (segments index) bảo đảm những yếu tố sau đây :
·
Field
name : Chứa các thiết lập của tên Field sử dụng trong index
·
Stored
Field values : Trong mỗi tài liệu chứa
một cặp các danh sách giá trị thuộc tính nơi mà các giá trị thuộc tính là Field
name.Nó được sử dụng để lưu trữ thông tin tài liệu như là tên ,đường dẫn ,hoặc
định danh để truy cập tài liệu .
·
Term
dictionary : Một từ điển chứa tất cả các từ ngữ (term) sử dụng trong tất cả các
lĩnh vực (field) chỉ mục cho tất cả tài liệu .Từ điển cũng chứa mã số các tài
liệu mà chứa các từ ngữ (term)
·
Term
Frequency data : Đối với mỗi từ ngữ (term) trong từ điển.Một mã số cho tất cả
các tài liệu chứa từ ngữ đó và tần số của từ ngữ trong tài liệu.
·
Term
Proximity data : Đối với mỗi từ ngữ (term) trong từ điển.Các vị trí mà từ ngữ
đó xuất hiện trong mỗi tài liệu.
·
Normalization
factors : Đối với mỗi lĩnh vực (term) trong mỗi tài liệu ,môt giá trị được lưu
trữ đó là được cộng vào tỉ số (score)
trên số truy cập trên lĩnh vực (field) đó.
·
Term
Vectors : Đối với từng field trong mỗi tài liệu các Term Vectors có thể được
lưu trữ. Mỗi Term Vectors bao gồm các từ ngữ
và tần số các từ ngữ
·
Deleted
documents : Một tùy chọn tập tin cho thấy những tài liệu đã bị xóa
Tất cả các file thuộc về 1 segments có cùng tên với phần mở rộng khác
nhau.Các phần mở rộng tương ứng với các định dạng khác nhau được mô tả như sau
:
·
.CFS File : Khi sử dụng Compound Files Format thì các tập tin này được lưu vào 1 tập tin
duy nhất đó là .CFS.Thông thường tất cả các segments trong một index được lưu
trữ trong 1 đường dẫn duy nhất.Tuy nhiên những phiên bản sau này từ 2.1 trở lên
tên file không bao giờ được sử dụng lại(mở rộng .Gen).Điều này làm được bằng
các tiếp cận đơn giản .Ví dụ segments
đầu tiên của file là segments_1, sau đó là segments_2..
·
Lock
File : Một file .lock tạo ra được sử
dụng để chỉ ra một tiến trình khác được ghi vào Index .Tập tin này không được
lưu trữ trong đường dẫn file index của chính nó,mà trong thư mục tạm thời của
hệ thống .Các khóa được viết dưới tên “XXXX-write.lock” .XXXX là tiền tố chỉ
đường dẫn của thưu mục .Khi file này xuất hiện
thì một xử lí hiện tại là thêm tài liệu và Index hoặc là loại bỏ file
khỏi Index .Lock file giúp ngăn ngừa nhiều
xử lí sửa đổi 1 index trong cùng một thời gian.
Compound
Files Format : Một loại đinh dạng file
dùng để lưu trữ thông tin hay nội dung tất cả các loại file được lập Index.Bắt
đầu từ phiên bản 1.4 thì Compound Files Format
được đặt mặc định.Đơn giản là một danh sách chứa tất cả các mô tả cho
tập tin .Các định dạng chính được lưu trữ trong Index : Byte, UInt32, Uint64,
Vint, Chars, String...
·
Segments
File : Mỗi Segments hoạt động trong index được lưu trữ trong một file chú thích
của Segments (Segments_N).Có thể có 1 hay nhiều Segments File trong 1 Index.Khi
một tập tin Segments cũ (Segments_N) xuất hiện bởi vì chúng tạm thời không thể
xóa hoặc là 1 quá trình ghi đang hoạt động.Tập tin này liệt kê các Segments
theo tên ,chi tiết các thuộc tính riêng biệt của mỗi Segments, và kích thước
các phân đoạn.Trong phiên bản 2.1 trở lên thì có thêm tập tin “segments.gen”.File này chứa vị trí
hiện tại của Index như _N là vị trí thứ N của .Như chứa Format, Version,
NameCounter, SegCount, <SegName, SegSize>SegCount của Segment.
1. Format, NameCounter, SegCount,
SegSize, NumField lưu dạng Int32
2. Version, DelGen, NormGen lưu dạng
Int64
3. SegName lưu dạng String
4. IsCompoundFile, HasSingleNormFile lưu
dạng Int8
·
Version
: Tính toán thường xuyên các index đã thay đổi bằng cách thêm vào hoặc xóa đi
tài liệu.
·
NameCounter
: Dùng để tạo ra tên file Segments mới.
·
SegName
: là tên của Segments và được sử dụng như là tiền tố của tên tất cả các
Segments chứa trong index
·
SegSize
: là số tài liệu chứa trong Segments index
·
DelGen
: Riêng biệt file xóa , nếu là -1 xóa bình thường, nếu là 0 thì kiểm tra lại hệ
thống tập tin thứ _X.del
·
NumField
: kích thước của mảng lưu trữu NormGen .
NormGen ghi lại tất cả chỉ tiêu cho file tập tin.
·
IsCompoundFile
: Ghi lại các Segments như là một tập hợp file hoặc không .Nếu là -1 thì
Segments không phải là tập hợp file.Nếu là 1 thì Segments là 1 tập hợp.Nếu là 0
thì kiểm tra lại hệ thống xem có file _X.cfs tồn tại không.
·
.Fdx
File ,.Fdt File hoặc .fnm : Chú thích về
Field
·
TermInfoFile
(.tis) : Chú thích về Term
I.1.1.
Trọng
số và xếp hạng mục từ
Tính trọng
số là phần trung tâm của Lucene.Đối tượng được đánh gía là Document.Đánh giá
dựa trên các Field và sau đó trả kết quả về là tài liệu .
Được xây
dựng dựa trên mô hình so khớp (BM) và mô hình không gian vector,mô tả trong
lớp Similarity
.Trọng số của truy vấn q trong tài liệu d tương quan giữa tính toán cosin tài liệu và truy vấn trong không gian vector
.Và được tính theo công thức :
tf(t,d)
: Tần số xuất hiện của
mục từ t trong tài liệu d .Được tính
bằng căn bậc 2 của tần số f(t,d)
tf(t,d) = sqrt[f(t,d)]
itf(t) : Là
tần số nghịch đảo tần số xuất hiện của tài liệu t.Giá trị tương quan với nghịch
đảo của DocFreq(số lượng tài liệu trong đó từ ngữ t xuất hiện) .numDocs là tổng
số tài liệu khác
boost(t):
Là thời gian tìm kiếm tăng của từ ngữ t trong truy vấn q theo qui định của truy
vấn văn bản .
norm(t,d):
Thời gian lập chỉ mục và yếu tố độ dài.Bao gồm Document boost thêm tài liệu vào
index, Field boost thêm các trường vào 1 tài liệu. Khi một tài liệu được thêm vào chỉ mục, tất
cả các yếu tố trên được nhân rộng. Nếu tài liệu có nhiều trường có cùng tên, tất cả tăng thời gian được nhân với nhau:
norm(t,d)= Document boost . Field boost
Coord(d,q):
Là 1 yếu tố tỉ số dựa trên rất nhiều ngôn ngữ truy vấn được tìm ra trong các
tài liệu đặc biệt.Thông thường 1 tài liệu chứa nhiều truy vấn từ ngữ sẽ nhận
được tỉ số cao hơn tài liệu khác với ít truy vấn hơn .Đây là yếu tố thời gian
tìm kiếm tăng lên với yếu tố này.
QuerryNorm(q)
:Là 1 yếu tố được sử dụng để làm cho trọng số giữa các truy vấn tương đương.Yếu
tố này không ảnh hưởng đến việc xếp hạng tài liệu mà để so sánh trọng số giữa
các truy vấn.
I.1.2.
Cấu
trúc tập tin nghịch đảo Index (FTS index types)
Lucene Index là một dữ liệu cơ cấu cho phép truy cập nhanh ngẫu nhiên các từ được lưu trữ bên trong nó , gần
giống như dữ liệu lưu trữ với file nhị phân
Lucene sử dụng “Inverted Index” một để tạo ra các chỉ số riêng và hợp nhất các chỉ số theo thời gian theo thời gian.Invert
index là trung tâm của từ khoá công cụ tìm kiếm, trong cách tiếp cận này, các tài liệu được xử lý để tạo nên một danh sách các vị trí (posting) và dùng để mô tả sự xuất hiện của một từ trong một tài liệu .
Mục từ
|
Tài liệu , trọng số
|
T1
|
(2,w1) ,(3,w2),(4,w3)
|
T2
|
(3,w4) ,(4,w5),(5,w6)
|
T3
|
(2,w7)
|
T4
|
(2,w9)
|
Bảng
trên có nghĩa là tài liệu T1 xuất hiện trong các tài liệu 2,3,4 với các trọng
số tương ứng w1,w2,w3
Index chứa số liệu thống kê về các từ ngữ(term) để sắp xếp dựa trên tìm kiếm hiệu quả hơn.
Lucene index rơi vào các quan hệ của chỉ mục biết đến như là Inverted index. Điều này là bởi vì nó có thể liệt kê, cho term, các tài liệu có chứa nó. Đây là nghịch đảo tự nhiên mối quan hệ, trong đó danh sách các trường term của tài liệu. Trong Lucene, term có thể được lưu trữ,
trong trường hợp văn bản của họ được lưu
trữ trong chỉ mục .Một field có thể được làm
cả hai là lưu trữ và lập chỉ mục.Các kí tự của 1 term có thể
được mã hoá làm điều kiện để cho việc lập chỉ
mục, hoặc các kí tự của 1 trường term có thể được sử dụng như
là một thuật ngữ được lập chỉ mục. Hầu hết các term được mã hoá, nhưng đôi
khi nó rất hữu ích cho một số nhận diện các term để được lập chỉ mục
Sử dụng bảng inverted index ,
cho 6 tài liệu cần lập Index ,sau khi các token tách các term sẽ lưu các tần số
và posting list cho từng term như sau :
Khi ta truy vấn một nội dung như “ in
the night” thì cho thấy chỉ có tài liệu 1
và 5 là có đủ ba từ “ in “ ”the”
“ night”.
Nhưng chỉ có tài liệu 5 là sắp xếp 3 từ “ in the night” theo liền nhau.Nhờ vào
bảng “term posions”
I.1.3.
Tối
ưu hóa bộ nhớ Index
·
Lucene
lưu trữ dữ liệu bằng cách
1.
Lập
Index cho mỗi tài liệu thêm vào
- Và sắp xếp các theo các phân đoạn cho postings,thuận lợi cho
việc tìm kiếm sau này
·
Tạo
1 ngăn xếp cho mỗi tài liệu mới lập sao đó đưa tài liệu vào ngăn xếp , cứ b tài
liệu thì lấy ra nhập lại thành một Index
và đưa vào ngăn xếp