RavenDB - "字符串索引"

时间:2014-03-31 15:47:45

标签: ravendb

在我在RavenDB讨论板上提出的关于制作大量类似索引的问题中,有人告诉我,我不应该制作“那么多做同样事情的索引”并告诉我应该制作一个“字符串索引”相反 - 确切的话是......

  

没有理由让这么多索引做同样的事情。   使用以下命令创建索引:

     

来自文档中的d   选择新{d.Id,d.Name,Collection = d [“@ metadata”] [“Raven-Entity-Name”]}

     

并查询。

Reference Topic

我完全不明白这意味着什么,我在今天之前已经多次阅读了乌鸦文档,而且我仍然非常迷失并且在黑暗中。

我能想到的最好的;或者我最了解的,有点像这样...

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

这正是我需要它做的。它快速,高效,工作正常,它给我带来了麻烦,但是将所有内容硬编码到字符串查询中让我疯狂。我正在结束这个问题并开启一个关于此问题的新问题,但如果有人就我​​可以摆脱这个问题的方法提出建议,我很乐意听到他们的意见。这是个人欲望的问题,而不是功能需求。

1 个答案:

答案 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