0

在我之前的问题旁边。我现在想执行 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 Index,但我发现很难让它工作。

有什么帮助吗?谢谢。

编辑: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),
                                           };
    }
}
4

2 回答 2

0

书名不会经常改变,所以你为什么不包括Title里面的BookFavourite,像这样:

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

然后你可以只查询对象BookTitle中的。BookFavourite

您将复制数据,但数据不会更改,因此您不必担心更新它。

更新(根据额外信息)

IsFavourite在类中存储一个字段怎么样Book,然后您可以在查询中使用它?您只需要维护此字段,因为书是“收藏”。

public class Book
{
    public string Id { get; set; }
    public string Title { get; set; }
    public bool IsFavourite { get; set; }
}
于 2012-04-24T10:58:37.993 回答
-1

我相信这个答案应该可以解决您在我问的类似问题中链接 Book 和 BookFavorite 的问题: Link

编辑:它假设您的 Book 和 BookFavorite 包含在单独的列表中

于 2012-04-24T10:57:59.110 回答