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

Indexing 使用Lucene通过索引从RavenDb中的文档返回子属性,indexing,lucene,ravendb,Indexing,Lucene,Ravendb,我使用的是RavenDB 2.5,我想做的是查询一个提供有效Lucene搜索词的组(见下文),并返回一组匹配的成员实例(甚至只是ID)。因此,类定义: public class Group { public string Id { get; set; } public IList<Member> Members { get; set; } } public class Member { public string Name { get; set; }

我使用的是RavenDB 2.5,我想做的是查询一个提供有效Lucene搜索词的
组(见下文),并返回一组匹配的
成员
实例(甚至只是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; }
}
如果我用以下方式来称呼它:

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();
session.Advanced.LuceneQuery().Where(“Id:myId和Content:search terms”).ToList();

很明显,我得到了一个组实例,但是我怎样才能取回成员呢?

像这样的索引呢:

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条目。因此,您将能够查询并检索这些元素


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

session.Query()
.Search(x=>x.Content,“搜索词”)
.ProjectFromIndexFieldsInto()项目
.ToList();
我现在无法检查这一点,但我想您需要使用ProjectFromIndexFieldsInto()来投影结果。有关中的投影的更多信息

或者,按照您的示例:

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

首先-这让我走上了正轨,基本上就在那里,谢谢!我必须做一些改变才能让它工作:1。使用
LuceneQuery
版本-我必须在
ToList()
之前放置
.SelectFields
,以进行投影。2.我使用
索引
属性作为索引,但必须使用
存储
属性作为投影中要返回的实际字段,即
存储={{{“Name”,FieldStorage.Yes},{“Bio”,FieldStorage.Yes}
很乐意提供帮助。是的,您需要使用Stores,因为您想要在lucene文档中存储字段(我有点匆忙,错过了,抱歉)。而且我猜你不需要索引名字和简历。注:我已经用你的反馈更新了我的anwser,谢谢!
session.Advanced
       .LuceneQuery<Member, Members_BySearchTermAndGroup>()
       .Where("GroupId: myId AND Content: search terms")
       .SelectFields<Member>()
       .ToList();