使用来自IProviderSearchContext的GetQueryable搜索空多列表

时间:2014-03-07 15:54:14

标签: c# lucene sitecore lucene.net sitecore7

Sitecore我们有包含multilist字段的项目。该字段已存储并编入索引,因此我们可以使用此语法查询它们。

using (var context = ContentSearchManager.GetIndex("sitecore_web_index").CreateSearchContext())
{
    var templateId = new ID(Config.NewsTemplate);
    var q = context.GetQueryable<NewsSearchResultItem>().Where(x => x.Language == searchContext.Language && x.TemplateId == templateId);

        var appIdPrd = PredicateBuilder.True<NewsSearchResultItem>();
        foreach (var t in searchContext.AppIds)
        {
            var id = GetId(t);
            appIdPrd = appIdPrd.Or(p => p.AppIdOr.Contains(id));
        }
        q = q.Where(appIdPrd);

   List<NewsItem> items = new List<NewsItem>(q.Count());
}

class NewsSearchResultItem : SearchResultItem
{
    public string Title { get; set; }
    public string Body { get; set; }
    [IndexField("apps_or")]
    public List<ID> AppIdOr { get; set; }
}

当项目在multilist字段apps_or中有一个或多个值时,它会起作用。但我也想搜索multilist字段中没有项目的项目。 这永远不会退货:

q = q.Where(x => x.AppIdOr.Count == 0); 

并且不允许这样做:

q = q.Where(x => x.AppIdOr == null); 

任何想法?

1 个答案:

答案 0 :(得分:2)

Lucene不知道如何搜索空值,因为没有为lucene搜索索引的值。 我建议在索引时,如果字段为空/ null(使用自定义或计算字段),则添加默认值,例如(ID.Null),然后在搜索查询中,您可以搜索ID.Null。 之前没有尝试过,但我认为它会起作用。