2011-10-08 31 views
5

Chúng tôi đang sử dụng Sitecore 6.4 và đang sử dụng mô-đun tìm kiếm nâng cao nguồn được chia sẻ và đang thấy sự suy giảm lớn trong hiệu suất tìm kiếm trang web khi quá trình tái lập chỉ mục Sitecore khởi động và cập nhật các thay đổi vào cơ sở dữ liệu web.Hiệu suất tìm kiếm Sitecore khi lập chỉ mục lại và tùy chỉnh IndexingProvider

Khi chúng tôi khởi chạy một trang web đầy đủ xuất bản, người quản lý lập chỉ mục chọn lên các thay đổi và xử lý các bản ghi lịch sử, lần lượt tái lập chỉ mục từng mục đã bị ảnh hưởng. Khi điều này xảy ra trên mỗi mục, bạn có thể thấy chỉ mục Lucene trên đĩa thay đổi trong khi xem thư mục (số lượng tệp phát triển và thay đổi khi bạn xem tệp).

Nếu bạn thử và tìm kiếm trên trang web công cộng khi điều này xảy ra, tìm kiếm có thể mất nhiều thời gian hơn để hoàn thành; và dưới tải nặng, có thể mất đến 15 giây lâu hơn cho đến khi quá trình tái lập chỉ mục kết thúc.

Tôi có thể thấy quy trình này được kiểm soát bởi lớp IndexingProvider. Có cách nào để ghi đè lên lớp này và thực hiện riêng của chúng tôi?

Chúng tôi đã xem xét logic tìm kiếm và có thể thấy rằng đối tượng IndexSearchContext được tạo mỗi khi tìm kiếm được yêu cầu, do đó tạo ra một IndexSearcher mới. Chúng tôi đã thay đổi một số logic để IndexSearchContext được giữ nguyên như một singlton, điều này tất nhiên có nghĩa là nhiều yêu cầu có thể được phục vụ bởi cùng một Lucene IndexSearcher. Điều này đã làm giảm đáng kể mức tiêu thụ bộ nhớ khi sử dụng cùng một searher được khuyến khích để tăng hiệu suất.

Tuy nhiên, khi thực hiện việc này, các thay đổi đối với chỉ mục sẽ không được chọn cho đến khi tạo IndexSearcher mới. Chúng tôi cần một cách để thông báo cho mã của chúng tôi rằng quá trình lập chỉ mục đã hoàn tất và sau đó chúng tôi có thể đặt lại đối tượng IndexSearchContext đơn lẻ của chúng tôi. Làm thế nào chúng ta có thể tích hợp logic này vào mã được cấu hình Sitecore?

Khi xây dựng lại chỉ mục theo cách thủ công, chỉ mất khoảng 5 giây để hoàn thành. Rõ ràng điều này có hiệu quả xóa chỉ mục và sau đó tạo lại tất cả nhưng tại sao mục theo cập nhật mục mất quá lâu? Có cách nào tốt hơn trong đó quá trình cập nhật có thể đạt được mà không đi mục theo mục và nó không ảnh hưởng đến trang web công cộng không?

Tôi đã mong đợi những người khác bị ảnh hưởng bởi vấn đề này vì vậy tôi muốn nghe mọi người giải quyết vấn đề như thế nào.

EDIT - thông tin bổ sung từ Sitecore diễn đàn

Mã Sitecore.Search dường như để tận dụng nặng của việc tạo ra/xử lý đối tượng Lucene mới cho một hoạt động đơn lẻ. Nó dường như không thể mở rộng quá mức cho các môi trường lớn, đó là lý do tại sao tôi đã rất ngạc nhiên khi thấy mã. Đặc biệt nếu các chỉ mục lớn và có rất nhiều nội dung cập nhật/xuất bản mỗi ngày.

Nhìn vào các lớp học thông qua dotPeek Tôi không thể thấy cách chúng tôi sẽ ghi đè lên IndexUpdateContext vì nó được tạo trong một phương thức không ảo. Một DatabaseCrawler tùy chỉnh có thể nhận được một số truy cập nhưng chỉ với đối tượng bối cảnh đã được tạo ra.

Tôi nhận thấy rằng chúng tôi có thể xác định triển khai chỉ mục của riêng mình trong web.config cho từng chỉ mục. Chúng tôi cũng có thể triển khai lại trình thu thập thông tin (chúng tôi đã có trình thu thập thông tin nâng cao được đặt ra từ mô-đun được chia sẻ) và có thể kiểm soát quá trình lập chỉ mục. Tôi sẽ miễn cưỡng rút ra quá nhiều mã Sitecore vào việc triển khai của chính chúng ta vì nó có thể ảnh hưởng đến các bản cập nhật trong tương lai.

Tôi có một câu hỏi mặc dù liên quan đến IndexingProvider.Trong phương pháp sau:

private void UpdateItem(HistoryEntry entry, Database database) 
    { 
     int count = database.Indexes.Count; 
     if (count != 0 || this.OnUpdateItem != null) 
     { 
     Item obj = database.GetItem(entry.ItemId, entry.ItemLanguage, entry.ItemVersion); 
     if (obj != null) 
     { 
      if (this.OnUpdateItem != null) 
      this.OnUpdateItem((object) this, (EventArgs) new SitecoreEventArgs("index:updateitem", new object[2] 
      { 
       (object) database, 
       (object) obj 
      }, new EventResult())); 
      for (int index = 0; index < count; ++index) 
      database.Indexes[index].UpdateItem(obj); 
     } 
     } 
    } 

Nó kích hoạt sự kiện cập nhật, được xử lý bởi DatabaseCrawler khi nó được gắn với sự kiện IndexingProvider.OnUpdateItem; nhưng tại sao phương thức trên cũng gọi phương thức Sitecore.Data.Indexing.Index.UpdateItem? Tôi nghĩ rằng không gian tên đã được khấu hao trong phiên bản 6.5 vì vậy tôi ngạc nhiên khi thấy một liên kết giữa không gian tên mới và cũ.

Vì vậy, có vẻ như DatabaseCrawler đang xử lý bản cập nhật, thao tác này sẽ xóa mục và sau đó thêm lại nó vào chỉ mục; và sau đó Sitecore.Data.Indexing.Index cũ cũng cố gắng cập nhật nó. Chắc chắn có gì đó sai ở đây? Tôi không biết mặc dù vậy xin vui lòng sửa tôi nếu tôi sai, đây chỉ là những gì nó trông giống như khi tôi theo dõi thông qua các mã biên dịch mà không cần bất kỳ gỡ lỗi.

+0

Điều này có vẻ như (công cụ và khá gọn gàng) tiên tiến bạn đang muốn làm (và đã làm cho đến nay). Có lẽ bạn nên cố gắng nói chuyện với Sitecore về nó ... nếu bạn có những cải tiến, tôi chắc chắn rằng họ thích nghe về họ :) – Holger

+1

Hi Tim, tôi chỉ có thể tưởng tượng điều này, khi chỉ mục hoặc là hoàn toàn xây dựng lại trên mỗi xuất bản hoặc nếu bạn có một lượng lớn người dùng đang tìm kiếm. Bạn có một lượng lớn khách truy cập hoặc một thứ gì đó đặc biệt được thiết lập để xây dựng lại không? Bạn có thể thử và vô hiệu hóa cập nhật của chỉ mục và sau đó làm thử nghiệm tương tự? Nó có thể liên quan đến việc xuất bản nói chung và không chỉ là việc lập chỉ mục. –

+0

@Jens, cảm ơn chúng tôi sẽ cố gắng vô hiệu hóa quá trình chỉ mục. Tôi không cảm thấy như chúng tôi đang làm bất cứ điều gì khác thường về quy mô nội dung hoặc lượng khách truy cập. Trang web tương đối nhỏ. Nhưng chúng ta cần biết hiệu suất sẽ mở rộng. Nếu chỉ mục được xây dựng lại hoàn toàn thì nó hoạt động nhanh hơn rất nhiều, khoảng 5 giây để xây dựng lại hoàn toàn.Cập nhật từng mục một có thể mất nhiều thời gian hơn nhiều như bạn sẽ hình ảnh. –

Trả lời

2

Tôi muốn giới thiệu hai điều:

  1. Sử dụng Advanced Database Crawler (v2 là phiên bản mới nhất) mà kết thúc tốt đẹp trong không gian tên Sitecore.Search. Điều này làm cho nó rất dễ sử dụng Lucene.NET với Sitecore.

  2. Tạo lại chỉ mục đầy đủ hàng ngày. Điều này chống phân mảnh các chỉ mục dưới dạng phân mảnh theo thời gian có thể làm giảm hiệu suất (có thể là vấn đề của bạn ở đây).

+0

Tôi đã thử sử dụng ADC, nó sẽ tác động đến giải pháp của bạn. Sau đó, tôi đã xóa nó. –

1

Tôi đã gặp các vấn đề tương tự trước đây. Khi tôi đã được phân tích những gì đã xảy ra tất cả các thời gian đã được chi tiêu trong việc mở chỉ mục cho mỗi tìm kiếm.

Cách chúng tôi cuối cùng giải quyết nó là bằng cách bỏ qua các lớp chỉ mục của Sitecore và đi thẳng tới Lucene. Lucene cung cấp phương thức "Mở lại" chỉ mở các tệp phân đoạn đã sửa đổi, trái với tất cả các tệp phân đoạn như Sitecore thực hiện.

Vì vậy, những gì chúng tôi làm là:

  1. mở một đọc Index nếu chúng ta không có một cái nào
  2. Tạo một tài liệu tham khảo mức ứng dụng để nó, vì vậy mà chúng ta có thể tái sử dụng nó
  3. trên mỗi cuộc gọi tìm kiếm "Mở lại" vào người đọc chỉ số ứng dụng
  4. Tìm kiếm

có một cái nhìn tại Lucene.Net.Index.IndexReader.Reopen tôi Thod Documentation

Bạn có thể tạo một đọc Index từ Sitecore.Search.Index.CreateReader()

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