搜索空字段

问题描述 投票:0回答:5

我试图排除存储项目 ID 的字段为空的搜索结果。例如,该字段称为“类型”。我无法使用 LINQ 来做到这一点。这是我的代码示例。

 public class SearchItem : SearchResultItem
 {
    [IndexField("type")]
    public string Type{ get; set; }    
 }

 public class Search
 {
    public static IEnumberable<Item> GetItems()
    {
       List<Item> items = new List<Item>();
        var index = ContentSearchManager.GetIndex(new SitecoreIndexableItem(Sitecore.Context.Item));
        using (var context = index.CreateSearchContext())
        {
            var indexItems = context.GetQueryable<SearchResultItem>()
                .Where(x => !string.IsNullOrEmpty(x.Type))
                .OrderByDescending(x => x.ReleaseDate);

            foreach(var indexItem in indexItems)
            {
                var tempItem = indexItem.GetItem();
                items.Add(tempItem);
            }
        }
        return items;
    }
 }

空字符串比较不起作用,并且项目集合包含类型字段具有空字符串的项目。我正在使用 Lucene 的开箱即用设置。

另外,如果你发现有什么不对劲的地方,请指出我的代码中的漏洞。这是我第一次使用 Sitecore 7 搜索。

c# lucene sitecore sitecore7 sitecore7.2
5个回答
2
投票

不确定 Sitecore Linq 是否支持 string.IsnullOrEmpty,请尝试 var indexItems = context.GetQueryable() .Where(x => x.Type != null) .OrderByDescending(x => x.ReleaseDate);


0
投票

Sitecore 和 Lucene 不支持空字符串,因为空字段不在索引中。索引中没有空项目的文档。这篇文章可能会帮助您使用范围查询。

Sitecore + Lucene 搜索 FieldQuery 带空字符串


0
投票

请使用任何索引查看器工具(例如 Luke)进行检查,并确认索引字段类型是否已创建,如果已创建,则它是否存储了预期值。 尝试通过调用函数进行检查,以便可以调试查询。

    protected bool checkType(SearchResultItem Ritem)
    {
        if (Ritem.type != null ||  !string.IsNullOrEmpty(Ritem.type))
        {
           return true;
        }
        return false;
    }

0
投票

现在回答可能为时已晚,但可能会帮助未来遇到同样问题的读者。

我使用谓词生成器如下,

faqPredicate = faqPredicate.And(x => x.FAQAudience != null);

这会导致以下错误

消息:不支持空值比较。 来源:Sitecore.ContentSearch.Linq.Lucene

因此,要在索引时修复它而不是返回字符串。空我使用 return“null”;

在我检查的谓词中,

faqPredicate = faqPredicate.And(x => x.FAQAudience != "null");

是的,这是一种解决方法,但它确实有效。我还尝试了与 string.Empty 进行比较,但这没有用


0
投票

您可以尝试将where条件更改为

 public class SearchItem : SearchResultItem
 {
    [IndexField("type")]
    public string Type{ get; set; }    
 }

 public class Search
 {
    public static IEnumerable<Item> GetItems()
    {
       List<Item> items = new List<Item>();

       var index = ContentSearchManager.GetIndex(new SitecoreIndexableItem(Sitecore.Context.Item));

       using (var context = index.CreateSearchContext())
       {
            var indexItems = context.GetQueryable<FRBSearchResultItem>()
                .Where(x => !string.IsNullOrEmpty(x["type"]))
                .OrderByDescending(x => x.ReleaseDate);

            foreach(var indexItem in indexItems)
            {
                var tempItem = indexItem.GetItem();
                items.Add(tempItem);
            }
        }

        return items;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.