2012-04-24 5 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 и индексным полем заголовка.

Я пробовал с индексом MultiMap, но мне было трудно заставить его работать.

Любая помощь? Спасибо.

EDIT: Индекс MultiMap

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

Можете ли вы разместить текущий указатель MultiMap, который у вас есть? –

+0

Просто отредактирован. Обратите внимание, что мне нужно искать по всем полям тезисов, включая теги, что делает меня еще одной проблемой, поскольку, кажется, индексирует только одно значение, а не все значения тегов ... –

ответ

-1

Я считаю, что этот ответ должен решить проблему увязки книги и BookFavorite подобным вопросом я спросил: Link

EDIT: Это предполагает вашу книгу и BookFavorite содержатся в отдельных списках, хотя

+0

Я говорю о ravendb, я не могу использовать linq based присоединяется. –

0

Названия книг не так часто меняются, так почему бы вам не включить Title внутри BookFavourite, например, t его:

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

Тогда вы можете просто запросить против BookTitle в BookFavourite объектов.

Вы будете дублировать данные, но это данные, которые не изменяются, поэтому вам не нужно беспокоиться об их обновлении.

Update (в соответствии с дополнительной информацией)

насчет запоминания IsFavourite поля в Book классе, вы можете использовать это в запросах? Вам просто нужно поддерживать это поле, так как книга «прислушивается».

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

На самом деле, здесь очень упрощенная модель, которую я показываю в вопросе. Но на самом деле у меня более сложная модель с такими полями, как «Описание», «Коллекция тегов» и т. Д., И мне нужно искать по всем полям тезисов, поэтому я не хочу дублировать все эти поля, и я не хочу поддерживать данные согласованность между документами тезисов –

+0

Поле IsFavorite не является вариантом для меня, так как любимый пользователь. Может быть, любимый не означает для вас, но это своего рода закладки. Поэтому я думаю, что это делает документ, создающий документ, связывающий bookid и userid. –

Смежные вопросы