アプリケーションをElasticSearch Nest 1.7から2.4にアップグレードしようとしていますが、属性ベースのマッピングはのようになりますが、の場合は動作しますが、(完全に)動作しません。ElasticSearch 2.xの属性マッピングで「NotAnalyzed」が無視される
[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が答えで指摘したタイプミスを修正しました。 –