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(テスト済み) グーグルで、session.Advanced.DatabaseCommands.GetTerms()がプロパティの個別の値を取得するのに適していることがわかりました。しかし、ここにListプロパティがあります。これによれば:

  • CharTokenizerに基づいてカスタムTokenizerを作成し、特定のchar(|)に基づいて値を分割します。
  • 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 }

その後、機能するため、複雑さを増すことなくソリューション2session.Advanced.DatabaseCommands.GetTerms()を使用できます。

ソリューション2は、Luceneインデックスから直接用語を取得するため、最も効率的だと思いますが、確実に知るには、ベンチマークを行う必要があります

于 2012-04-12T16:51:50.073 に答える