繁体   English   中英

使用Lucene通过Index从RavenDb中的文档返回子属性

[英]Returning sub-properties from document in RavenDb via Index using Lucene

我正在使用RavenDB 2.5,我想做的是查询提供有效Lucene搜索词的Group (请参阅下文),并获取匹配的Member实例(甚至只是ID)的集合。 因此,类定义:

public class Group {
    public string Id { get; set; }
    public IList<Member> Members { get; set; }
}

public class Member {
    public string Name { get; set; }
    public string Bio { get; set; }
}

并且它们作为session.Store(groupInstance);存储在数据库中session.Store(groupInstance); 如您所愿。 我想做的是查询并返回与给定搜索词匹配的Member实例。

因此,类似:

public class GroupMembers_BySearchTerm : AbstractIndexCreationTask {
    public override IndexDefinition CreateIndexDefinition(){
        return new IndexDefinition {
            Map = "from g in docs.Groups select new { Content = new [] { g.Members.Select(m => m.Name), g.Members.Select(m => m.Bio) }, Id = g.Id }",
            Indexes = { { "Id", FieldIndexing.Default }, { "Content", FieldIndexing.Analyzed } }
        }
    }
}

如果我使用类似这样的方式进行调用:

session.Advanced.LuceneQuery<Group, GroupMembers_BySearchTerm>().Where("Id: myId AND Content: search terms").ToList();

我显然可以找回Group实例,但是我该如何找回Member?

像这样的索引呢:

public class Members_BySearchTermAndGroup : AbstractIndexCreationTask {
    public override IndexDefinition CreateIndexDefinition(){
        return new IndexDefinition {
            Map = "from g in docs.Groups
                   from member in g.Members
                   select new {
                   GroupdId = g.Id,
                   Name = member.Name,
                   Bio = member.Bio,
                   Content = new [] {member.Name, member.Bio },
                  }",
            Indexes = { 
                          { "GroupId", FieldIndexing.Default }, 
                          { "Content", FieldIndexing.Analyzed } 
                      },
            Stores = {
                          { "Name", FieldStorage.Yes },
                          { "Bio", FieldStorage.Yes }
                     }
        }
    }
}

如果仔细观察,您会发现我们正在为组内的每个成员创建一个新的Lucene条目。 因此,您将能够查询这些元素并检索它们。


最后,您可以像这样查询您的商店(有关search的更多信息):

session.Query<Member, Members_BySearchTermAndGroup>()
       .Search(x => x.Content, "search terms")
       .ProjectFromIndexFieldsInto<Member>()
       .ToList();

我现在无法检查此内容,但我想您需要使用ProjectFromIndexFieldsInto()来投影结果。 有关此链接中的投影的更多信息。

或者,按照您的示例:

session.Advanced
       .LuceneQuery<Member, Members_BySearchTermAndGroup>()
       .Where("GroupId: myId AND Content: search terms")
       .SelectFields<Member>()
       .ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM