2012-04-12 10 views
1

Ich habe die folgende Klasse in RavenDB gespeichert:Wie verschiedene Werte in RavenDb aus einer Eigenschaft des Typs IList <string> abrufen?

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

und ich möchte alle die unterschiedlichen Sätze aller Benutzer.

Lösungen 1 (nicht getestet)

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

Glauben Sie, wird es mit diesem Ansatz Performance-Probleme sein?

Lösung 2 (getestet) mit Google fand ich, dass session.Advanced.DatabaseCommands.GetTerms() verschiedene Werte einer Eigenschaft zu erhalten, ist gut. Aber hier habe ich eine List-Eigenschaft. dazu nach:

  • ich erstellen Sie eine benutzerdefinierte Tokenizer auf CharTokenizer basierend Werte zu teilen, basierend auf einem bestimmten Zeichen (|);
  • Ich erstelle einen benutzerdefinierten Analyzer ähnlich WhiteSpaceAnalyzer;
  • Ich erstelle einen Index mit "Phrasen = string.join (" | ", Phrasen)" in der Karte, meinen kundenspezifischen Analysator spezifizierend;
  • Ich benutze session.Advanced.DatabaseCommands.GetTerms (Myindexname, Phrasen, null, int.maxvalue).

Was ist Ihrer Meinung nach besser? Andere bessere/einfachere Lösungen?

Danke.

Antwort

4

Wenn Sie Ihren Index schreiben, wie unten dargestellt:

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

Dann session.Advanced.DatabaseCommands.GetTerms() arbeiten und so können Sie Lösung 2 ohne all die zusätzliche Komplexität verwenden.

Ich denkeLösung 2 effizient das sein wird, wie es die Bedingungen direkt aus dem Lucene Index bekommen, aber Sie werden zu Benchmark haben es sicher zu wissen.

+0

Ich schlage auch vor, KeywordAnalyzer zu verwenden; StandardAnalyzer teilt jedes einzelne Wort auf. Danke. – Sierrodc