Thứ Tư, 8 tháng 5, 2013

QUÁ TRÌNH TÌM KIẾM VỚI THƯ VIỆN LUCENE


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ả







Hình 11 : Mô Hình Tìm kiếm của  Search Lucene


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ố  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  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   để 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 .


Hình 13 : Mô hình xếp hạng ranking Lucene
Đượ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  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 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  , 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  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)
Table 5 : Bảng các mục từ nghich đảo
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ì  có thể liệt kê, cho term, các tài liệu  chứa . Đâ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 

Vidu 7 : Sử dụng bảng Inverted Index
    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”
Như vậy kết quả trả về sẽ là tài liệu 5



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
2.      Nhập các chỉ số lại với nhau

Hình 14: Nhập Index mỗi tài liệu lại với nhau


  • 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

Hình 15 : Chi tiết việc nhập Index

·         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

Hình 16 : Tạo ngăn xếp cho tài liệu





Thứ Tư, 27 tháng 6, 2012

QUÁ TRÌNH LẬP CHỈ MỤC VỚI THƯ VIỆN LUCENE


I.1.               Lập Chỉ Mục – Index của Lucene

I.1.1.           Phương pháp lập chỉ mục

Một Documemt có nhiều fields, mỗi fields có nhiều value.Và sau đây là hình vẽ biểu diển hoạt động lập Index của Lucene
Sau khi tách các field của document (3 field tạo nên 1 document) sau đó sẽ tiến hành phân tích và ghi dữ liệu vào Index 



Steps 1 :
Chọn đường dẫn lưu Index
Steps 2 :
Tạo  Analyzer cho tài liệu
Steps 3 :
Tạo Document và thêm Fields
Steps 4 :
Lấy Index Writer and thêm Document
Steps 5 :
Đóng Index

           

                      

Hình 7 : Mô hình  lập Index  của Lucene


I.1.2.           Thành phần  lập chỉ mục Index

·         Directory
1.      Lucene cung cấp nhiều cách để lưu trữ Inverted Index như database,cơ sở dữ liệu Index
2.      IndexWriter  IndexSearcher cung cấp đồng  thời các kiểm soát đến ứng dụng để chắc chắn sự trọn vẹn của chỉ mục
·         Analyzers
1.      Lucene và nhà phát triển thứ 3 đã phát triển tập hợp phong phú các phân tích xác định trước  với những hỗ trợ của các ngôn ngữ khác nhau
2.      Chức năng chính của phân tích là trả về 1 Token Stream .Một  Token Stream thực hiện như 1 đường ống thác đi qua   Tokenizer tạo bởi tập hợp các token filter khác 
3.      Tokenizer phân tích các field của tài liệu , loại bỏ các cú pháp thành phần  và tạo ra 1 dãy các token.Token gồm có <text, type, start, length, positionIncrement>.s
4.      Token filter xử lí , thay đổi, tập hợp các thành phần trong dãy token stream.Ví dụ nổi bật như là Token filter như là loại bỏ các tiếp đầu ngữ , loại bỏ các stop word …

Hình 8 : Quá trình Analyser
Chức năng Analyser bao gồm 2 chức năng là  TokenizerToken Filters
·         Tokenizer nhiệm vụ tách các  kí tự vào Token
·         Token Filters nhiệm vụ sửa đổi các Token
Bao gồm :
·         WhitespaceTokenizer
·         StandardTokenizer
·         LowerCaseFilter
·         StopFilter and more...

Vidu 4 : Xử lí ngôn ngữ tiếng Anh
  Trong tài liệu tiếng Anh
StandardTokenizer & Analyzer sẽ xử lí như sau :
·         Khoảng trống và dấu chấm câu  xử lí trên các Token khác nhau
·         Loại bỏ những từ chung ít liên quan đến nội dung văn bản như “a”,”the”...
·         Nó xử lí  "AT&T", "I.B.M.", etc. như là 1 Token
·         Email address: quangsoft@gmail.com  không tách ra các trường như “quangsoft” , “@”..
·         Streaming :  lập chỉ mục của các từ khi chúng xuất hiện chính xác  có thể có vấn đề trong tìm kiếm.Xóa bỏ tiền tố và hậu tố
Vidu 5 : Về Streaming
1.       book, books →book
2.       like, liked, liking →lik
3.       take, took, taken, taking →t ?
·         Trong quá trình tách từ Lucene còn sử dụng từ điển Lemma  hỗ trợ
Vidu 6 : Sử dụng từ điển
1.      book, books →book
2.      like, liked, liking →like
3.      take, took, taken, taking → take
Hiện nay từ điển từ điển Lemma  trong Lucene hỗ trợ cho 18 loại ngôn ngữ và sử dụng công nghê Rosette Linguistics Platform để xử lí việc tách từ tự động cho các  các ngôn ngữ này.

Hình 9 : Các ngôn ngữ hỗ trợ trong từ điển

Hình 10 : Mô hình Rosette Linguistics Platform

·         Field
Giúp Lucene có thể lưu trữ các thuộc tính bổ sung cho mỗi tài liệu trong chỉ mục.Mục đích của Field gồm có :
1.      Khả năng giới hạn tìm kiếm trên những đối tượng meta-data xác định (như chỉ có tiêu đề , tác giả..)
2.      Khả năng lưu trữ dữ liệu để xác định các tài liệu
Tạo ra 1 Fields gồm 3 lựa chọn :
1.      Field.Store: YES or NO : Chỉ ra nội dung cần được lưu trữ , NO có nghĩa là nội dung chỉ được phân tích nhưng không để tìm kiếm.YES cho các thuộc tính xác định. Ví dụ như bao gồm : ID, tên file , tài liệu, ngày thêm , kích thước tài liệu..
2.      Field.Index : Giá trị chính được ANALYZED.NO chỉ ra lĩnh vực nội dung không được ANALYZED, nó cũng không thể tìm kiếm thuộc tính như vậy , ANALYZED được sử dụng cho nội dung được tìm kiếm
3.      Field.TermVector : Cho phép tinh chỉnh các Term vector được giữ trong chỉ mục