2012-04-24 10 views
0

私の前のquestionの次に。私はluceneクエリの検索を今実行したいと思います。しかし、唯一のお気に入りである本で、参加の種類のある文書を検索する方法

public class User 
{ 
    public string Id { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
} 

public class Book 
{ 
    public string Id { get; set; } 
    public string Title { get; set; } 
} 

public class BookFavorite 
{ 
    public string Id { get; set; } 
    public string UserId { get; set; } 
    public string BookId { get; set; } 
} 

だから、私はブックのフィールド「タイトル」に検索したい:

は、ここに私のモデルです。ですからBookとBookFavoriteとIndex Title Fieldの間で一種の結合をする必要があります。

私はMultiMap Indexを試しましたが、動作させるのが難しいと感じました。

助けが必要ですか?おかげさまで

EDIT:マルチマップインデックス

public class BookFavoriteSearchIndex : AbstractMultiMapIndexCreationTask<BookFavoriteSearchIndex.ReduceResult> 
{ 
    public class ReduceResult 
    { 
     public string BookId { get; set; } 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public string Abstract { get; set; } 
     public string Tag { get; set; } 
    } 

    public BookFavoriteSearchIndex() 
    { 
     AddMap<Book>(books => from book in books 
           from tag in book.Tags 
           select new 
             { 
              BookId = book.Id, 
              Title = book.Title, 
              Description = book.Description, 
              Abstract = book.Abstract, 
              Tag = tag 
             }); 

     AddMap<BookFavorite>(bfs => from bf in bfs 
            select new 
               { 
                BookId = bf.BookId, 
                Title = (string)null, 
                Description = (string)null, 
                Abstract = (string)null, 
                Tag = (string)null 
               }); 

     Reduce = results => from result in results 
          group result by result.BookId 
           into g 
           select new 
              { 
               BookId = g.Key, 
               Title = g.Select(x => x.Title).FirstOrDefault(x => x != null), 
               Description = g.Select(x => x.Description).FirstOrDefault(x => x != null), 
               Abstract = g.Select(x => x.Abstract).FirstOrDefault(x => x != null), 
               Tag = g.Select(x => x.Tag).FirstOrDefault(x => x != null), 
              }; 
    } 
} 
+0

あなたは現在のマルチマップインデックスを投稿できますか? –

+0

ちょうど編集されました。私はタグを含むすべてのthesesフィールドを検索する必要があることに注意してください。それは、1つの値だけではなく、すべてのタグ値をインデックスするように思われるので、別の問題になります... –

答えて

-1

私はこの回答が同様の問題のブックとBookFavoriteをリンクするあなたの問題を解決しなければならないと考えているが、私は尋ねた: Link

EDITを:それはあなたのブックとBookFavoriteを前提としていしかし、個々のリストには含まれています

+0

私はravendbについて、結合する。 –

0

書籍のタイトルは頻繁に変更されないので、をBookFavouriteの中に含めてください彼:

public class BookFavorite 
{ 
    public string Id { get; set; } 
    public string UserId { get; set; } 
    public string BookTitle { get; set; } 
} 

次に、あなただけのBookFavouriteオブジェクトにBookTitleに対してクエリを実行することができます。

データは複製されますが、データは変更されないため、データの更新について心配する必要はありません。

更新(追加の情報による)

BookクラスでIsFavouriteフィールドを格納について、あなたは、あなたのクエリでそれを使用することができますか?本が好きなので、このフィールドを維持するだけです。

public class Book 
{ 
    public string Id { get; set; } 
    public string Title { get; set; } 
    public bool IsFavourite { get; set; } 
} 
+0

実際、ここには非常に単純化されたモデルがあります。しかし、実際には、説明、タグのコレクションなどのようなフィールドを持つより複雑なモデルを持っています。すべてのフィールドをすべて検索してすべてのフィールドを複製する必要はなく、データを維持したくありませんこれらの文書間の一貫性 –

+0

IsFavoriteフィールドは、お気に入りが1人のユーザーであるため、私のオプションではありません。多分お気に入りはあなたのためのものではありませんが、一種のブックマークです。だから、私はそれがドキュメントとユーザーIDをリンクするドキュメントを作ることを意味すると思います。 –

関連する問題