2

假设我有这样的User课:

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

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

  • IsActive=
  • Tags包含“你好”和“世界
  • Description有以下短语“失败

我研究了 Lucene 查询语法,我什至有一些东西可以工作,但是用大量组合字符串构建来创建基于文本的 lucene 查询字符串,这一切都让人感觉非常笨拙。我犹豫把我的代码放在这里,因为它很臭。

我想我想做的是Search为 Description 和 Tags 提交一个 Lucene,然后使用WhereIsActive 字段的子句对其进行过滤,可能就像这样Filter RavenDB Search Results。但我迷路了。

我正在使用最新的官方版本 (960),因此我还不能使用在此之后出现的所有时髦的东西。例如,此解决方案已被禁止,因为 960 似乎不支持.As<T>()扩展。

问题

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

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

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

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

4

1 回答 1

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

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

于 2012-10-26T06:46:07.290 回答