Elasticsearch -【NEST高级客户端--Mapping映射】

Mapping映射

要使用NEST与Elasticsearch进行交互,我们需要能够将我们的解决方案中的POCO类型映射到存储在Elasticsearch中的反向索引中的JSON文档和字段。

本节介绍NEST中可用的所有不同功能,使POCO和Elasticsearch变得轻而易举。

在Elasticsearch中显式映射文档对于为给定的问题域提供定制搜索解决方案至关重要。

虽然Elasticsearch能够基于遇到的该类型的第一个文档来推断索引中给定类型的映射,但推测的映射有时不足以构建一个非常优秀的搜索体验。

要显式控制映射,可以在创建索引时指定显式类型映射,或者在索引该类型的第一个文档之前添加到现有索引(因为索引没有显式映射的文档将导致Elasticsearch推断映射)。

有几种方式来控制NEST中的映射

自动映射(从POCO属性类型推断)
属性映射
Fluent映射
通过访客模式

并且这些可以组合以形成整体映射方法。另外还有办法控制

忽略属性
多个字段

自动映射 

在创建索引或通过Put Mapping API创建映射时,NEST提供了一个称为自动映射的功能,可以从您正在映射的CLR POCO属性类型自动推断出正确的Elasticsearch字段数据类型。

NEST已经推断出对以下.NET类型的映射支持

String映射到"text"与"keyword"子字段。
Int32映射到"integer"
UInt16映射到"integer"
Int16映射到"short"
Byte映射到"short"
Int64映射到"long"
UInt32映射到"long"
TimeSpan映射到"long"
Single映射到"float"
Double映射到"double"
Decimal映射到"double"
UInt64映射到"double"
DateTime映射到"date"
DateTimeOffset映射到"date"
Boolean映射到"boolean"
Char映射到"keyword"
Guid映射到"keyword"

并支持NEST中定义的一些特殊类型

Nest.GeoLocation映射到"geo_point"
Nest.CompletionField映射到"completion"
Nest.Attachment映射到"attachment"
Nest.DateRange映射到"date_range"
Nest.DoubleRange映射到"double_range"
Nest.FloatRange映射到"float_range"
Nest.IntegerRange映射到"integer_range"
Nest.LongRange映射到"long_range"

所有其他类型默认映射到"object"

映射递归

在大多数情况下,当涉及到Elasticsearch映射时,通常有一个这样的深度嵌套映射的边缘案例。 但是,您仍然可能需要执行此操作,因此您可以控制.AutoMap()的递归深度。

现在我们来指定一个maxRecursion为3

var withMaxRecursionDescriptor = new CreateIndexDescriptor("myindex")
    .Mappings(ms => ms
        .Map<A>(m => m.AutoMap(3))//.AutoMap()现在已经映射了我们的Child属性的三个层级
    );

属性映射

在自动映射中,您看到可以使用.AutoMap()从POCO的属性推断出POCO的类型映射。 但是,当您想要映射到推测的映射时,您会做什么? 这是属性映射可以帮助的地方。

可以使用您的POCO类型和属性上的属性来定义您的映射。 使用属性属性并调用.AutoMap(),NEST将从POCO属性类型推断映射,并考虑映射属性。

[ElasticsearchType(Name = "company")]
public class Company
{
    [Keyword(NullValue = "null", Similarity = "BM25")]
    public string Name { get; set; }

    [Text(Name = "office_hours")]
    public TimeSpan? HeadOfficeHours { get; set; }

    [Object(Store = false)]
    public List<Employee> Employees { get; set; }
}

Fluent映射

Fluent映射POCO属性到Elasticsearch类型映射中的字段提供了对该过程的最大控制。 通过Fluent映射,POCO的每个属性都被显式映射到一个Elasticsearch类型的字段映射。

//这里,Company类型的Name属性已被映射为文本数据类型,Employees属性映射为对象数据类型。 在此对象映射中,仅映射了Employee类型的FirstName,LastName和Salary属性。

var descriptor = new CreateIndexDescriptor("myindex")
    .Mappings(ms => ms
        .Map<Company>(m => m
            .Properties(ps => ps
                .Text(s => s
                    .Name(c => c.Name)
                )
                .Object<Employee>(o => o
                    .Name(c => c.Employees)
                    .Properties(eps => eps
                        .Text(s => s
                            .Name(e => e.FirstName)
                        )
                        .Text(s => s
                            .Name(e => e.LastName)
                        )
                        .Number(n => n
                            .Name(e => e.Salary)
                            .Type(NumberType.Integer)
                        )
                    )
                )
            )
        )
    );
自动映射与fluent 覆盖

在大多数情况下,您将需要映射不仅仅是vanilla数据类型,还可以为您的属性提供各种选项,例如要使用的分词器,是否启用doc_values等。

在这种情况下,可以将.AutoMap与显式映射的属性结合使用。fluent 映射也优先于属性映射。 这样可以组合 fluent ,属性和自动映射。

自动映射将覆盖对象图

您可能已经在Automap with fluent overrides example中注意到例,表明Company上的Employees属性的属性未映射。 这是因为automapping 应用仅在Company映射的根级别。

通过在.Nested<Employee>映射中调用.AutoMap,可以自动映射Employee嵌套属性,并再次通过手动映射来覆盖自动映射过程中的任何推断映射

var descriptor = new CreateIndexDescriptor("myindex")
    .Mappings(m => m
        .Map<Company>(mm => mm
            .AutoMap() 
            .Properties(p => p 
                .Nested<Employee>(n => n
                    .Name(c => c.Employees)
                    .AutoMap() 
                    .Properties(pp => pp 
                        .Text(t => t
                            .Name(e => e.FirstName)
                        )
                        .Text(t => t
                            .Name(e => e.LastName)
                        )
                        .Nested<Employee>(nn => nn
                            .Name(e => e.Employees)
                        )
                    )
                )
            )
        )
    );

访客模式应用规范

可以对所有或特定属性转换。.AutoMap在内部实现访问者模式。 默认访问者NoopPropertyVisitor不执行任何操作,也可以作为空白画布来实现您自己的访问方法。

public class DisableDocValuesPropertyVisitor : NoopPropertyVisitor
{
    public override void Visit(
        INumberProperty type,
        PropertyInfo propertyInfo,
        ElasticsearchPropertyAttributeBase attribute) 
    {
        type.DocValues = false;
    }

    public override IProperty Visit(PropertyInfo propertyInfo, ElasticsearchPropertyAttributeBase attribute)
    {
            Type propertyType = propertyInfo.PropertyType;
            if (propertyType.Name == "Guid") return new KeywordProperty();
            return attribute;
    }
}

当使用访问者模式修改类型时,只针对当前AutoMap的对象,对于深层嵌套的类型修改需重写访问者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值