【发布时间】:2016-12-01 02:10:43
【问题描述】:
我正在尝试将我的应用程序从 ElasticSearch Nest 1.7 升级到 2.4,并且基于属性的映射看起来应该可以工作,但它(完全)没有。我有一个这样的模型类:
[DataContract]
[ElasticsearchType(IdProperty = "Id")]
public class Series
{
[DataMember]
[String(Index = FieldIndexOption.Analyzed, Analyzer = "custom_en")]
public string Description { get; set; }
[DataMember]
[String(Index = FieldIndexOption.NotAnalyzed)]
public HashSet<Role> ReleasableTo { get; set; }
}
Nest 1.x 中的等效声明正在工作,我对该字段的术语查询返回了我期望的结果。当我没有收到任何结果时,我检查了映射,令我惊讶的是,Index = FieldIndexOption.NotAnalyzed 没有得到尊重。我生成的映射是这样的:
"properties" : {
"description" : {
"type": "string"
}
"releasableTo" : {
"type": "string"
}
}
因此,我设置了自定义分析器的字段都没有正确标记,我不需要分析的字段也没有正确标记。
这是我用来初始化一切的代码:
var indexDescriptor = new CreateIndexDescriptor(DefaultIndex)
.Mappings(ms => ms
.Map<Series>(m => m.AutoMap())
)
);
indexDescriptor.Settings(s => s
.NumberOfShards(3)
.NumberOfReplicas(2)
.Analysis(a => a
.CharFilters(c => c.Mapping("&_to_and", mf => mf.Mappings( "&=> and ")))
.TokenFilters(t => t.Stop("en_stopwords", tf=>tf.StopWords(new StopWords(stopwords)).IgnoreCase()))
.Analyzers(z => z
.Custom("custom_en", ca => ca
.CharFilters("html_strip", "&_to_and")
.Tokenizer("standard")
.Filters("lowercase", "en_stopwords")
)
)
)
);
client.CreateIndex(indexDescriptor);
注意:client 是 elasticsearch 客户端。
我知道DataContract 属性并不严格适用于 ElasticSearch,但我还需要将这些对象序列化到磁盘进行处理。使用 Nest 1.x 没有冲突,因此不会造成任何问题。
我不关心分析器的创建。我担心映射不尊重比类型更具体的任何东西。
如何让 Nest 2.x 尊重属性中的附加信息,这样我就不必在声明映射时手动映射它们?
因此,映射问题与同时映射的其他类型有关。索引中有一个无效的响应,我没有捕捉到。完成工作非常令人沮丧,但现在映射工作正常。
【问题讨论】:
-
注意:修正了@RussCam 在他的回答中指出的错字。
标签: c# nest elasticsearch-2.0