2017-04-20 65 views
0

子字段我已经能够得到正确的ElasticSearch命令插入和基于我下面原始请求寻找我的记录:ElasticSearch NEST手动映射需要分析

Original ElasticSearch trying to be converted to NEST

PUT /sample 
{ 
    "settings": { 
    "index.number_of_shards": 5, 
    "index.number_of_replicas": 0, 
    "analysis": { 
     "filter": { 
     "nGram_filter": { 
      "type": "nGram", 
      "min_gram": 2, 
      "max_gram": 20, 
      "token_chars": [ 
      "letter", 
      "digit" 
      ] 
     }, 
     "edgenGram_filter": { 
      "type": "edgeNGram", 
      "min_gram": 2, 
      "max_gram": 20 
     } 
     }, 
     "analyzer": { 
     "ngram_index_analyzer": { 
      "type": "custom", 
      "tokenizer": "keyword", 
      "filter": [ 
      "lowercase", 
      "nGram_filter" 
      ] 
     }, 
     "edge_ngram_index_analyzer": { 
      "type": "custom", 
      "tokenizer": "keyword", 
      "filter": [ 
      "lowercase", 
      "edgenGram_filter" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "name": { 
      "type": "string", 
      "fields": { 
      "prefixes": { 
       "type": "string", 
       "analyzer": "edge_ngram_index_analyzer", 
       "search_analyzer": "standard" 
      }, 
      "substrings": { 
       "type": "string", 
       "analyzer": "ngram_index_analyzer", 
       "search_analyzer": "standard" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

然而,我我现在有尝试使用NEST命令转换此示例的问题。这是我迄今为止所做的,编译并将创建索引,但前缀子字段的子字段不存在。

Client.CreateIndex("sample", i => i 
        .Settings(s => s 
         .NumberOfShards(10) 
         .NumberOfReplicas(0) 
         .Analysis(a => a 
          .TokenFilters(tf => tf 
           .NGram("nGram_filter", td => td 
            .MinGram(2) 
            .MaxGram(20) 
           ) 
           .EdgeNGram("edgeNGram", td => td 
            .MinGram(2) 
            .MaxGram(20) 
           ) 
          ) 
          .Analyzers(anz => anz 
           .Custom("ngram_index_analyzer", cc => cc 
            .Tokenizer("keyword") 
            .Filters("lowercase", "nGram_filter") 
           ) 
           .Custom("edge_ngram_index_analyzer", cc => cc 
            .Tokenizer("keyword") 
            .Filters("lowercase", "edgenGram_filter") 
           ) 
          ) 
         ) 
        ) 
        .Mappings(m => m 
         .Map<test>(map => map 
          .Properties(ps => ps 
           .Text(t => t 
            .Name(n => n.name)     
            .Fields(f => f 
             .Text(tt => tt 
              .Name("prefixes") 
              .Analyzer("edge_ngram_index_analyzer") 
              .SearchAnalyzer("standard") 
             ) 
             .Text(tt => tt 
              .Name("substrings") 
              .Analyzer("ngram_index_analyzer") 
              .SearchAnalyzer("standard") 
             ) 
            ) 
           ) 
          ) 
         ) 
        ) 
       ); 

回答

1

似乎在EdgeNGram令牌筛选器名称中存在拼写错误。一项为edgeNGram,另一项为edgenGram_filter。所以当我运行嵌套使用以下映射

client.CreateIndex("sample", i => i 
     .Settings(s => s 
      .NumberOfShards(10) 
      .NumberOfReplicas(0) 
      .Analysis(a => a 
       .Analyzers(anz => anz 
        .Custom("ngram_index_analyzer", cc => cc 
         .Tokenizer("keyword") 
         .Filters("lowercase", "nGram_filter") 
        ) 
        .Custom("edge_ngram_index_analyzer", cc => cc 
         .Tokenizer("keyword") 
         .Filters("lowercase", "edgeNGram_filter") 
        ) 
       ) 
       .TokenFilters(tf => tf 
        .NGram("nGram_filter", td => td 
         .MinGram(2) 
         .MaxGram(20) 
         ) 
        .EdgeNGram("edgeNGram_filter", td => td 
         .MinGram(2) 
         .MaxGram(20) 
         ) 
       ) 
      ) 
     ) 
     .Mappings(m => m 
      .Map<test>(map => map 
       .Properties(ps => ps 
         .Text(t => t 
          .Name(n => n.name) 
          .Fields(f => f 
           .Text(tt => tt 
           .Name("prefixes") 
           .Analyzer("edge_ngram_index_analyzer") 
           .SearchAnalyzer("standard") 
           ) 
           .Text(tt => tt 
           .Name("substrings") 
           .Analyzer("ngram_index_analyzer") 
           .SearchAnalyzer("standard") 
           ) 
          ) 
         ) 
       ) 
      ) 
     ) 
    ); 

它将其转换为适当的JSON包括两个子字段。希望有所帮助。

+0

这很棒!我没有意识到EdgeNGram过滤器的名称是错误的。现在它按预期工作。谢谢 –