2011-11-24 18 views
6

Tình hìnhSitecore Lucene: tái-index con (hoặc mẹ) các mặt hàng về việc cập nhật mục

Tôi có sau cấu hình Sitecore Lucene:

  • chỉ số mới, type = "Sitecore.Search.Index , Sitecore.Kernel "
  • Chứa hai trình thu thập thông tin (một trình thu thập thông tin tùy chỉnh bổ sung thêm các trường" được tính ")
  • Mỗi trình thu thập xử lý mẫu GUID cụ thể của nó, vì chúng chứa các trường được tính toán khác nhau

Vấn đề

Các lĩnh vực tính toán được dựa trên cha/con lĩnh vực. Làm thế nào Lucene trong Sitecore dường như được thiết lập, là chỉ có các tài liệu cho các mặt hàng đã thực sự thay đổi được cập nhật trong chỉ mục.

Như vậy, các trường được tính toán trên các tài liệu khác (bắt buộc, có các điều kiện tìm kiếm trên các trường này) không được cập nhật.

Câu hỏi

Có một khả năng tự kích hoạt các bản cập nhật của các mặt hàng khác trong chỉ mục?
Tôi đã xem xét kế thừa Sitecore.Search.Index, nhưng không có phương pháp nào có liên quan là ảo.

Ngoài ra, tôi đã cố gắng đăng ký với các sự kiện IndexingProvider:
sự kiện công khai EventHandler OnRemoveItem;
sự kiện công khai EventHandler OnRemoveVersion;
sự kiện công khai EventHandler OnUpdateItem;

Ý tưởng đằng sau điều này là kích hoạt sự kiện OnUpdateItem trong DatabaseCrawler cho các mục khác cần được cập nhật, nhưng bạn không thể kích hoạt sự kiện này từ bên ngoài IndexingProvider.

Có cách nào để kích hoạt cập nhật chỉ mục mà không thực hiện xây dựng lại đầy đủ, không liên quan đến việc lưu/tái xuất bản các mục khác đó không?

Cảm ơn!
Sander

Trả lời

4

Cập nhật chỉ mục được kích hoạt thông qua HistoryEngine, có sự kiện và phương thức công khai, do đó bạn có thể sử dụng trình xử lý sự kiện trên công cụ lịch sử để phát hiện khi thay đổi xảy ra yêu cầu nhập lại. lịch sử cho các mục cha/con bạn cần phải reindex là tốt.

Sitecore.Data.Managers.IndexingManager.InitializeEventHandlers() có ví dụ về việc đính kèm trình xử lý vào các cơ sở dữ liệu HistoryEngine.

Sau đó lôgic xử lý của bạn sẽ là một cái gì đó giống như

protected void HistoryEngine_AddedEntry(object sender, HistoryAddedEventArgs e) 
{ 
    Item item = e.Database.GetItem(e.Entry.ItemId); 
    //TODO: Add logic to make sure e.Entry.ItemId requires a parent/child reindex as well 
    //TODO: Make sure that logic also prevents excessive or infinite recursion since we'll be triggering the AddedEntry event again below 
    Item parent = item.Parent; 
    //RegisterItemSaved doesn't appear to do anything with its second argument 
    e.Database.Engines.HistoryEngine.RegisterItemSaved(parent, null); 
} 

Nơi tốt nhất để đính kèm này có lẽ là trong các đường ống initialize.

N.B. đây là một ý tưởng chưa được kiểm tra, vui lòng báo cáo lại kết quả của bạn!

+0

Sẽ không kích hoạt HistoryEngine với các mục bổ sung có bất kỳ tác dụng phụ bất lợi nào đối với các thành phần Sitecore khác không? Nghe có vẻ giống như một cách tiếp cận hợp lý, vì vậy tôi sẽ thử điều này sớm. Tôi sẽ báo cáo lại sớm, trước hết cần phải hoàn thành một số nhiệm vụ chạy nước rút khác;) – sanderd

+1

Phân tích trong chương trình phản xạ IndexingManager là người nghe duy nhất cho HistoryEngine.AddedEntry, vì vậy bạn có thể an toàn ở đó. Không thể đảm bảo cho dù đó là bằng chứng trong tương lai trong sự tôn trọng đó, tôi giả sử. Điều đó nói rằng, nó mang đến một điểm mà người nghe AddEntry của bạn cần phải có logic để ngăn chặn đệ quy vô hạn. Sẽ chỉnh sửa. – techphoria414

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