在索引中搜索空日期字段
Searching empty date fields in index
在 Sitecore 7.2 和 8.0 之间的某个地方,空日期字段(即内容编辑器未为其选择值的日期字段)的存储逻辑发生了变化。它们曾经被存储为 DateTime.MinValue
(即 00010101
);但是,现在它们存储为空字符串。在 Sitecore 7.2 下,我曾经能够 运行 以下代码行来查找所有没有为给定日期字段选择值的项目:
var myQuery = _searchContext.GetQueryable<MyClass>.Where(item => item.MyDateField == DateTime.MinValue);
生成了以下 Lucene 查询:+mydatefield: 00010101
这当然不再有效,因为索引中的字段值为空字符串。我不太确定如何使用 ContentSearch
API 来设置查询,因为 DateTime 无法与 null 或空字符串值进行比较。我想知道是否有查询这种新格式的方法,或者我是否需要研究修改 Sitecore 存储空日期值以匹配旧格式的方式。
您可以采用的一种方法是定义一个新的布尔计算字段来跟踪日期字段的存在。这将使您的查询更易于阅读,并且不需要特别了解 Sitecore 如何匹配空字段。如果对值的存储方式进行更改,它也可能是未来的证据。
using System;
using Sitecore.ContentSearch;
using Sitecore.ContentSearch.ComputedFields;
using Sitecore.Data.Fields;
using Sitecore.Data.Items;
namespace YourProject.ComputedFields
{
public class HasDateComputedIndexField : IComputedIndexField
{
public object ComputeFieldValue(IIndexable indexable)
{
Item item = indexable as SitecoreIndexableItem;
const string dateFieldName = "MyDateField";
return
item != null &&
item.Fields[dateFieldName] != null &&
!((DateField)item.Fields[dateFieldName]).DateTime.Equals(DateTime.MinValue) &&
!((DateField)item.Fields[dateFieldName]).DateTime.Equals(DateTime.MaxValue);
}
public string FieldName { get; set; }
public string ReturnType { get; set; }
}
}
需要将计算字段添加到您的搜索配置中并重建索引。从那里,您可以在搜索结果项 class 中引用计算字段并按如下方式查询:
public class MyClass : PageSearchResultItem
{
[IndexField("has_date")]
public bool HasDate { get; set; }
}
var myQuery = _searchContext.GetQueryable<MyClass>.Where(item => item.HasDate);
我相信您可以为您的字段使用可为 null 的 DateTime(DateTime?),当数据为空时,它应该没有任何值。
您的检查可以像检查 HasValue
属性.
一样简单
var myQuery = _searchContext.GetQueryable<MyClass>.Where(item => item.MyDateField.HasValue);
在 Sitecore 7.2 和 8.0 之间的某个地方,空日期字段(即内容编辑器未为其选择值的日期字段)的存储逻辑发生了变化。它们曾经被存储为 DateTime.MinValue
(即 00010101
);但是,现在它们存储为空字符串。在 Sitecore 7.2 下,我曾经能够 运行 以下代码行来查找所有没有为给定日期字段选择值的项目:
var myQuery = _searchContext.GetQueryable<MyClass>.Where(item => item.MyDateField == DateTime.MinValue);
生成了以下 Lucene 查询:+mydatefield: 00010101
这当然不再有效,因为索引中的字段值为空字符串。我不太确定如何使用 ContentSearch
API 来设置查询,因为 DateTime 无法与 null 或空字符串值进行比较。我想知道是否有查询这种新格式的方法,或者我是否需要研究修改 Sitecore 存储空日期值以匹配旧格式的方式。
您可以采用的一种方法是定义一个新的布尔计算字段来跟踪日期字段的存在。这将使您的查询更易于阅读,并且不需要特别了解 Sitecore 如何匹配空字段。如果对值的存储方式进行更改,它也可能是未来的证据。
using System;
using Sitecore.ContentSearch;
using Sitecore.ContentSearch.ComputedFields;
using Sitecore.Data.Fields;
using Sitecore.Data.Items;
namespace YourProject.ComputedFields
{
public class HasDateComputedIndexField : IComputedIndexField
{
public object ComputeFieldValue(IIndexable indexable)
{
Item item = indexable as SitecoreIndexableItem;
const string dateFieldName = "MyDateField";
return
item != null &&
item.Fields[dateFieldName] != null &&
!((DateField)item.Fields[dateFieldName]).DateTime.Equals(DateTime.MinValue) &&
!((DateField)item.Fields[dateFieldName]).DateTime.Equals(DateTime.MaxValue);
}
public string FieldName { get; set; }
public string ReturnType { get; set; }
}
}
需要将计算字段添加到您的搜索配置中并重建索引。从那里,您可以在搜索结果项 class 中引用计算字段并按如下方式查询:
public class MyClass : PageSearchResultItem
{
[IndexField("has_date")]
public bool HasDate { get; set; }
}
var myQuery = _searchContext.GetQueryable<MyClass>.Where(item => item.HasDate);
我相信您可以为您的字段使用可为 null 的 DateTime(DateTime?),当数据为空时,它应该没有任何值。
您的检查可以像检查 HasValue
属性.
var myQuery = _searchContext.GetQueryable<MyClass>.Where(item => item.MyDateField.HasValue);