在索引中搜索空日期字段

时间:2015-05-18 15:07:39

标签: sitecore sitecore8

在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如何存储空日期值以匹配旧格式。

2 个答案:

答案 0 :(得分:2)

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

var list = $firebaseArray(ref);
var addItem = function(itemDataObject) {
    return list.$add(itemDataObject);
};

需要将计算字段添加到搜索配置中并重建索引。从那里,您可以在搜索结果项类中引用计算字段,并按如下方式查询:

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; }
    }
}

答案 1 :(得分:0)

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

您的支票可以像检查HasValue属性一样简单。

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