当我尝试从自定义solr索引中删除一些记录时,我有一个奇怪的问题。
我创建了像这样的代码
public void DeleteRecordsFromIndex(string indexName,IEnumerable<IIndexableUniqueId> uniqueIds)
{
if (uniqueIds == null || string.IsNullOrEmpty(indexName) || !uniqueIds.Any())
{
return;
}
using (IProviderDeleteContext deleteContext = ContentSearchManager.GetIndex(indexName).CreateDeleteContext())
{
foreach (var indexId in uniqueIds)
{
deleteContext.Delete(indexId);
}
deleteContext.Commit();
}
}
当我需要获取UniqueId时搜索Item属性
[IndexField("_uniqueid")]
public IIndexableUniqueId UniqueId
{
get
{
return new `enter code here`IndexableUniqueId<string>(this.Uri.ToString());
}
}
基于调试信息IIndexableUniqueId包含正确的值 像: “Sitecore的://网/ {66d75448-72a5-4d94-9788-61c6c64b9251}郎= EN-AU&安培;版本= 1” 什么等于solr索引中的 _uniqueid 字段。
我的自定义solr索引中有4条记录。
首次运行后,一条记录从索引中删除,但有3条记录是钢铁。 我已经运行了几次代码,但索引中总是有3条记录。
我的代码有什么问题?
答案 0 :(得分:0)
我找到了解决方案: 如果使用IIndexableUniqueId,最好使用IIndexableId
public IIndexableId GetIndexableId(ID itemId)
{
//map to _group value
var id = itemId.ToString().ToLower().Replace("{", "").Replace("}", "").Replace("-", "");
return new IndexableId<string>(id);
}
public int DeleteRecordsFromIndex(string indexName, IIndexableId uniqueIds)
{
if (uniqueIds == null || string.IsNullOrEmpty(indexName))
{
return -1;
}
using (var deleteContext = ContentSearchManager.GetIndex(indexName).CreateDeleteContext())
{
var resuls = deleteContext.Delete(uniqueIds);//this method use _group fields for remove records. All languages will be removed.
deleteContext.Commit();
return resuls;
}
}
关于ILSpy,sitecore按_group
删除项目// Sitecore.ContentSearch.SolrProvider.SolrUpdateContext
public void Delete(IIndexableId id)
{
Assert.ArgumentNotNull(id, "id");
object obj = this.index.Configuration.IndexFieldStorageValueFormatter.FormatValueForIndexStorage(id);
SolrQueryByField solrQueryByField = new SolrQueryByField("_group", obj.ToString());
SolrQueryByField solrQueryByField2 = new SolrQueryByField("_indexname", this.index.Name);
this.solr.Delete(solrQueryByField && solrQueryByField2);
this.CommitPolicyExecutor.IndexModified(this, id, IndexOperation.Delete);
}