如何根据RavenDB LuceneQuery中的零个或多个术语过滤查询?

时间:2012-11-02 12:49:34

标签: lucene ravendb

我需要通过用户喜欢和阻止的标签来过滤LiceneQuery。当用户有一些喜欢和被阻止的标签时,我已经有了这个工作,但我正在努力解决用户没有收藏或阻止标签的情况。我相信我需要使用相当于MatchAllDocsQuery但我无法通过RavenDB客户端API看到如何实现这一点。

当用户拥有一个或多个收藏夹以及一个或多个被阻止的标签时,此功能正常:

string favesQuery = String.Join(" OR ", user.FavouriteTags.Select(x => String.Format("Tags:{0}", x)));
string blockedQuery = String.Join(" AND ", user.BlockedTags.Select(x => String.Format("-Tags:{0}", x)));
var articles = RavenSession.Advanced
                           .LuceneQuery<Article>("AllDocs/ByTags")
                           .Include(x => x.Author)
                           .Where(favesQuery)
                           .Boost(0.5m)
                           .Where(blockedQuery)
                           .OrderByDescending(x => x.DatePublished);

我遇到的直接问题是Missing where clause,但这是因为String.Join在空user.FavouriteTags时返回一个空字符串。我可以在favesQueryblockedQuery上添加一些内容吗?

用SQL术语思考,我正在寻找相当于WHERE 1=1 AND ...

的东西

相关问题https://groups.google.com/forum/?fromgroups=#!topic/ravendb/JKTpHiFRJLc

1 个答案:

答案 0 :(得分:1)

重新考虑LINQ方法的结构。

var articles = RavenSession.Advanced
                           .LuceneQuery<Article>("AllDocs/ByTags")
                           .Include(x => x.Author);
if (user.FavouriteTags.Any()) {
    string favesQuery = String.Join(" OR ", user.FavouriteTags.Select(x => String.Format("Tags:{0}", x)));
    articles = articles.Where(favesQuery).Boost(0.5m);
}
if (user.BlockedTags.Any()) {
    string blockedQuery = String.Join(" AND ", user.BlockedTags.Select(x => String.Format("-Tags:{0}", x)));
    articles = articles.Where(blockedQuery);
}
articles = articles.OrderByDescending(x => x.DatePublished);