Sitecore 搜索索引中的空日期字段

Sitecore 搜索索引中的空日期字段,sitecore,sitecore8,Sitecore,Sitecore8,在Sitecore 7.2和8.0之间的某个地方,空日期字段(即内容编辑器未选择值的日期字段)的存储逻辑发生了变化。它们过去存储为DateTime.MinValue(即0000101);但是,现在它们存储为空字符串。在Sitecore 7.2下,我曾经能够运行以下代码行来查找没有为给定日期字段选择值的所有项目: var myQuery = _searchContext.GetQueryable<MyClass>.Where(item => item.MyDateField ==

在Sitecore 7.2和8.0之间的某个地方,空日期字段(即内容编辑器未选择值的日期字段)的存储逻辑发生了变化。它们过去存储为
DateTime.MinValue
(即
0000101
);但是,现在它们存储为空字符串。在Sitecore 7.2下,我曾经能够运行以下代码行来查找没有为给定日期字段选择值的所有项目:

var myQuery = _searchContext.GetQueryable<MyClass>.Where(item => item.MyDateField == DateTime.MinValue);
var myQuery=\u searchContext.GetQueryable.Where(item=>item.MyDateField==DateTime.MinValue);
它生成了以下Lucene查询:
+mydatefield:0000101


这当然不再有效,因为索引中的字段值是空字符串。我不太确定如何使用
ContentSearch
API来设置查询,因为DateTime不能与null或空字符串值进行比较。我想知道是否有办法查询这种新格式,或者是否需要修改Sitecore存储空日期值的方式以匹配旧格式。

您可以采取的一种方法是定义一个新的布尔计算字段来跟踪日期字段的存在。这将使您的查询更易于阅读,并且不需要特别了解Sitecore如何匹配空字段。如果对值的存储方式进行更改,也可能是未来的证明

使用系统;
使用Sitecore.ContentSearch;
使用Sitecore.ContentSearch.ComputedFields;
使用Sitecore.Data.Fields;
使用Sitecore.Data.Items;
命名空间YourProject.ComputedFields
{
公共类HasDateComputedIndexField:IComputedIndexField
{
公共对象ComputeFieldValue(可索引)
{
Item Item=可作为SitecoreIndexableItem索引;
常量字符串dateFieldName=“MyDateField”;
返回
项目!=null&&
item.Fields[dateFieldName]!=null&&
!((DateField)item.Fields[dateFieldName]).DateTime.Equals(DateTime.MinValue)&&
!((DateField)item.Fields[dateFieldName]).DateTime.Equals(DateTime.MaxValue);
}
公共字符串字段名{get;set;}
公共字符串返回类型{get;set;}
}
}
需要将计算字段添加到搜索配置中,并重建索引。从那里,您可以引用搜索结果项类中的计算字段并进行如下查询:

公共类MyClass:PageSearchResultItem
{
[IndexField(“has_date”)]
公共bool HasDate{get;set;}
}
var myQuery=\u searchContext.GetQueryable.Where(item=>item.HasDate);

我相信您可以为字段使用可为空的日期时间(DateTime?),当数据为空时,该字段应该没有值

然后,您可以简单地检查
HasValue
属性

var myQuery = _searchContext.GetQueryable<MyClass>.Where(item => item.MyDateField.HasValue);
var myQuery=\u searchContext.GetQueryable.Where(item=>item.MyDateField.HasValue);

能否尝试将字符串属性添加到名为
MyDateStringField
MyClass
中,并将其用于此空日期搜索。那么,是否可以将您的
MyDateField
用于所有其他操作?不幸的是,这不起作用
MyDateStringField==”
翻译为
+MatchNodeOcsQuery[]