Мы разработали специальный аналитический отчет в Sitecore 8.2.6, чтобы получать контактные визиты разных компаний из БД Mongo и запускать его как пользовательский отчет вместо Sitecore из коробки в соответствии с пользовательскими условиями.Использует Solr Search (4.6.1).Он отлично работает на Dev и staging, но возвращает ошибку из-за большого объема записей в базе данных prod (200000 индексов). Ошибка в том, что он останавливает обработку и сайт не загружается.
Ниже приведенисходный код.
открытый класс NewPageVisitors {public static ISearchIndex AnalyticsIndex {get {return SolrContentSearchManager.GetIndex ("sitecore_analytics_index");}}
public List<string> getCompanies()
{
List<string> lstCompanies = new List<string>();
try
{
var indexedContacts = getIndexedContacts();
foreach (IndexedContact contact in indexedContacts)
{
lstCompanies.Add(contact.Tags.Distinct().Where(item => item.Contains("Company")).FirstOrDefault().Split(':')[1]);
}
return lstCompanies.Distinct().ToList();
}
catch (Exception ex)
{
Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
return lstCompanies;
};
}
public List<IndexedContact> getIndexedContacts()
{
List<IndexedContact> lstIndexedContacts = new List<IndexedContact>();
try
{
using (var context = AnalyticsIndex.CreateSearchContext(SearchSecurityOptions.DisableSecurityCheck))
{
var indexedIdentifiedContacts = context.GetQueryable<IndexedContact>().ToList();
lstIndexedContacts.AddRange(indexedIdentifiedContacts.Where(con => !string.IsNullOrWhiteSpace(con.Identifier) && con.Tags != null).ToList());
lstIndexedContacts.AddRange(indexedIdentifiedContacts.Where(con => string.IsNullOrWhiteSpace(con.Identifier) && con.Tags != null).ToList());
return lstIndexedContacts.ToList();
}
}
catch (Exception ex)
{
Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
return lstIndexedContacts;
}
}
public List<Guid> getCompanySpecificContactIDs(List<string> lstcompanyNames, List<IndexedContact> lstcontacts)
{
List<Guid> lstcontactids = new List<Guid>();
try
{
if (lstcompanyNames != null && lstcompanyNames.Count>0)
{
foreach (string companyname in lstcompanyNames)
{
foreach (IndexedContact contact in lstcontacts)
{
string contactcompanyname = contact.Tags.Distinct().Where(item => item.Contains("Company")).FirstOrDefault().Split(':')[1];
if (contactcompanyname.Trim() == companyname.Trim())
{
lstcontactids.Add(contact.ContactId);
}
}
}
}
return lstcontactids;
}
catch (Exception ex)
{
Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
return lstcontactids;
}
}
public List<Guid> getAllContactIDs(List<IndexedContact> indexedContacts)
{
try
{
List<Guid> contactids = indexedContacts.Select(s => s.ContactId).ToList();
return contactids;
}
catch (Exception ex)
{
Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
return null;
}
}
public List<IndexedVisit> getIndexedVisits(List<Guid> contactIds,bool isCompanySelected)
{
List<IndexedVisit> lstindexedVisists = new List<IndexedVisit>();
try
{
using (var context = AnalyticsIndex.CreateSearchContext(SearchSecurityOptions.DisableSecurityCheck))
{
if (isCompanySelected)
{
lstindexedVisists = context.GetQueryable<IndexedVisit>().Where(visit => contactIds.Contains(visit.ContactId)).ToList();
}
else
{
lstindexedVisists = context.GetQueryable<IndexedVisit>().ToList();
lstindexedVisists = lstindexedVisists.Where(visit => contactIds.Contains(visit.ContactId)).ToList();
}
return lstindexedVisists;
}
}
catch (Exception ex)
{
Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
return lstindexedVisists;
}
}
public List<Guid> getAllInteractionIDs(List<IndexedVisit> indexedVisits)
{
try
{
if (indexedVisits != null)
{
List<Guid> interactionids = new List<Guid>(indexedVisits.Select(s => s.InteractionId));
return interactionids;
}
else
{
return null;
}
}
catch (Exception ex)
{
Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
return null;
}
}
public List<IndexedVisitPage> getIndexedVisitPages(List<Guid> interactionIds,bool IsCompanySelected)
{
List<IndexedVisitPage> lstIndexedVisitPages = new List<IndexedVisitPage>();
try
{
using (var context = AnalyticsIndex.CreateSearchContext(SearchSecurityOptions.DisableSecurityCheck))
{
if (IsCompanySelected)
{
lstIndexedVisitPages = context.GetQueryable<IndexedVisitPage>().Where(visitpage => interactionIds.Contains(visitpage.InteractionId)).ToList();
}
else
{
lstIndexedVisitPages = context.GetQueryable<IndexedVisitPage>().ToList();
lstIndexedVisitPages=lstIndexedVisitPages.Where(visitpage => interactionIds.Contains(visitpage.InteractionId)).ToList();
}
return lstIndexedVisitPages;
}
}
catch (Exception ex)
{
Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
return lstIndexedVisitPages;
}
}
public object BindChartData(List<IndexedContact> indexedContacts, List<IndexedVisit> indexedVisitresult, List<IndexedVisitPage> indexedVisitPageresult)
{
try
{
var finalreportdata = from IndexedVisit in indexedVisitresult
join IndexedContact in indexedContacts
on IndexedVisit.ContactId equals IndexedContact.ContactId
let contactVisit = new { IndexedVisit, IndexedContact }
join IndexedVisitPage in indexedVisitPageresult
on contactVisit.IndexedVisit.InteractionId equals IndexedVisitPage.InteractionId
into entireVisit
select new
{
contactVisit.IndexedVisit,
contactVisit.IndexedContact,
entireVisit
};
return finalreportdata;
}
catch (Exception ex)
{
return null;
}
}
public static string getItemname(string itempath)
{
try
{
Database webdb = Factory.GetDatabase("web");
string itemPath = itempath.Split('?')[0];
if (!string.IsNullOrEmpty(itemPath))
{
Item item = webdb.GetItem(StringConstants.SitecoreItemsPrefixPath + itemPath);
if (item != null)
{
return item.Name;
}
}
}
catch (Exception ex)
{
return "";
}
return "";
}
public List<string> getproductcodes(string itempath)
{
List<string> lstProductCodeNames = new List<string>();
try
{
Item item = null;
Database webdb = Factory.GetDatabase("web");
string itemPath = itempath.Split('?')[0];
if (!string.IsNullOrEmpty(itemPath))
{
item = webdb.GetItem(StringConstants.SitecoreItemsPrefixPath + itemPath);
}
if (item != null)
{
if (ismembertemplate(item))
{
MultilistField mlfProductCodes = item.Fields["Product Codes"];
if (!(mlfProductCodes.GetItems().Length == 0))
{
foreach (var product in mlfProductCodes.GetItems())
{
lstProductCodeNames.Add(product.Name);
}
return lstProductCodeNames;
}
}
}
return lstProductCodeNames;
}
catch (Exception ex)
{
return lstProductCodeNames;
}
}
public bool ismembertemplate(Item item)
{
if (item.TemplateID.ToString() == ItemIDs.GenericMemberContentTemplateID.ToString() || item.TemplateID.ToString() == ItemIDs.MemberServiceOverviewTemplateID.ToString() || item.TemplateID.ToString() == ItemIDs.MemberContentPagenoToCTemplateID.ToString() || item.TemplateID.ToString() == ItemIDs.MemberContentPageTemplateID.ToString())
{
return true;
}
return false;
}
}
Пожалуйста, сообщите, если подход должен быть изменен, или настройки, которые могут быть выполнены в приведенном выше коде.
Спасибо, Паван