针对 IEnumerable 字段查询 lucene 索引
Query lucene index against IEnumerable field
我在 Lucene 索引中有一组课程,其中包含零个或多个可用日期。我正在尝试查询索引,以便返回任何可用日期介于 From/To 日期之间的课程。
使用我的 CourseSearchResultItem
中的 属性 将字段作为 DateTime 对象的集合带回
public class CourseSearchResultItem : SearchResultItem
{
[IndexField("availabledatesforcourse")]
public IEnumerable<DateTime> AvailableDatesForCourse { get; set;}
}
正在构造的查询使用以下代码:
if (courseSearchCriteria.FromDate.HasValue)
query = query.Where(c => c.AvailableDatesForCourse.Any(d => d >= courseSearchCriteria.FromDate.Value));
if (courseSearchCriteria.ToDate.HasValue)
query = query.Where(c => c.AvailableDatesForCourse.Any(d => d <= courseSearchCriteria.ToDate.Value));
运行 这会产生以下异常:
Unsupported lambda in Any call. Expression used 'd => (d >= Value (RCS.Web.Areas.RcsEng.Controllers.CoursesApiController +<>c__DisplayClass10_0).courseSearchCriteria.FromDate.Value)'
我知道这是 Sitecore.Linq Any() 方法限制的结果,但我不确定如何重新创建所需的功能。有没有人有类似的问题可以阐明解决方案?
试试下面的方法。
将您的 class 更改为如下所示:
public class CourseSearchResultItem : SearchResultItem
{
[IgnoreIndexFieldAttribute]
[IndexField("availabledatesforcourse")]
public DateTime AvailableDatesForCourse { get; set;}
}
现在将您的查询更改为如下所示:
if (courseSearchCriteria.FromDate.HasValue)
query = query.Where(c => c.AvailableDatesForCourse == courseSearchCriteria.FromDate.Value);
if (courseSearchCriteria.ToDate.HasValue)
query = query.Where(c => c.AvailableDatesForCourse == courseSearchCriteria.ToDate.Value));
这种语法适用于在搜索文档中多次存储的值(例如,_path 字段,它分别存储所有父项的 GUID)。它将被 ContentSearch API 翻译成一个查询
Lucene 可以理解,像这样:
AvailableDatesForCourse:<your date>
更新 [IgnoreIndexFieldAttribute]
将在 ContentSearch 合并您的 class 时防止映射错误,但不会阻止在查询中使用该字段。我写了一个 LinqScratchPad Gist 来说明这一点,您可以在 /sitecore/admin/LinqScratchPad.aspx 的 Sitecore LinqScratchPad 中加载它,方法是粘贴它或使用 URL 获取按钮。这将查找名称中包含“Media Item”的所有项目:
我 运行 遇到了同样的问题,并遵循了 Dan 的步骤,这让我找到了解决方案。我遇到的问题是 SitecoreContentSearch 正在创建 Solr 无法解析的查询。我将 linq 查询更新为:
if (courseSearchCriteria.FromDate.HasValue && courseSearchCriteria.ToDate.HasValue)
query= query.Where(x => x.AvailableDatesForCourse.Between(courseSearchCriteria.FromDate.Value,courseSearchCriteria.ToDate.Value,Inclusion.Both));
这应该创建一个如下所示的查询:
availabledatesforcourse:[2018-07-13T15:48:42.975Z TO 2021-07-13T15:48:43.023Z]
这使我可以搜索日期列表以查找属于此 运行ge 的任何值。
我在 Lucene 索引中有一组课程,其中包含零个或多个可用日期。我正在尝试查询索引,以便返回任何可用日期介于 From/To 日期之间的课程。
使用我的 CourseSearchResultItem
中的 属性 将字段作为 DateTime 对象的集合带回 public class CourseSearchResultItem : SearchResultItem
{
[IndexField("availabledatesforcourse")]
public IEnumerable<DateTime> AvailableDatesForCourse { get; set;}
}
正在构造的查询使用以下代码:
if (courseSearchCriteria.FromDate.HasValue)
query = query.Where(c => c.AvailableDatesForCourse.Any(d => d >= courseSearchCriteria.FromDate.Value));
if (courseSearchCriteria.ToDate.HasValue)
query = query.Where(c => c.AvailableDatesForCourse.Any(d => d <= courseSearchCriteria.ToDate.Value));
运行 这会产生以下异常:
Unsupported lambda in Any call. Expression used 'd => (d >= Value (RCS.Web.Areas.RcsEng.Controllers.CoursesApiController +<>c__DisplayClass10_0).courseSearchCriteria.FromDate.Value)'
我知道这是 Sitecore.Linq Any() 方法限制的结果,但我不确定如何重新创建所需的功能。有没有人有类似的问题可以阐明解决方案?
试试下面的方法。
将您的 class 更改为如下所示:
public class CourseSearchResultItem : SearchResultItem
{
[IgnoreIndexFieldAttribute]
[IndexField("availabledatesforcourse")]
public DateTime AvailableDatesForCourse { get; set;}
}
现在将您的查询更改为如下所示:
if (courseSearchCriteria.FromDate.HasValue)
query = query.Where(c => c.AvailableDatesForCourse == courseSearchCriteria.FromDate.Value);
if (courseSearchCriteria.ToDate.HasValue)
query = query.Where(c => c.AvailableDatesForCourse == courseSearchCriteria.ToDate.Value));
这种语法适用于在搜索文档中多次存储的值(例如,_path 字段,它分别存储所有父项的 GUID)。它将被 ContentSearch API 翻译成一个查询 Lucene 可以理解,像这样:
AvailableDatesForCourse:<your date>
更新 [IgnoreIndexFieldAttribute]
将在 ContentSearch 合并您的 class 时防止映射错误,但不会阻止在查询中使用该字段。我写了一个 LinqScratchPad Gist 来说明这一点,您可以在 /sitecore/admin/LinqScratchPad.aspx 的 Sitecore LinqScratchPad 中加载它,方法是粘贴它或使用 URL 获取按钮。这将查找名称中包含“Media Item”的所有项目:
我 运行 遇到了同样的问题,并遵循了 Dan 的步骤,这让我找到了解决方案。我遇到的问题是 SitecoreContentSearch 正在创建 Solr 无法解析的查询。我将 linq 查询更新为:
if (courseSearchCriteria.FromDate.HasValue && courseSearchCriteria.ToDate.HasValue)
query= query.Where(x => x.AvailableDatesForCourse.Between(courseSearchCriteria.FromDate.Value,courseSearchCriteria.ToDate.Value,Inclusion.Both));
这应该创建一个如下所示的查询:
availabledatesforcourse:[2018-07-13T15:48:42.975Z TO 2021-07-13T15:48:43.023Z]
这使我可以搜索日期列表以查找属于此 运行ge 的任何值。