如何搜索具有某种联接的文档

本文关键字:文档 何搜索 搜索 | 更新日期: 2023-09-27 18:32:01

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

有什么帮助吗?谢谢。

编辑:多地图索引

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),
                                           };
    }
}

如何搜索具有某种联接的文档

书名不会经常更改,那么为什么不在BookFavourite中包含Title,如下所示:

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; }
}
我相信

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

编辑:它假设您的书和书收藏夹包含在单独的列表中