Solr 索引中缺少 Id 字段

Missing Id field in Solr index

我刚刚发现我的 Solr 索引不包含 _id 字段。 并且无法获取项目 ID。 UniqueId 存在,但这并不是很有用。

public class MyClass
{
    [IndexField(BuiltinFields.UniqueId)]
    public string UniqueId { get; set; }

    [IndexField(BuiltinFields.ID)]
    public int Id { get; set; }
}

如何将项目 ID 添加到 Solr 索引? 我应该向 schema.xml 添加什么? 下一个字符串就足够了吗?

<field name="_id" type="string" indexed="true" stored="true" required="true" />

如果是,为什么 Sitecore 在构建 schema.xml Solr 文件时不包含它?

我的搜索结果中的重复记录似乎也有问题:)

在 SOLR 中,Item Id 字段称为 _group - 这应该在您生成它时添加到您的 schema.xml 文件中。

如果没有,这是我的定义:

<field name="_group" stored="true" indexed="true" type="string"/>

UniqueId 字段包含 ItemId 以及项目的版本和语言。

正如 Richard 所回答的,Solr 中有一个 _group 字段。如果你想让它自动翻译成ID对象,你可以使用:

[TypeConverter(typeof (IndexFieldIDValueConverter))]
[IndexField("_group")]
public virtual ID ItemId { get; set; }

请记住,如果您有多个版本或语言版本,_group 字段将不够,因为会有多个文档具有相同的 _group (id)。在这种情况下,您可能需要使用 UniqueId - 它包含有关 ID、版本、语言和数据库的信息:

[IndexField("_uniqueid")]
public virtual string UniqueId { get; set; }

然后获取项目使用:

private Item _innerItem;
public virtual Item GetItem()
{
    if (_innerItem == null)
    {
        ItemUri uri = new ItemUri(UniqueId);
        _innerItem = Factory.GetDatabase(uri.DatabaseName).GetItem(uri.ItemID, uri.Language, uri.Version);
    }
    return _innerItem;
}

或者您可以从 Sitecore.ContentSearch.SearchTypes.SearchResultItem 继承您的 MyClass,您将在那里拥有所有内置字段。