2010-09-30 26 views
8

Tôi cố gắng để chế tạo thử nghiệm một ứng dụng lập chỉ mục/tìm kiếm trong đó sử dụng rất ổn định nguồn dữ liệu lập chỉ mục (các diễn đàn, mạng xã hội vv), đây là một số các yêu cầu hiệu suất,Làm thế nào để xử lý các thông tin cập nhật rất thường xuyên đến một chỉ số Lucene

  1. rất nhanh kim ngạch khoảng thời gian (bằng cách này tôi có nghĩa là bất kỳ dữ liệu mới (chẳng hạn như một tin nhắn mới trên một diễn đàn) nên có sẵn trong các kết quả tìm kiếm rất sớm (ít hơn một phút))

  2. tôi cần phải loại bỏ các tài liệu cũ một cách khá thường xuyên để đảm bảo rằng các kết quả tìm kiếm không được ghi ngày tháng.

  3. Cuối cùng nhưng không kém phần quan trọng, ứng dụng tìm kiếm cần phải đáp ứng. (Độ trễ vào thứ tự của 100 mili giây, và cần hỗ trợ ít nhất 10 QPS)

Tất cả các yêu cầu tôi đã hiện có thể được đáp ứng w/o sử dụng Lucene (và đó sẽ cho tôi đáp ứng tất cả 1,2 và 3), nhưng tôi dự đoán các yêu cầu khác trong tương lai (như mức độ liên quan tìm kiếm, v.v) mà Lucene làm cho việc triển khai dễ dàng hơn. Tuy nhiên, kể từ khi Lucene được thiết kế cho các trường hợp sử dụng phức tạp hơn nhiều so với cái tôi hiện đang làm việc, tôi gặp khó khăn trong việc đáp ứng các yêu cầu về hiệu năng của tôi.

Dưới đây là một số câu hỏi,

a. Tôi đọc rằng phương thức optimize() trong lớp IndexWriter đắt tiền, và không nên được sử dụng bởi các ứng dụng cập nhật thường xuyên, các lựa chọn thay thế là gì?

b. Để thực hiện cập nhật gia tăng, tôi cần tiếp tục cam kết dữ liệu mới và cũng tiếp tục làm mới trình đọc chỉ mục để đảm bảo rằng dữ liệu mới có sẵn. Đây sẽ ảnh hưởng đến 1 và 3 ở trên. Tôi có nên thử các chỉ mục trùng lặp không? Một số cách tiếp cận phổ biến để giải quyết vấn đề này là gì?

c. Tôi biết rằng Lucene cung cấp phương thức xóa, cho phép bạn xóa tất cả tài liệu khớp với một truy vấn nhất định, trong trường hợp của tôi, tôi cần phải xóa tất cả tài liệu cũ hơn một độ tuổi nhất định, bây giờ một tùy chọn là thêm trường ngày vào mọi và sử dụng tài liệu đó để xóa tài liệu sau. Có thể làm phạm vi truy vấn trên id tài liệu (tôi có thể tạo trường id của riêng tôi vì tôi nghĩ rằng một trong những tạo ra bởi lucene giữ thay đổi) để xóa tài liệu? Có nhanh hơn so với các ngày so sánh được biểu diễn dưới dạng chuỗi không?

Tôi biết đây là những câu hỏi rất cởi mở, vì vậy tôi không tìm câu trả lời chi tiết, tôi sẽ cố gắng xử lý tất cả các câu trả lời của bạn dưới dạng đề xuất và sử dụng chúng để thông báo cho thiết kế của tôi. Cảm ơn! Vui lòng cho tôi biết nếu bạn cần bất kỳ thông tin nào khác.

Trả lời

0

A: Tôi nghĩ với các phiên bản mới nhất của Lucene, phương pháp tối ưu hóa không thực sự cần thiết và với đề xuất của tôi cho mục C, nó thực sự không cần thiết.

B: Một lần nữa, tôi nghĩ với phiên bản mới nhất của Lucene, người tìm kiếm biết khi cập nhật xong và có thể xử lý mà không cần phải làm gì đặc biệt.

C: Tôi muốn tránh xóa và chỉ tạo chỉ mục mới hàng ngày. Nếu bạn lưu trữ tuổi của tài liệu trong chỉ mục, thì bạn có thể sử dụng chỉ mục hiện có để tạo chỉ mục mới. Trong quá trình viết chỉ mục, bạn hãy tìm nạp tất cả các tài liệu trẻ, xem qua chúng và thêm chúng vào chỉ mục mới của bạn. Có một phương thức công khai được gọi là getCurrentIndex được sử dụng bởi những người tìm kiếm để lấy chỉ mục trực tiếp mới nhất. Giữ 1 hoặc 2 chỉ số cũ xung quanh chỉ trong trường hợp và bạn nên tốt để đi.

3

Bạn có thể muốn xem xét sử dụng Solr thay vì thẳng lên Lucene. Solr xử lý tất cả các yêu cầu mà bạn đã đề cập (cập nhật gần như thời gian thực, xóa tài liệu, hiệu suất/sharding, các truy vấn phạm vi) và nó sẽ làm tốt hơn mã của bạn. Bạn sẽ không phải giải quyết các vấn đề ở cấp IndexReader, tức là khi nào cần làm mới IndexReader sau khi cập nhật.

Theo như các truy vấn phạm vi, Solr có khả năng TrieField, giúp truy vấn phạm vi số siêu nhanh. Xem http://www.lucidimagination.com/blog/2009/05/13/exploring-lucene-and-solrs-trierange-capabilities/

5

Lucene hiện hỗ trợ Near Real Time Search. Về cơ bản, bạn nhận được một Reader từ IndexWriter mỗi khi bạn đang thực hiện tìm kiếm. Các thay đổi trong bộ nhớ không chuyển sang đĩa cho đến khi đạt đến kích thước bộ nhớ RAM hoặc một số commit rõ ràng được gọi trên trình ghi. Vì đĩa IO được tránh bằng cách bỏ qua commit, các tìm kiếm sẽ nhanh chóng trở lại ngay cả với dữ liệu mới.

Một trong những khó khăn với NRT của Lucene là thuật toán kết hợp chỉ mục Logarithm. Hợp nhất được ghép sau khi 10 tài liệu được thêm vào phân đoạn. Tiếp theo, 10 phân đoạn đó được hợp nhất để tạo phân đoạn với 100 tài liệu, v.v. Bây giờ, nếu bạn có 999.999 tài liệu và việc hợp nhất được kích hoạt, sẽ mất khá nhiều thời gian để trả lại, phá vỡ lời hứa "thời gian thực" của bạn.

LinkedIn đã phát hành Zoie, một thư viện ở trên cùng của Lucene giải quyết vấn đề này. Điều này là trực tiếp trong sản xuất xử lý hàng triệu bản cập nhật và tìm kiếm hàng ngày.

Chủ yếu, Lucene sẽ hỗ trợ tất cả các yêu cầu của bạn, vì bạn đang loại bỏ các cập nhật cũ và cửa sổ di chuyển gần bằng kích thước không đổi. Trong trường hợp không, bạn có thể phải thử Zoie được chứng minh trên chiến trường.

0

Bạn có thể cache người tìm kiếm chỉ mục của mình trong một khoảng thời gian ngắn và mở lại nó. Chúng tôi sử dụng cho mục đích này asp.net WebCache trong đó có CacheItemUpdateCallback được gọi ngay trước khi mục chached hết hạn.

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