【问题标题】:Dynamically add named mapping to Index将命名映射动态添加到索引
【发布时间】:2017-05-25 22:23:44
【问题描述】:

我想在创建索引后为其添加映射。我已经创建了这样的索引:

client.CreateIndex("typeaheads", c => c
                         .Settings(t => t.Analysis(m => m.TokenFilters(fl => fl.EdgeNGram("edge_ngram_filter", ad => ad.MinGram(2).MaxGram(20)))
                         .Analyzers(anz => anz.Custom("edge_ngram_analyzer", an => an.Filters("lowercase", "edge_ngram_filter").Tokenizer("standard"))))));

变量 typeName,是我想要的映射名称。

当我执行这个时:

var map = new CreateIndexDescriptor("typeaheads")
                               .Mappings(ms => ms
                               .Map(typeName, d => d.Properties(ps => ps.String(s => s.Name("countryCode")))
                               .Properties(ps => ps.String(s => s.Name("display_ID")))
                               .Properties(ps => ps.String(s => s.Name("display_String")))
                               .Properties(ps => ps.String(s => s.Name("id")))
                               .Properties(ps => ps.String(s => s.Name("languageCode")))
                               .Properties(ps => ps.String(s => s.Name("match_String").SearchAnalyzer("standard").Index(FieldIndexOption.Analyzed).Analyzer("edge_ngram_analyzer")))
                               .Properties(ps => ps.String(s => s.Name("type")))
                               .Properties(ps => ps.Number(s => s.Name("boostFactor").Type(NumberType.Long)))));
var response = client.Index(map);

我在我的 ES 服务上得到这个输出: Wrong Mapping

我想得到这个:Correct Mapping

有什么想法吗?

【问题讨论】:

标签: c# .net elasticsearch nest


【解决方案1】:

如果您有一个现有索引并希望为其添加映射,则可以使用 Put Mapping API 来完成,在 NEST 中显示为 client.Map<T>()client.MapAsync<T>()

var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var connectionSettings = new ConnectionSettings(pool);              
var client = new ElasticClient(connectionSettings);

var typeName = "my-type";

var mappingResponse = client.Map<object>(d => d
    .Index("typeaheads")
    .Type(typeName)
    .Properties(ps => ps
        .String(s => s.Name("countryCode"))
        .String(s => s.Name("display_ID"))
        .String(s => s.Name("display_String"))
        .String(s => s.Name("id"))
        .String(s => s.Name("languageCode"))
        .String(s => s
            .Name("match_String")
            .SearchAnalyzer("standard")
            .Index(FieldIndexOption.Analyzed)
            .Analyzer("edge_ngram_analyzer")
        )
        .String(s => s.Name("type"))
        .Number(s => s
            .Name("boostFactor")
            .Type(NumberType.Long)
        )
    )
);

发送以下请求

PUT http://localhost:9200/typeaheads/my-type/_mapping?pretty=true 
{
  "properties": {
    "countryCode": {
      "type": "string"
    },
    "display_ID": {
      "type": "string"
    },
    "display_String": {
      "type": "string"
    },
    "id": {
      "type": "string"
    },
    "languageCode": {
      "type": "string"
    },
    "match_String": {
      "type": "string",
      "index": "analyzed",
      "analyzer": "edge_ngram_analyzer",
      "search_analyzer": "standard"
    },
    "type": {
      "type": "string"
    },
    "boostFactor": {
      "type": "long"
    }
  }
}

【讨论】:

  • 谢谢,这确实有效。我认为映射将采用Map&lt;object&gt; 中指定的对象名称的名称。但我猜,它被设置 .Type() 覆盖了,对吧?
  • 类型会从Map&lt;T&gt;()中的T推断,正确;默认情况下,NEST 将 POCO 类型名称小写,正如您所说,这可以通过调用 .Type(TypeName typename) 来覆盖。我在示例中使用了object,因为不清楚您是否有 POCO 来表示您的文档。
猜你喜欢
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
相关资源
最近更新 更多