2008-10-11 32 views
15

Khi sử dụng Lucene.Net với ASP.NET, tôi có thể tưởng tượng rằng một yêu cầu web có thể kích hoạt cập nhật cho chỉ mục trong khi một yêu cầu web khác đang thực hiện tìm kiếm. Lucene.Net có xây dựng trong nó khả năng quản lý truy cập đồng thời hay tôi phải quản lý nó, để tránh các lỗi "đang được xử lý bởi một tiến trình khác"?Lucene.Net có quản lý nhiều luồng truy cập cùng một chỉ mục, một chỉ mục trong khi chỉ mục khác đang tìm kiếm không?

EDIT: Sau khi đọc tài liệu và thử nghiệm, đây là những gì tôi nghĩ rằng tôi đã học được: Có hai vấn đề, an toàn luồng và đồng thời. Đa luồng là "an toàn" trong đó bạn không thể làm bất cứ điều gì xấu cho chỉ mục. Nhưng, nó an toàn với chi phí chỉ là một đối tượng có khóa trên chỉ mục cùng một lúc. Đối tượng thứ hai sẽ đến và ném một ngoại lệ. Vì vậy, bạn không thể để mở một tìm kiếm và mong đợi một người viết trong một chuỗi khác có thể cập nhật chỉ mục. Và nếu một luồng đang bận cập nhật chỉ mục, thì cố gắng tạo một người tìm kiếm sẽ thất bại.

Ngoài ra, người tìm kiếm sẽ thấy chỉ mục khi họ mở nó, vì vậy nếu bạn giữ chúng xung quanh và cập nhật chỉ mục, người dùng sẽ không thấy các bản cập nhật.

Tôi muốn người tìm kiếm của tôi xem các cập nhật mới nhất. Thiết kế của tôi, và nó dường như đang làm việc cho đến nay, là các nhà văn và người tìm kiếm của tôi chia sẻ một khóa, để họ không thất bại - họ chỉ cần chờ đợi - cho đến khi viết hiện tại hoặc tìm kiếm được thực hiện. Các tính năng chính của chúng tôi được hiển thị trên trang web của chúng tôi.

+0

Bạn có thể giải thích cách bạn đã triển khai khóa không? Bạn có sử dụng khóa đọc và ghi hoặc chỉ một khóa được chia sẻ không? –

+0

Một khóa chung. Tôi đã viết những gì tôi đã làm: http://ifdefined.com/blog/post/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx –

+0

Những gì bạn nói trong câu hỏi của bạn là sai: "Vì vậy, bạn có thể không để một tìm kiếm mở và mong đợi một người viết trong một luồng khác có thể cập nhật chỉ mục. Và nếu một luồng đang bận cập nhật chỉ mục, thì việc cố gắng tạo một người tìm kiếm sẽ thất bại. " Như đã đề cập trong các câu trả lời khác: "Một người viết chỉ mục hoặc người đọc có thể chỉnh sửa các tệp chỉ mục lucene trong khi tìm kiếm đang diễn ra" và ngược lại. –

Trả lời

2

Bạn không gặp vấn đề gì với việc quản lý các ghi đồng thời vào chỉ mục. Tôi đã có một con đường dễ dàng hơn với SOLR, nó tóm tắt hầu hết những khác biệt đó đối với tôi vì nó hoạt động như một máy chủ.

21

Theo this page,

Indexing và tìm kiếm không chỉ đề an toàn, nhưng an toàn quá trình. Có gì này có nghĩa là:

  • Nhiều người tìm kiếm chỉ mục có thể đọc các tập tin chỉ mục Lucene cùng một lúc.
  • Một nhà văn chỉ mục hoặc đọc có thể chỉnh sửa các tập tin chỉ mục Lucene trong khi tìm kiếm là liên tục
  • Nhiều nhà văn chỉ mục hoặc độc giả có thể thử để chỉnh sửa các tập tin chỉ mục Lucene cùng một lúc (đó là quan trọng đối với các nhà văn chỉ số/reader sẽ đóng để nó sẽ giải phóng khóa tệp ). Tuy nhiên, trình phân tích cú pháp truy vấn không phải là luồng an toàn, do đó, mỗi luồng sử dụng chỉ mục phải có trình phân tích cú pháp truy vấn riêng của mình.

Tuy nhiên, chỉ mục của chỉ mục là thread an toàn, vì vậy bạn có thể cập nhật chỉ mục trong khi mọi người đang tìm kiếm. Tuy nhiên, sau đó bạn phải đảm bảo rằng các chủ đề có chỉ mục mở người tìm kiếm đóng chúng và mở mới để nhận dữ liệu mới được cập nhật.

+0

Chi phí mở đầu của mỗi chỉ mục là bao nhiêu? –

+1

Chúng tôi có chỉ mục tìm kiếm khá lớn (nhiều gigabyte) và chi phí mở chỉ mục tại mỗi truy vấn là không đáng kể. –

+1

Cần lưu ý rằng bài viết này là về Lucene gốc cho Java. Không có đề cập đến việc thực hiện .NET, cũng không phải liệu hành vi được mô tả là một tính năng của "chuẩn" Lucene (và do đó sẽ được thực hiện lại trong Lucene.Net) hay là hành vi cụ thể của việc triển khai thực hiện. –

3

Bạn có thể gặp sự cố, nếu chuỗi chỉ mục của bạn đang tạo tài liệu mới dẫn đến việc hợp nhất một số phân đoạn chỉ mục thì các phân đoạn đã hợp nhất sẽ bị xóa và phân đoạn mới sẽ được tạo.Vấn đề là người tìm kiếm chỉ mục của bạn đã tải lên tất cả các phân đoạn khi nó được mở, như vậy là có "con trỏ" cho những phân đoạn đã tồn tại khi nó được mở. Bây giờ nếu người viết chỉ mục thực hiện một phân đoạn hợp nhất và xóa một phân đoạn, người tìm kiếm chỉ mục của bạn sẽ vẫn nghĩ rằng tệp phân đoạn tồn tại và sẽ không thành công với "lỗi không tìm thấy tệp". Những gì bạn thực sự cần làm là tách riêng chỉ mục có thể ghi của bạn khỏi chỉ mục có thể tìm kiếm của bạn, bằng cách sử dụng SOLR hoặc thực hiện sao lưu ảnh chụp nhanh chỉ mục của riêng bạn tương tự như những gì SOLR làm. Tôi đã xây dựng hệ thống rất giống với SOLR bằng cách sử dụng .NET và Lucene.NET trên Windows, sử dụng các liên kết cứng NTFS để tạo bản sao chụp nhanh hiệu quả. Tôi có thể cung cấp cho bạn thêm thông tin nếu bạn quan tâm.

+0

Xin chào Bob, tôi đang sử dụng SolrNet với asp.net mvc. Tôi bắt đầu gặp vấn đề thực sự với chỉ mục bị hỏng trong khi cố gắng thêm các mục mới trong khi tìm kiếm đang được thực hiện. Sẽ biết ơn nếu bạn có thể cung cấp bất kỳ thông tin chi tiết nào về thực tiễn tốt nhất. – Jordan

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