Elasticsearch NEST中DefaultMappingFor用法:是否无需REST API创建映射?
关于NEST中DefaultMappingFor的用法解答
嘿,这个问题问到点子上了!我来给你把DefaultMappingFor的作用和用法说清楚:
1. 是否无需再通过REST API创建映射?
答案是大部分情况下不需要,但要分场景来看:
- 如果你的目标索引还不存在:当你第一次用NEST索引对应类型的文档时,NEST会自动帮你创建索引,并且把
DefaultMappingFor里配置的映射规则应用到这个索引的对应类型上,完全不用手动通过REST API去创建映射。 - 如果索引已经存在且已有手动配置的映射:
DefaultMappingFor不会自动覆盖或修改已有的映射(毕竟Elasticsearch本身就不允许随意修改已存在字段的映射,除非是新增字段)。这种情况下,如果你想让DefaultMappingFor的配置生效,需要主动调用PutMappingAPI来更新,但要注意Elasticsearch的映射修改限制。
2. NEST是否会在索引文档时使用声明的默认映射?
必须会!DefaultMappingFor的核心作用就是给特定的CLR类型设置默认的序列化/映射规则,当你索引该类型的文档时,NEST会严格按照你配置的规则来处理:
- 字段重命名(比如把CLR属性
Price映射成Elasticsearch里的product_price) - 忽略指定字段(比如不把
InternalId存入Elasticsearch) - 设置字段的类型、分词器、是否启用数字检测等规则
- 甚至指定该类型默认对应的索引名称
举个实际的代码例子,一看就懂:
// 先定义你的实体类 public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string InternalId { get; set; } } // 配置ConnectionSettings时设置DefaultMappingFor var settings = new ConnectionSettings(new Uri("http://localhost:9200")) .DefaultMappingFor<Product>(mapping => mapping .IndexName("products") // 指定Product类型默认存入products索引 .PropertyName(p => p.Price, "product_price") // 重命名字段 .Ignore(p => p.InternalId) // 忽略InternalId字段 .NumberDetection(false) // 关闭数字检测,避免字符串被自动识别为数字类型 ); var client = new ElasticClient(settings); // 索引第一个Product文档时,若products索引不存在,NEST会自动创建并应用上面的映射 var indexResponse = client.IndexDocument(new Product { Id = 1, Name = "MacBook Pro", Price = 1999.99m, InternalId = "INTERNAL_MBP_001" });
执行这段代码后,你去查看products索引的映射,会发现Price被映射成了product_price,InternalId根本没出现在映射里,完全符合你在DefaultMappingFor里的配置。
内容的提问来源于stack exchange,提问作者Sumatan
相关产品推荐
相关产品推荐

