【问题标题】:NEST - Index individual fieldsNEST - 索引单个字段
【发布时间】:2014-06-07 19:46:22
【问题描述】:

我正在我的网站上过渡到 ElasticSearch,并使用 NEST 作为我的 C# .NET 接口。

在编写代码来索引我的内容时,我不知道如何单独映射字段。假设我有以下内容:

var person = new Person
{
    Id = "1",
    Firstname = "Martijn",
    Lastname = "Laarman",
    Email = "Martijn@gmail.com",
    Posts = "50",
    YearsOfExperience = "26"

};

而不是使用索引整个数据集:

var index = client.Index(person);

我想索引 FirstName 和 LastName 以便可以搜索它们,但我不需要索引中的其他字段(ID 除外),因为它们只会占用空间。谁能帮我编写代码来分别映射这些字段?

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    您应该在最初创建索引时添加映射。您可以这样做的一种方法是在您的类上使用 NEST 属性,如下所示:

    public class Person
    {
        public string Id { get; set; }
    
        public string Firstname { get; set; }
    
        public string Lastname { get; set; }
    
        [ElasticProperty(Store=false, Index=FieldIndexOption.not_analyzed)]
        public string Email { get; set; }
    
        [ElasticProperty(Store = false, Index = FieldIndexOption.not_analyzed)]
        public string Posts { get; set; }
    
        [ElasticProperty(Store = false, Index = FieldIndexOption.not_analyzed)]
        public string YearsOfExperience { get; set; }
    }
    

    然后你会像这样创建你的索引:

    client.CreateIndex("person", c => c.AddMapping<Person>(m => m.MapFromAttributes()));
    

    除了使用属性,您还可以显式映射每个字段:

    client.CreateIndex("person", c => c.AddMapping<Person>(m => m
        .MapFromAttributes()
        .Properties(props => props
            .String(s => s.Name(p => p.Email).Index(FieldIndexOption.not_analyzed).Store(false))
            .String(s => s.Name(p => p.Posts).Index(FieldIndexOption.not_analyzed).Store(false))
            .String(s => s.Name(p => p.YearsOfExperience).Index(FieldIndexOption.not_analyzed).Store(false)))));
    

    查看NEST documentation 了解更多信息,特别是Create IndexPut Mapping 部分。

    【讨论】:

    • 感谢您的帮助 - 新版本的文档似乎更新了一半。我是否需要调用以下行:client.Index(person, "person", "string", person.Id.ToString(), new IndexParameters { Refresh = true });添加数据集?
    • 是的,上面的代码只是创建了你的索引并设置了你的映射。您仍然需要为您的文档编制索引。
    • @GregMarzouka 我认为 not_analyzed 仍然索引而不分析?有第 3 个选项 Index = FieldIndexOption.no。这不是关闭属性索引的正确方法吗?
    • @GregMarzouka 你愿意为 6.x 更新这个答案吗?当前的文档,特别是围绕attribute mapping 的文档有点缺乏。具体来说,我不知道如何通过属性为字段指定index = false。我尝试了[Ignore],但这不是我想要的——它完全从文档中排除了该属性。我只想指定它不可查询。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2021-08-12
    • 1970-01-01
    • 2012-11-16
    • 2018-06-02
    相关资源
    最近更新 更多