我试图排除存储项目 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 搜索。
不确定 Sitecore Linq 是否支持 string.IsnullOrEmpty,请尝试 var indexItems = context.GetQueryable() .Where(x => x.Type != null) .OrderByDescending(x => x.ReleaseDate);
Sitecore 和 Lucene 不支持空字符串,因为空字段不在索引中。索引中没有空项目的文档。这篇文章可能会帮助您使用范围查询。
请使用任何索引查看器工具(例如 Luke)进行检查,并确认索引字段类型是否已创建,如果已创建,则它是否存储了预期值。 尝试通过调用函数进行检查,以便可以调试查询。
protected bool checkType(SearchResultItem Ritem)
{
if (Ritem.type != null || !string.IsNullOrEmpty(Ritem.type))
{
return true;
}
return false;
}
现在回答可能为时已晚,但可能会帮助未来遇到同样问题的读者。
我使用谓词生成器如下,
faqPredicate = faqPredicate.And(x => x.FAQAudience != null);
这会导致以下错误
消息:不支持空值比较。 来源:Sitecore.ContentSearch.Linq.Lucene
因此,要在索引时修复它而不是返回字符串。空我使用 return“null”;
在我检查的谓词中,
faqPredicate = faqPredicate.And(x => x.FAQAudience != "null");
是的,这是一种解决方法,但它确实有效。我还尝试了与 string.Empty 进行比较,但这没有用
您可以尝试将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;
}
}