1

私はRavenDBを使用しており、ユーザーがデータベースにアイテムを入力して、テキストタグを関連付けることができるようにしています。アイテムのクラスは

public class TagItem
    {
        public string Id { get; set; }
        public string UserId { get; set; }
        public List<string> Tags { get; set;}
        public DateTime DateCreated { get; set; }
    }
}

私がやりたいのは、ドキュメントクエリから選択したアイテムの個々のタグのインスタンス数を取得することです。例えば

Bacon : 12
Fudge : 8
Marshmallow : 6

私は現在、アイテムを繰り返し処理し、各タグのカウントを増やすことでこれを行っていますが、結果を取得するための非常に洗練された方法ではないようです。これを達成するためのより良い方法について誰かが提案を持っているかどうか疑問に思いましたか?前もって感謝します。

-編集#1--

マット

ファセット検索の提案を実装しようとしましたが、userIDのサブセットを使用して選択を実行する方法がわからないようです。私は次のようにインデックスを作成しました

   public class Tag_Facets : AbstractIndexCreationTask<UserModel>
   {
    public Tag_Facets()
    {
        Map = locations => from user in users 
                           from tag in user.Tags
                           select new { Tag = tag.ToString().ToLower(), user.Id };
    }
   }

ファセットを実行する前にこの選択を絞り込むために使用したいUserIdのリストがありますが、コンパイルしようとしたメソッドはありません。Where句がこれに対してどのように見えるかについてのアイデアを私に提供できますか?

私のFacetSetupは次のとおりです

this.DocumentSession.Store(new FacetSetup { Id = "facets/TagFacets", Facets = new 
List<Facet> { new Facet { Name = "Tag" } } });

私が構築しようとしているクエリは

var facetResults = this.DocumentSession.Query<LocationModel>("Tag/Facets")
                .Where(x => x.Id.Contains(new List<string> { "1", "2", "3" }))
                .ToFacets("facets/TagFacets");

含むはリストを受け入れないため、ビルドされません

私がこれをどのように達成するかについて、あなたが私を正しい方向に向けることができるかもしれないことを望んでいました。

また、ファセット検索にご協力いただきありがとうございます。RavenDBで実行する必要のある多くのクエリを実行するために私が探しているもののようです。乾杯!

-編集#2-

これは、私が望む結果を達成するために使用するSQL式です。

SELECT t.Tag, COUNT(*) FROM UserTags t WHERE t.UserID in ('1', '2', '3', '4', '5') GROUP BY t.Tag
4

2 に答える 2

2

タグ名でグループ化されたタグ数が必要な場合、RavenDBWebサイトにはすでに例があります。

http://ravendb.net/kb/2/creating-a-tag-cloud

わずかに変更されたインデックス:

public class Tags_Count : AbstractIndexCreationTask<Post, Tags_Count.ReduceResult>
{
    public class ReduceResult
    {
        public string Name { get; set; }
        public int Count { get; set; }
    }

    public Tags_Count()
    {
        Map = posts => from post in posts
                       from tag in post.Tags
                       select new { Name = tag.ToString().ToLower(), Count = 1 };

        Reduce = results => from tagCount in results
                            group tagCount by tagCount.Name
                            into g
                            select new {Name = g.Key, Count = g.Sum(x => x.Count) };    
    }
}

もちろん、特定の「セクション」に制限するための条件が必要です。

于 2012-04-16T02:02:25.720 に答える
1

別のアプローチは、ファセット検索を使用して、そこからカウントを取得することです。カウントを取得するときにクエリを指定できるため、Map/Reduce よりも少し柔軟です。

次のようなインデックスがあるとします。

    from question in docs
    from tag in question.Tags
    select new 
    { 
        question.CreatedOn, 
        Tag = tag
    }

次に、このようにファセット範囲を定義します (デフォルトの動作を使用して、すべての一意の用語を探します)。

    var facetSetupDoc = new FacetSetup 
        { 
            Id = "facets/TagFacets", 
            Facets = new List<Facet> { new Facet {Name = "Tag"} } 
        }

最後に、次のようにクエリします。

    var facetResults = s.Query<Question>("QuestionTags")
                .Where(x => x.CreatedOn >= new DateTime(2008, 5, 20))
                .ToFacets("facets/TagFacets");

このコード サンプルを見てください。正確なシナリオを実装する方法が示されています。

于 2012-04-16T08:45:16.167 に答える