Indexing 使用Lucene通过索引从RavenDb中的文档返回子属性
我使用的是RavenDB 2.5,我想做的是查询一个提供有效Lucene搜索词的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; }
组(见下文),并返回一组匹配的成员实例(甚至只是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();