2008-09-23 20 views
15

Chúng tôi chạy toàn bộ chỉ mục lại cứ 7 ngày một lần (tức là tạo chỉ mục từ đầu) trên chỉ mục Lucene của chúng tôi và các chỉ mục gia tăng sau mỗi 2 giờ. Chỉ số của chúng tôi có khoảng 700.000 tài liệu và chỉ số đầy đủ mất khoảng 17 giờ (đó không phải là vấn đề).Một chỉ số có nên được tối ưu hóa sau các chỉ số gia tăng trong Lucene không?

Khi chúng tôi lập chỉ mục gia tăng, chúng tôi chỉ lập chỉ mục nội dung đã thay đổi trong hai giờ qua, vì vậy phải mất ít thời gian hơn - khoảng nửa giờ. Tuy nhiên, chúng tôi đã nhận thấy rằng rất nhiều thời gian này (có thể là 10 phút) được dùng để chạy phương thức IndexWriter.optimize().

Các LuceneFAQ đề cập rằng:

Lớp IndexWriter hỗ trợ một phương pháp tối ưu hóa() mà làm gọn cơ sở dữ liệu chỉ mục và tăng tốc độ truy vấn. Bạn có thể muốn sử dụng phương pháp này sau khi thực hiện một chỉ mục hoàn chỉnh của bộ tài liệu của bạn hoặc sau khi cập nhật gia tăng của chỉ mục. Nếu bản cập nhật gia tăng của bạn thêm tài liệu thường xuyên, bạn chỉ muốn thực hiện tối ưu hóa một lần trong một thời gian để tránh phải trả thêm chi phí cho việc tối ưu hóa.

... nhưng điều này dường như không đưa ra bất kỳ định nghĩa nào về ý nghĩa "thường xuyên". Tối ưu hóa là CPU chuyên sâu và VERY IO-chuyên sâu, vì vậy chúng tôi muốn không được làm điều đó nếu chúng ta có thể nhận được ngay với nó. Bao nhiêu là hit của các truy vấn đang chạy trên một chỉ mục chưa được tối ưu hóa (tôi đang suy nghĩ đặc biệt về hiệu năng truy vấn sau một chỉ mục đầy đủ so với sau 20 chỉ số gia tăng trong đó, 50.000 tài liệu đã thay đổi)? Chúng ta có nên tối ưu hóa sau mỗi chỉ số gia tăng hoặc là hiệu suất đạt được không đáng?

Trả lời

16

Mat, vì bạn dường như có ý tưởng hay về quá trình hiện tại của bạn mất bao lâu, tôi khuyên bạn nên xóa optimize() và đo lường tác động.

Nhiều tài liệu có thay đổi trong các cửa sổ 2 giờ đó không? Nếu chỉ có một phần nhỏ (50.000/700.000 là khoảng 7%) được tái lập chỉ mục từng bước, thì tôi không nghĩ rằng bạn đang nhận được nhiều giá trị từ một số optimize().

Một số ý tưởng:

  • Đừng làm một gia tăng optimize() ở tất cả. Kinh nghiệm của tôi nói rằng bạn không nhìn thấy một cải tiến truy vấn lớn anyway.
  • Thực hiện optimize() hàng ngày thay vì 2 giờ.
  • Thực hiện optimize() trong thời gian âm lượng thấp (đó là những gì javadoc nói).

Và đảm bảo bạn thực hiện các phép đo. Những loại thay đổi này có thể là một shot trong bóng tối mà không có chúng.

+0

Các loại thay đổi này * là * ảnh trong bóng tối không có chúng. –

+0

Chúc mừng, tôi đã tự hỏi liệu mọi người có trải nghiệm điều này trước khi tôi đi sâu vào và bắt đầu rối tung với hệ thống sản xuất không :) –

+0

Mat: vâng, tôi nhận ra bạn đang tìm kiếm lời khuyên cụ thể, và tôi đã nói chung một chút. Theo kinh nghiệm của tôi (tôi đã sử dụng Lucene trong nhiều năm), bạn sẽ ổn mà không cần tối ưu hóa(). Tôi đã loại bỏ quyền tối ưu hóa() từ trên các hệ thống của chúng tôi vì chi phí của nó. –

4

An hoạt động optimize đọc và ghi toàn bộ chỉ mục, đó là lý do tại sao nó quá IO! Ý tưởng đằng sau hoạt động tối ưu hóa là kết hợp lại tất cả các phân đoạn khác nhau trong chỉ mục Lucene thành một phân đoạn duy nhất, điều này có thể làm giảm đáng kể thời gian truy vấn khi bạn không phải mở và tìm kiếm một số tệp cho mỗi truy vấn. Nếu bạn đang sử dụng cấu trúc tập tin chỉ mục Lucene bình thường (chứ không phải cấu trúc kết hợp), bạn sẽ có một phân đoạn mới cho mỗi thao tác commit; giống như các chỉ mục của bạn mà tôi cho là?

Tôi nghĩ rằng Matt có lời khuyên tuyệt vời và tôi muốn thứ hai mọi thứ anh ấy nói - được thúc đẩy bởi dữ liệu bạn có.Tôi thực sự sẽ đi một bước xa hơn và chỉ optmize a) khi bạn cần và b) khi bạn có khối lượng truy vấn thấp.

Khi hiệu suất truy vấn được liên kết mật thiết với số lượng phân đoạn trong chỉ mục của bạn, một đơn giản ls -1 index/segments_* | count có thể là chỉ báo hữu ích khi nào cần thực hiện tối ưu hóa.

Cách khác, theo dõi hiệu suất truy vấn và khối lượng và bắt đầu tối ưu hóa khi bạn đạt được hiệu suất thấp không được chấp nhận với khối lượng chấp nhận được thấp sẽ là giải pháp tốt hơn.

2

Trong this mail, Otis Lời khuyên từ gododnetic chống lại bằng cách tối ưu hóa, nếu chỉ mục của bạn nhìn thấy cập nhật liên tục. Đó là từ năm 2007, nhưng gọi optimize() là trong nó rất tự nhiên một hoạt động IO-nặng. Bạn có thể xem xét sử dụng một cách tiếp cận từng bước hơn; a MergeScheduler

Các vấn đề liên quan