Sitecore:Lucene索引项id存储时不带花括号

Sitecore:Lucene索引项id存储时不带花括号,lucene,sitecore,Lucene,Sitecore,我有以下用于存储字段的配置 <fieldType fieldName="Profile Id" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" type="System.Guid" nullValue="NULL" emptyString="EMPTY" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfigur

我有以下用于存储字段的配置

<fieldType fieldName="Profile Id" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" type="System.Guid" nullValue="NULL" emptyString="EMPTY" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" />

当我用LukeAll检查索引时,我看到id为:

我不知道为什么大括号不见了,为什么所有的字符都是小写的。我想像sitecore一样将其存储为普通guid,并使用大括号和大写字符


我也尝试了
type=“System.string”
,但还是一样

实际上,由于您的字段是标记化的,Sitecore以避免发生其他情况的方式存储您的ID。标记化意味着,您的ID将在Lucene内部分解,如下所示:

c50e5028
8eba
4ba9
854cf
(你明白了)

因此,如果您在Lucene中搜索
8eba
,它将与您现在看到的
profile\u id
字段相匹配。这是很少有人会想到的

避免这一问题;不要将Sitecore ID放入索引中。也不是Guid。(还有其他解决方法,但我在这里向您展示更简单的方法)


使用
item.ID.tosortid()
-这将生成一个没有花括号和破折号的Guid。当您以后想要比较(或查询)时,只需使用相同的
.tosortid()
方法对其进行匹配。

实际上,由于您的字段已标记化,Sitecore以避免发生其他情况的方式存储您的ID。标记化意味着,您的ID将在Lucene内部分解,如下所示:

c50e5028
8eba
4ba9
854cf
(你明白了)

因此,如果您在Lucene中搜索
8eba
,它将与您现在看到的
profile\u id
字段相匹配。这是很少有人会想到的

避免这一问题;不要将Sitecore ID放入索引中。也不是Guid。(还有其他解决方法,但我在这里向您展示更简单的方法)


使用
item.ID.tosortid()
-这将生成一个没有花括号和破折号的Guid。以后要进行比较(或查询)时,只需使用相同的
.tosortid()
方法将其匹配。

在我看来,原始值似乎不包含大括号

如果字段值包含大括号(storageType=“YES”),Luke将向您显示索引为索引数据的值(根据使用的分析器可能会有很大不同)


如果确实希望索引数据包含大括号,请设置index type=“UN_TOKENIZED”或为字段选择类似于
Lucene.Net.Analysis.WhitespaceAnalyzer

在我看来,您的原始值似乎不包含大括号

如果字段值包含大括号(storageType=“YES”),Luke将向您显示索引为索引数据的值(根据使用的分析器可能会有很大不同)


如果确实希望索引数据包含大括号,请设置index type=“UN_TOKENIZED”或为字段选择类似于
Lucene.Net.Analysis.WhitespaceAnalyzer

通常的做法是在Lucene中存储guid而不使用括号-默认情况下,Sitecore会这样做。为什么要在索引中明确显示它们?在代码的后面,比较两个字符串,一个来自
Sitecore Item Id
,另一个来自
index field
。为什么这会阻止您?使用String.Contains方法可以轻松地比较这两个字符串。如果要进行字符串比较,可以使用Guid.ToString方法()的format参数以相同的格式获取它们。通常的做法是将Guid存储在Lucene中而不使用方括号-默认情况下Sitecore会这样做。为什么要在索引中明确显示它们?在代码的后面,比较两个字符串,一个来自
Sitecore Item Id
,另一个来自
index field
。为什么这会阻止您?您可以使用String.Contains方法轻松比较这两个字符串。如果要进行字符串比较,可以使用Guid.ToString方法()的format参数以相同的格式获取它们。另请参见: