在我在RavenDB讨论板上提出的关于制作大量类似索引的问题中,有人告诉我,我不应该制作“那么多做同样事情的索引”并告诉我应该制作一个“字符串索引”相反 - 确切的话是......
没有理由让这么多索引做同样的事情。 使用以下命令创建索引:
来自文档中的d 选择新{d.Id,d.Name,Collection = d [“@ metadata”] [“Raven-Entity-Name”]}
并查询。
我完全不明白这意味着什么,我在今天之前已经多次阅读了乌鸦文档,而且我仍然非常迷失并且在黑暗中。
我能想到的最好的;或者我最了解的,有点像这样...
RavenSession.Advanced.DocumentStore.DatabaseCommands.PutIndex("Index/Name",
new Raven.Client.Indexes.IndexDefinitionBuilder<IMayTransform>{
Map = results => from result in results
select new{
result.Id,
result.Name,
result["@metadata"]["Raven-Entity-Name"]
}
});
按要求添加所涉及的接口。
public interface IMayTransform : IHasIdentity, IHasName { }
public interface IHasIdentity {
/// <summary>
/// A string based identity that is used by raven to store the entity.
/// </summary>
string Id { get; set; }
}
public interface IHasName {
/// <summary>
/// The friendly display name for the entity.
/// </summary>
string Name { get; set; }
}
但这不起作用。首先,关于["@metadata"]
的部分没有编译;如果它在我引用的例子中存在,我甚至不理解其目的。我不明白我应该如何查询这样的东西 - 或者它在哪里,或者在何处定义,如何调用它等等。我几乎没有关于“string index
”的概念
最重要的是,我不理解我如何添加分析仪。任何帮助表示赞赏;这是一个可怕的,可怕的早晨,我疯狂地至少完成了一些一些工作,但这让我非常困惑。
IMayTransform
是一个接口,每个需要适合它的实体都会实现。
在堆栈溢出的答案和Ayende对ravendb google小组的光荣帮助之间,我有以下索引可行。我讨厌。
public class EntityByName : AbstractIndexCreationTask {
public override IndexDefinition CreateIndexDefinition() {
return new IndexDefinition {
Map = "from doc in docs let collection = doc[\"@metadata\"][\"Raven-Entity-Name\"] select new { doc.Id, doc.Name, doc.Abbreviation, Group_Name = doc.Group.Name, Tags = doc.Tags.Select( r => r.Name ), collection };",
Indexes = {
{"Name", FieldIndexing.Analyzed },
{"Abbreviation", FieldIndexing.Analyzed },
{"Tags", FieldIndexing.Analyzed },
{"Group.Name", FieldIndexing.Analyzed }
},
Fields ={
{ "Name" },
{ "Abbreviation" },
{ "Group.Name" },
//{ "Tags" }
},
Stores ={
{ "Name", FieldStorage.Yes },
{ "Abbreviation", FieldStorage.Yes },
{ "Group.Name", FieldStorage.Yes },
//{ "Tags", FieldStorage.Yes }
},
SortOptions = {
{ "collection", SortOptions.String },
{ "Name", SortOptions.String }
}
};
}
}
这正是我需要它做的。它快速,高效,工作正常,它给我带来了麻烦,但是将所有内容硬编码到字符串查询中让我疯狂。我正在结束这个问题并开启一个关于此问题的新问题,但如果有人就我可以摆脱这个问题的方法提出建议,我很乐意听到他们的意见。这是个人欲望的问题,而不是功能需求。
答案 0 :(得分:0)
尝试这样
RavenSession.Advanced.DocumentStore.DatabaseCommands.PutIndex(
"Index/Name",
new IndexDefinition {
Map = "from d in docs select new { Id = d.Id, Name = [\"@metadata\"][\"Raven-Entity-Name\"]}"
});
现在你看,这也是一个“字符串索引”。
顺便说一句:有一个内置索引,与此类似:Raven/DocumentsByEntityName
用法:
public class Entity
{
public string Id { get; set; }
public string Name { get; set; } }
}
session.Query<Entity>("Index/Name").Where(x => x.Name == "Foo");
进一步说明:
现在可以使用仅使用接口来构建索引。为了达到你想要的效果,Raven需要实现一个BaseEntity,它将matadata填充为属性,所有文档必须从该Entity派生。但这不会发生,也没有人知道这一点。 但是,在设计文档时,您可以自己集成实体名称,例如
public class EntityBase
{
public EntityBase()
{
this.TypeName = this.GetType().Name;
}
public string Name { get; set; }
public string TypeName { get; set; }
}
public class Person : EntityBase
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
现在您可以根据EntityBase
构建一个ravendb索引并查询TypeName