lucene 搜索空字段

woobm2wo  于 2023-10-18  发布在  Lucene
关注(0)|答案(5)|浏览(288)

我正在尝试排除具有存储项目ID的字段为空的搜索结果。例如,这个字段被称为“类型”。我不能用LINQ来做这件事。下面是我的代码示例。

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

空字符串比较不起作用,并且items集合中包含的项目的Type字段为空字符串。我正在使用Lucene的开箱即用设置。
另外,如果你看到一些不正确的地方,请在我的代码中戳个洞。这是我第一次使用Sitecore 7 Search。

ut6juiuv

ut6juiuv1#

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

a0zr77ik

a0zr77ik2#

Sitecore和Lucene不支持空字符串,因为索引中没有空字段。索引中没有空项的文档。这篇文章可能会帮助你使用范围查询。
Sitecore + Lucene Search FieldQuery with and empty string

xjreopfe

xjreopfe3#

请检查与任何索引查看器工具,如卢克,并确认该索引字段类型创建或不,如果得到创建,然后它存储的预期值或不。尝试通过调用函数进行检查,以便可以调试查询。

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

xmq68pz94#

现在给出答案可能为时已晚,但可能会帮助未来的读者解决同样的问题。
我使用 predicate 生成器如下,

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

这导致以下错误
消息:不支持空值比较。来源:Sitecore.ContentSearch.Linq.Lucene
所以在索引而不是返回字符串时修复它。空我使用返回“null”;
在我检查的 predicate 中,

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

是的,这是一个变通办法,但它的工作。我也试过和string比较。空的,但不起作用

ni65a41a

ni65a41a5#

你能试着把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;
    }
}

相关问题