我应该如何过滤RavenDB Lucene搜索的结果?

时间:2012-10-25 16:25:23

标签: ravendb

说我有User这样的课程:

public class User
{
  public bool IsActive {get;set;}
  public string[] Tags{get;set;}
  public string Description {get;set;}
}

我想使用RavenDB搜索符合以下条件的用户集:

  • IsActive = true
  • Tags包含' hello '和' world '
  • Description包含以下短语“ abject failure

我已经研究过Lucene Query语法,我甚至有一些工作正在运行,但是所有人都感到非常笨重,有很多组合字符串构建来创建基于文本的lucene查询字符串。我不愿意把我的代码放在这里,因为它非常臭。

我认为我想要做的是为描述和标记提交一个Lucene Search,然后使用Where子句为IsActive字段过滤它,可能就像这个Filter RavenDB Search Results一样。但我迷路了。

我正在使用最新的正式版本(960),因此我之后无法获得所有的常规内容。例如,this solution是禁止的,因为960似乎不支持.As<T>()扩展名。

问题

如何构建所需的索引和查询以执行组合的搜索:

  • 单个约束,例如IsActive
  • 集合约束,例如Tags
  • 自由文本约束,例如Description

返回强类型的User个对象列表?

感谢您提供任何代码示例或指示。

1 个答案:

答案 0 :(得分:1)

您可以这样查询:

var results = (from u in Session.Query<User>("YourUserIndex")
              where u.IsActive && u.Tags.Any(x=>x == "hello") && x.Tags.Any(x=>x=="world")
              select u)
              .Search(x=>x.Description, "abject failure")
              .ToList();

YourUserIndex看起来像这样:

from u in docs.Users
select new { u.IsActive, u.Tags, u.Description };

您需要将“描述”字段标记为已分析。