Lucene hoạt động như thế nào


90

Tôi muốn biết cách tìm kiếm lucene hoạt động nhanh như vậy. Tôi không thể tìm thấy bất kỳ tài liệu hữu ích nào trên web. Nếu bạn có bất cứ điều gì (thiếu mã nguồn lucene) để đọc, hãy cho tôi biết.

Trong trường hợp của tôi, một truy vấn tìm kiếm văn bản sử dụng tìm kiếm văn bản mysql5 có chỉ mục mất khoảng 18 phút. Một tìm kiếm lucene cho cùng một truy vấn mất chưa đầy một giây.


2
Tôi có thể yêu cầu chuyển câu hỏi này thành wiki cộng đồng không? Lucene bây giờ có vẻ giống như một nền tảng.
asyncwait

Câu trả lời:


75

Lucene là một chỉ mục toàn văn được đảo ngược. Điều này có nghĩa là nó lấy tất cả các tài liệu, chia chúng thành các từ và sau đó xây dựng một chỉ mục cho mỗi từ . Vì chỉ mục là một chuỗi khớp chính xác, không có thứ tự, nó có thể cực kỳ nhanh. Theo giả thuyết, một chỉ mục không có thứ tự SQL trên một varchartrường có thể nhanh như vậy và trên thực tế, tôi nghĩ bạn sẽ thấy các cơ sở dữ liệu lớn có thể thực hiện một truy vấn bình đẳng chuỗi đơn giản rất nhanh trong trường hợp đó.

Lucene không phải tối ưu hóa để xử lý giao dịch. Khi bạn thêm một tài liệu, nó không cần đảm bảo rằng các truy vấn sẽ thấy nó ngay lập tức . Và nó không cần tối ưu hóa để cập nhật các tài liệu hiện có.

Tuy nhiên, vào cuối ngày, nếu bạn thực sự muốn biết, bạn cần phải đọc nguồn. Xét cho cùng, cả hai thứ bạn tham khảo đều là mã nguồn mở.


Nếu tôi hiểu chính xác, điều khiến các công cụ tìm kiếm văn bản khác biệt là cách chúng xử lý các tìm kiếm nhiều từ và kết hợp các kết quả tìm kiếm thành nhiều chỉ mục trong thời gian thực. Tôi sẽ không đề nghị tham khảo nguồn Lucene cho điều này. Có lẽ sẽ tốt hơn nếu đọc một chút về lý thuyết tìm kiếm văn bản, câu trả lời của @ alieCoder đã giúp tôi.
Chris Dutrow

1
@bmargulies, Nếu lập chỉ mục là "mỗi từ", thì tại sao tìm kiếm người dùng stackoverflow stackoverflow.com/users cho phép kết hợp chuỗi con?
Pacerier

2
Đây không phải là nơi dành cho những câu trả lời toàn cuốn sách. Có bất kỳ số lượng chi tiết nào về khái niệm cơ bản trong đó.
bmargulies

Ý bạn là "chỉ mục cho mỗi từ" ... nếu tôi bắt đầu nhập "abc", làm thế nào để tìm thấy "abc" trong tài liệu?
Alexander Mills

1
Một chỉ mục (B-tree) từ từ sang tài liệu có thể tìm kiếm tài liệu theo từng từ trong tài liệu vì bảng của chỉ mục đó là (từ, tài liệu) nơi chỉ mục nằm trên cột từ. Hãy xem xét một truy vấn như: "Tìm tài liệu có các từ 'cảnh sát', 'tội phạm', 'thống kê'" trong đó. Bằng cách tìm kiếm chỉ mục từ, bạn có thể thực hiện ba lần tìm kiếm nhật ký (N) để lấy tài liệu O (N) có một trong những từ đó trong đó. Sau đó, bạn có thể thực hiện hai vòng lặp O (N) để xây dựng một tập hợp chứa các tài liệu có cả ba từ. Mặc dù về mặt lý thuyết đây là một phép toán O (N), hầu hết các tài liệu không có cả ba từ nên chữ O (n) của nó trong đó n <N.
Calicoder

34

Lucene tạo ra một chỉ số lớn. Chỉ mục chứa id từ, số tài liệu có từ đó và vị trí của từ trong các tài liệu đó. Vì vậy, khi bạn đưa ra một truy vấn từ đơn, nó chỉ tìm kiếm chỉ mục (độ phức tạp thời gian O (1)). Sau đó, kết quả được xếp hạng bằng cách sử dụng các thuật toán khác nhau. Đối với truy vấn nhiều từ, chỉ cần lấy phần giao nhau của tập hợp các tệp có các từ hiện diện. Vì vậy, Lucene rất nhanh.

Để biết thêm thông tin, hãy đọc bài viết này của các nhà phát triển Google- http://infolab.stanford.edu/~backrub/google.html


8
Đọc lướt qua bài báo đó, nó khá hữu ích. Cụ thể là "4,5 Searching" đã có câu trả lời mà tôi đang tìm kiếm. Cụ thể, nghe có vẻ như tìm kiếm băm O (1) được sử dụng cho các từ riêng lẻ, nhưng sau đó quét O (n) được sử dụng để nối kết quả với giới hạn 40.000 tài liệu. Tôi giả sử một thuật toán thu nhỏ bản đồ được sử dụng để chia nhỏ công việc này để người dùng nhận được kết quả tức thì.
Chris Dutrow

Một thuật toán phổ biến là thuật toán xếp hạng chim bồ câu. Mặc dù tôi không biết nhiều về nó.
alieCoder,

3
Bài báo đó gây cười: "Trong bài báo này, chúng tôi giới thiệu Google, một nguyên mẫu ...". Tôi đoán Google không phải lúc nào cũng là một tập đoàn lớn.
Buttons840

không biết Lucene, nhưng một câu hỏi: Xếp hạng xảy ra ở mỗi lần tìm kiếm? Hay nó duy trì các tài liệu được xếp hạng trước? Nếu nó duy trì các tài liệu theo thứ hạng trước thì nó sẽ duy trì như thế nào đối với truy vấn nhiều từ?
Vikas Prasad

Liên kết bị hỏng ngay bây giờ. @alienCoder
CEGRD

20

Nói một cách ngắn gọn: lập chỉ mục.

Lucene tạo một chỉ mục cho tài liệu của bạn để cho phép nó tìm kiếm nhanh hơn nhiều.

Đó là sự khác biệt giống nhau giữa cấu trúc dữ liệu danh sách O (N) và cấu trúc dữ liệu bảng băm O (1). Danh sách phải đi qua toàn bộ bộ sưu tập để tìm những gì bạn muốn. Bảng băm có một chỉ mục cho phép nó tìm ra chính xác vị trí của mục mong muốn và chỉ cần tìm nạp nó.

Cập nhật:

Tôi không chắc ý bạn là "Tìm kiếm chỉ mục Lucene nhanh hơn nhiều so với tìm kiếm chỉ mục mysql."

Tôi đoán là bạn đang sử dụng MySQL "WHERE tài liệu LIKE '% cụm từ%'" để tìm kiếm tài liệu. Nếu điều đó đúng, thì MySQL phải thực hiện quét bảng trên mọi hàng, hàng này sẽ là O (N).

Lucene có thể phân tích tài liệu thành các mã thông báo, nhóm chúng thành n-gam theo hướng của bạn và tính toán các chỉ số cho từng mã thông báo đó. Đó là O (1) để tìm một từ trong tài liệu Lucene được lập chỉ mục.


10
Vâng, tôi hiểu phần lập chỉ mục, nhưng một lần nữa, tìm kiếm chỉ mục lucene nhanh hơn rất nhiều so với tìm kiếm chỉ mục mysql. Làm thế nào điều đó xảy ra
Midhat

8

Lucene hoạt động với Tần suất kỳ hạn và Tần suất tài liệu nghịch đảo . Nó tạo ra một chỉ mục ánh xạ từng từ với tài liệu và đó là số lượng tần suất không là gì ngoài chỉ mục nghịch đảo trên tài liệu.

Ví dụ :

Tập tin 1: Bộ nhớ Truy cập Ngẫu nhiên là bộ nhớ chính.

Tệp 2: Đĩa cứng là bộ nhớ phụ.

Lucene tạo ra một chỉ mục ngược giống như

Tệp 1:

Điều khoản: Ngẫu nhiên

Tần suất: 1

Chức vụ: 0

Thuật ngữ: Bộ nhớ

Tần số: 2

Chức vụ: 3

Chức vụ: 6

Vì vậy, nó có thể tìm kiếm và lấy nội dung đã tìm kiếm một cách nhanh chóng. Khi có quá nhiều kết quả phù hợp cho truy vấn tìm kiếm, nó sẽ xuất ra kết quả dựa trên trọng số. Hãy xem xét truy vấn tìm kiếm "Bộ nhớ chính" nó tìm kiếm tất cả 4 từ riêng lẻ và kết quả sẽ như thế nào,

Chủ yếu

Tệp 1: Tần suất - 1

Ký ức

Tệp 1: Tần suất - 2

Tệp 2: Tần suất - 1

Kết quả sẽ là File1 theo sau là File2 . Để không bị quá tải bởi các từ phổ biến nhất như 'và', 'hoặc', 'nó sẽ xem xét tần suất nghịch đảo của tài liệu (nghĩa là' nó làm giảm trọng lượng của từ phổ biến nhất trong bộ tài liệu).

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.