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.
Đ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
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. –
@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. –