1

我在 RavenDb 中存储了以下类:

public class User
{
  public string Id {get;set;}
  public string Name {get;set;}
  public IList<string> Phrases {get;set;} 
}

我想要所有用户的所有不同短语。

解决方案 1(未测试)

session.Query<User>().SelectMany(c=>c.Educations).Distinct();

你认为这种方法会有性能问题吗?

解决方案 2(经过测试) 通过 google,我发现 session.Advanced.DatabaseCommands.GetTerms() 可以很好地获取属性的不同值。但在这里我有一个 List 属性。根据这个:

  • 我创建了一个基于 CharTokenizer 的自定义 Tokenizer,以根据特定的字符 (|) 拆分值;
  • 我创建了一个类似于 WhiteSpaceAnalyzer 的自定义分析器;
  • 我在 Map 中使用“phrases = string.join("|", Phrases)”创建一个索引,指定我的自定义分析器;
  • 我使用 session.Advanced.DatabaseCommands.GetTerms(myindexname, phrases, null, int.maxvalue)。

在您看来,哪种方法更好?其他更好/更简单的解决方案?

谢谢。

4

1 回答 1

4

如果您编写索引如下所示:

from user in docs.Users
from phrase in user.Phrases
select new { phrase }

然后session.Advanced.DatabaseCommands.GetTerms()将起作用,因此您可以使用解决方案 2而不会增加所有复杂性。

认为 解决方案 2将是最有效的,因为它直接从 Lucene 索引中获取术语,但您必须对其进行基准测试才能确定。

于 2012-04-12T16:51:50.073 回答