Làm thế nào để lucene chỉ mục tài liệu?


95

Tôi đọc một số tài liệu về Lucene; Tôi cũng đọc tài liệu trong liên kết này ( http://lucene.sourceforge.net/talks/pisa ).

Tôi không thực sự hiểu cách Lucene lập chỉ mục tài liệu và không hiểu Lucene sử dụng thuật toán nào để lập chỉ mục?

Trên liên kết trên, nó cho biết Lucene sử dụng thuật toán này để lập chỉ mục:

  • thuật toán gia tăng:
    • duy trì chồng chỉ số phân khúc
    • tạo chỉ mục cho mỗi tài liệu đến
    • đẩy các chỉ mục mới vào ngăn xếp
    • đặt b = 10 là hệ số hợp nhất; M = 8

for (size = 1; size < M; size *= b) {
    if (there are b indexes with size docs on top of the stack) {
        pop them off the stack;
        merge them into a single index;
        push the merged index onto the stack;
    } else {
        break;
    }
}

Làm thế nào để thuật toán này cung cấp lập chỉ mục được tối ưu hóa?

Lucene có sử dụng thuật toán B-tree hoặc bất kỳ thuật toán nào khác như vậy để lập chỉ mục không - hay nó có một thuật toán cụ thể?


Hầu hết các câu trả lời ở đây đều đúng rằng Lucene đầu tiên tạo ra chỉ mục đảo ngược, nhưng điều đó không giải thích điểm quan trọng về cách mà chỉ mục thuật ngữ đó sau đó được tìm kiếm (và tôi tin rằng OP thực sự đã yêu cầu những gì). Vì vậy, dưới đây xin vui lòng tìm một câu trả lời mới cho câu hỏi khá cũ này, hy vọng cung cấp cái nhìn sâu sắc hơn.
fnl

1
Đã cập nhật câu trả lời của tôi một lần nữa, bởi vì các câu trả lời hiện tại (bao gồm cả câu trả lời của tôi!) Không thực sự thỏa đáng để trả lời hai câu hỏi chính của OP (làm thế nào Lucene cung cấp lập chỉ mục được tối ưu hóa và bằng thuật toán cụ thể nào - Danh sách bỏ qua, không phải Cây B, BTW). Hy vọng cập nhật cuối cùng của tôi bây giờ trả lời đúng câu hỏi thực tế!
fnl

Câu trả lời:


54

Có một bài viết khá hay ở đây: https://web.archive.org/web/20130904073403/http://www.ibm.com/developerworks/library/wa-lucene/

Chỉnh sửa 12/2014: Cập nhật lên phiên bản lưu trữ do bản gốc đã bị xóa, có lẽ giải pháp thay thế tốt nhất gần đây hơn là http://lucene.apache.org/core/3_6_2/fileformats.html

Thậm chí còn có phiên bản mới hơn tại http://lucene.apache.org/core/4_10_2/core/org/apache/lucene/codecs/lucene410/package-summary.html#package_description , nhưng có vẻ như có ít thông tin hơn hơn cái cũ hơn.

Tóm lại, khi lucene lập chỉ mục một tài liệu, nó sẽ chia nó thành một số thuật ngữ. Sau đó, nó lưu trữ các điều khoản trong một tệp chỉ mục trong đó mỗi thuật ngữ được liên kết với các tài liệu chứa nó. Bạn có thể nghĩ về nó giống như một bảng băm.

Các thuật ngữ được tạo ra bằng cách sử dụng một trình phân tích để đưa từng từ về dạng gốc của nó. Thuật toán gốc phổ biến nhất cho ngôn ngữ tiếng Anh là thuật toán gốc Porter: http://tartarus.org/~martin/PorterStemmer/

Khi một truy vấn được đưa ra, nó sẽ được xử lý thông qua cùng một trình phân tích được sử dụng để tạo chỉ mục và sau đó được sử dụng để tra cứu (các) thuật ngữ phù hợp trong chỉ mục. Điều đó cung cấp một danh sách các tài liệu phù hợp với truy vấn.


Cảm ơn câu trả lời của bạn và các liên kết. Nhưng tôi nghe nói rằng dự án Lucene có một ứng dụng gốc đặc biệt tên là "Snowball"? Bạn có nghe gì về điều đó không?
Mehdi Amrollahi

Đây là một câu hỏi khác: Xem lucidimagination.com/search/… Ngoài ra, nhìn thấy mẫu câu hỏi của bạn, tôi khuyên bạn nên đọc cuốn sách 'Lucene in Action': manning.com/hatcher2 (Ấn bản đầu tiên hơi cũ, nhưng có thể tìm thấy trong phiên bản cây chết. Có thể mua phiên bản thứ hai dưới dạng sách điện tử).
Yuval F

5
Bạn có thể thay đổi bạn trả lời, mắt xích đầu tiên mà là một mắt xích của IBM không tìm thấy :)
Adelin

Ngoài ra, làm thế nào để các trường nhập toàn bộ bức tranh? Nếu một truy vấn nằm trên một trường cụ thể, làm thế nào và tại thời điểm nào lucene biết rằng thuật ngữ trỏ đến tài liệu không nằm ở bất kỳ đâu trong tài liệu, mà nằm trong trường được yêu cầu?
Levon Tamrazov

44

Tóm lại, Lucene xây dựng một chỉ mục đảo ngược bằng cách sử dụng Skip-Lists trên đĩa , sau đó tải ánh xạ cho các cụm từ được lập chỉ mục vào bộ nhớ bằng Bộ chuyển đổi trạng thái hữu hạn (FST). Tuy nhiên, lưu ý rằng Lucene không (nhất thiết) tải tất cả các thuật ngữ được lập chỉ mục vào RAM , như được mô tả bởi Michael McCandless, tác giả của chính hệ thống lập chỉ mục của Lucene. Lưu ý rằng bằng cách sử dụng Skip-Lists, chỉ mục có thể được chuyển từ lần truy cập này sang lần truy cập khác, làm cho những thứ như đặt và đặc biệt, có thể truy vấn phạm vi (giống như B-Trees). Và mục nhập Wikipedia về lập chỉ mục Danh sách Bỏ qua cũng giải thích tại sao việc triển khai Danh sách Bỏ qua của Lucene được gọi là đa cấpSkip-List - về cơ bản, để O(log n)có thể tra cứu (một lần nữa, giống như B-Trees).

Vì vậy, một khi chỉ mục (hạn) đảo ngược - dựa trên cấu trúc dữ liệu Skip-List - được xây dựng từ các tài liệu, chỉ mục sẽ được lưu trữ trên đĩa. Lucene sau đó tải (như đã nói: có thể, chỉ có một số) những điều khoản vào một nhà nước đầu dò hữu hạn , trong một thực hiện FST lỏng lẻo lấy cảm hứng bởi Morfologick .

Michael McCandless (cũng) thực hiện một công việc khá tốt và ngắn gọn là giải thích cách thức và lý do tại sao Lucene sử dụng FST (mạch vòng tối thiểu) để lập chỉ mục các thuật ngữ mà Lucene lưu trữ trong bộ nhớ, về cơ bản là một SortedMap<ByteSequence,SomeOutput>, và đưa ra ý tưởng cơ bản về cách FST hoạt động (tức là, cách FST thu gọn các chuỗi byte [tức là các điều khoản được lập chỉ mục] để làm cho việc sử dụng bộ nhớ của ánh xạ này phát triển thành tuyến tính phụ). Và anh ấy cũng chỉ vào bài báo mô tả thuật toán FST cụ thể mà Lucene sử dụng.

Đối với những người tò mò tại sao Lucene sử dụng Skip-danh sách, trong khi hầu hết cơ sở dữ liệu sử dụng (B +) - và / hoặc (B) -Trees, hãy nhìn vào những ngay câu trả lời SO liên quan đến câu hỏi này (Skip-Lists vs B-Trees). Câu trả lời đó đưa ra một lời giải thích khá hay và sâu sắc - về cơ bản, không quá nhiều khiến các bản cập nhật đồng thời của chỉ mục trở nên "khả thi hơn" (bởi vì bạn có thể quyết định không cân bằng lại B-Tree ngay lập tức, do đó đạt được hiệu suất đồng thời như Skip-List), nhưng đúng hơn, Skip-Lists giúp bạn không phải làm việc với hoạt động cân bằng (bị trì hoãn hoặc không) (cuối cùng) được B-Trees cần (Trên thực tế, như câu trả lời hiển thị / tham chiếu, có lẽ có rất ít sự khác biệt về hiệu suất giữa B-Trees và [nhiều cấp] Skip-Lists, nếu một trong hai là "thực hiện đúng".)


1
Afaik họ đang sử dụng Skip Danh sách thay vì B-cây để giảm số lượng đĩa tìm, kể từ khi một phần của Skip Danh sách nằm trong bộ nhớ và rất ít đĩa IO đòi hỏi khi đi qua chỉ số
Anton

24

Có vẻ như câu hỏi của bạn nhiều hơn về việc hợp nhất chỉ mục hơn là về việc lập chỉ mục chính nó.

Quá trình lập chỉ mục khá đơn giản nếu bạn bỏ qua các chi tiết cấp thấp. Lucene hình thành cái được gọi là "chỉ mục ngược" từ các tài liệu. Vì vậy, nếu tài liệu có văn bản "Có hay không" và id = 1 xuất hiện, chỉ mục đảo ngược sẽ trông giống như:

[to] → 1
[be] → 1
[or] → 1
[not] → 1

Về cơ bản đây là nó - chỉ mục từ từ đến danh sách các tài liệu có chứa từ đã cho. Mỗi dòng của chỉ mục (từ) này được gọi là danh sách đăng. Chỉ số này vẫn tồn tại khi lưu trữ lâu dài.

Trong thực tế, tất nhiên mọi thứ phức tạp hơn:

  • Lucene có thể bỏ qua một số từ dựa trên Trình phân tích cụ thể đã cho;
  • các từ có thể được xử lý trước bằng cách sử dụng thuật toán gốc để giảm độ linh hoạt của ngôn ngữ;
  • danh sách đăng không chỉ có thể chứa số nhận dạng của tài liệu, mà còn có thể chứa từ đã cho bên trong tài liệu (có thể là một số trường hợp) và một số thông tin bổ sung khác.

Có nhiều biến chứng khác không quá quan trọng đối với sự hiểu biết cơ bản.

Tuy nhiên, điều quan trọng cần hiểu là chỉ mục Lucene chỉ là phần phụ . Trong một số thời điểm ứng dụng quyết định cam kết (xuất bản) tất cả các thay đổi trong chỉ mục. Lucene hoàn thành tất cả các hoạt động dịch vụ bằng chỉ mục và đóng nó, vì vậy nó có sẵn để tìm kiếm. Chỉ số sau khi cam kết về cơ bản là không thay đổi. Chỉ mục này (hoặc phần chỉ mục) được gọi là phân đoạn . Khi Lucene thực hiện tìm kiếm cho một truy vấn, nó sẽ tìm kiếm trong tất cả các phân đoạn có sẵn.

Vì vậy, câu hỏi đặt ra - làm thế nào chúng ta có thể thay đổi tài liệu đã được lập chỉ mục ?

Tài liệu mới hoặc phiên bản mới của tài liệu đã được lập chỉ mục được lập chỉ mục trong các phân đoạn mới và các phiên bản cũ bị vô hiệu trong các phân đoạn trước bằng cách sử dụng cái gọi là danh sách hủy . Danh sách hủy là phần duy nhất của chỉ mục đã cam kết có thể thay đổi. Như bạn có thể đoán, hiệu quả lập chỉ mục giảm dần theo thời gian, vì các chỉ mục cũ có thể chứa hầu hết các tài liệu đã bị loại bỏ.

Đây là lúc hợp nhất xuất hiện. Hợp nhất - là quá trình kết hợp một số chỉ mục để tạo chỉ mục tổng thể hiệu quả hơn. Điều cơ bản xảy ra trong quá trình hợp nhất là các tài liệu trực tiếp được sao chép sang phân đoạn mới và phân đoạn cũ bị xóa hoàn toàn.

Sử dụng quy trình đơn giản này Lucene có thể duy trì chỉ mục ở trạng thái tốt về hiệu suất tìm kiếm.

Hy vọng nó sẽ hữu ích.


1
Vì vậy, vì lợi ích của việc tìm kiếm các kết quả cập nhật nhất trước tiên, liệu một tìm kiếm có bắt đầu bằng cách xem xét các phân đoạn mới nhất không? Vì vậy, chỉ để làm rõ - giả sử một tài liệu được cập nhật. Phiên bản cũ hơn của tài liệu được thêm vào danh sách kết thúc, sau đó bất kỳ kết quả phù hợp nào được tìm thấy trong các phân đoạn cũ hơn sẽ bị xóa khỏi kết quả tìm kiếm nếu id tài liệu của chúng khớp với id trong danh sách kết thúc?
Joel B

2
Ư, bạn đung. Điều duy nhất cần đề cập là thứ tự cuối cùng được xác định bằng cách sử dụng các quy tắc sắp xếp (chỉ số mức độ liên quan trong trường hợp nhỏ), do đó thứ tự các phân đoạn được tìm kiếm không có liên quan.
Denis Bazhenov

12

Nó là chỉ mục đảo ngược , nhưng điều đó không chỉ định cấu trúc nó sử dụng. Định dạng chỉ mục trong lucene có thông tin đầy đủ.
Bắt đầu với 'Tóm tắt các Phần mở rộng Tệp'.

Đầu tiên bạn sẽ nhận thấy rằng nó nói về nhiều chỉ mục khác nhau. Theo như tôi có thể nhận thấy không có cách sử dụng nào trong số này nói đúng một cây B , nhưng có những điểm tương đồng - các cấu trúc trên giống như cây.


1
Chỉ số đảo ngược của Lucene dựa trên danh sách bỏ qua, không phải cây B. Vẫn là một cấu trúc dạng cây theo nghĩa rất rộng, nhưng chỉ để hoàn chỉnh - ví dụ, xem câu hỏi SO này lại. Lucene của việc sử dụng một bỏ qua danh sáchcâu hỏi này SO tại sao skip-danh sách có thể là một lợi thế so với B-cây .
fnl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.