Sitecore不会从自定义solr索引中删除记录

时间:2016-10-05 13:00:58

标签: solr sitecore sitecore7

当我尝试从自定义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条记录。

我的代码有什么问题?

1 个答案:

答案 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);
}