2017-08-11 183 views
1

我们使用Nest 5.5.0和属性映射在Elasticsearch中创建索引。作为我们一些属性的一部分,我们使用自定义的JsonConverters。NEST 5.5属性映射和自定义JsonConverter不起作用

我们正在从1.7.3进行迁移,其中正确处理了此映射。升级后,我们可以在映射中看到它已经映射了字段而不使用转换器。当我们索引文档时,会使用转换器并且索引操作失败。

实施例:

巢和Elasticsearch 1.7.3

// code 
public class MyItem 
{ 
    [JsonProperty("start")] 
    [JsonConverter(typeof(LocalTimeConverter))] 
    public LocalTime Start { get; set; } 
} 

// index creation 
elasticClient.CreateIndex("indexname", d => d.AddMapping<MyItem>(m => m.MapFromAttributes())) 

// generated mapping (mapped as how the JsonConverter would output it) 
"myitem": { 
    "start": { 
     "type": "string" 
    } 
} 

巢和Elasticsearch 5.5.0

// code 
public class MyItem 
{ 
    [JsonProperty("start")] 
    [JsonConverter(typeof(LocalTimeConverter))] 
    public LocalTime Start { get; set; } 
} 

// index creation 
elasticClient.CreateIndexAsync(IndexName<T>(), d => d.Mappings(m => m.Map<MyItem>(mm => mm.AutoMap()))); 

// generated mapping (essentially a serialized version of the class) 
"myitem": { 
    "properties": { 
     "clockHourOfHalfDay": { "type": "integer"}, 
     ... 
     ... 
     "hour": {"type": "integer" } 
} 

NOTES:

  • 本地时间我■从NodaTime库一类
  • 我产生映射时自定义LocalTimeConverter采取本地时间和输出一个字符串

我怎么能强迫巢5.5.0考虑到了JsonConverter属性?

回答

2

要映射LocalTimekeyword类型(我想这是你想要的东西,这将不进行分析,但仍然进行索引和搜索的),你可以使用

public class MyItem 
{ 
    [JsonProperty("start")] 
    [JsonConverter(typeof(LocalTimeConverter))] 
    [Keyword] 
    public LocalTime Start { get; set; } 
} 

并创建索引和映射正如你现在所做的那样。

如果您希望默认为NEST骆驼案例属性名称,那么也可以省略JsonPropertyAttribute

这将产生映射

{ 
    "mappings": { 
    "myitem": { 
     "properties": { 
     "start": { 
      "type": "keyword" 
     } 
     } 
    } 
    } 
} 
+0

谢谢!这确实有效。如果房产是'List ',你会怎么做?我想将它映射为字符串列表,而不是对象列表。 – Kenneth

+0

你可以用同样的方法来映射它。 Elasticsearch不区分属性的单个值或同一类型的多个值。 –