2017-11-21 16 views
0

オートコンプリート機能を作成しようとしていますが、動作していると思いますが、カスタムアナライザが奇妙な結果を返すことがあります。NESTカスタムアナライザNGramが正しい結果を返さない

var response = this.client.CreateIndex(
        ElasticConfig.IndexName, 
        index => index 
         .Mappings(
          ms => ms.Map<EmployeeDocument>(
           m => m.Properties(
            p => p 
             .Text(t => t.Name(n => n.EmpFirstName).Analyzer("auto-complete").Fields(ff => ff.Keyword(k => k.Name("keyword")))) 
             .Text(t => t.Name(n => n.pkEmpID).Analyzer("auto-complete").Fields(ff => ff.Keyword(k => k.Name("keyword")))) 
             .Text(t => t.Name(n => n.Description).Analyzer("auto-complete").Fields(ff => ff.Keyword(k => k.Name("keyword"))))))) 
          .Settings(
          f => f.Analysis(
            analysis => analysis 
            .Tokenizers(
             tokenizers => 
             tokenizers 
              .EdgeNGram("ngram", t => t.MinGram(3).MaxGram(5))) 
            .Analyzers(
             analyzers => analyzers.Custom(
              "auto-complete", 
              a => a.Filters(new List<string> { "lowercase", "ngram" }).Tokenizer("standard")))))); 

私は

127.0.0.1:9200/default-index/_analyze?text=dan&analyzer=auto-complete 

を呼び出す場合、私は、私は上記のように3に私のMinGramを設定

{ 
    "tokens": [ 
     { 
      "token": "d", 
      "start_offset": 0, 
      "end_offset": 3, 
      "type": "<ALPHANUM>", 
      "position": 0 
     }, 
     { 
      "token": "da", 
      "start_offset": 0, 
      "end_offset": 3, 
      "type": "<ALPHANUM>", 
      "position": 0 
     }, 
     { 
      "token": "a", 
      "start_offset": 0, 
      "end_offset": 3, 
      "type": "<ALPHANUM>", 
      "position": 0 
     }, 
     { 
      "token": "an", 
      "start_offset": 0, 
      "end_offset": 3, 
      "type": "<ALPHANUM>", 
      "position": 0 
     }, 
     { 
      "token": "n", 
      "start_offset": 0, 
      "end_offset": 3, 
      "type": "<ALPHANUM>", 
      "position": 0 
     } 
    ] 
} 

は間違いなく間違って取得するには、私は設定をしないのですか?

答えて

0

私はトークンを作成した方法を変更しました。 Tokenizersの代わりにTokenFiltersを使用する方法に注意してください。

var response = this.client.CreateIndex(
        ElasticConfig.IndexName, 
        index => index.Mappings(
         ms => ms.Map<EmployeeDocument>(
          m => m.Properties(
           p => p 
            .Text(t => t.Name(n => n.EmpFirstName).Analyzer("auto-complete").Fields(ff => ff.Keyword(k => k.Name("keyword")))) 
            .Text(t => t.Name(n => n.pkEmpID).Analyzer("auto-complete-id").Fields(ff => ff.Keyword(k => k.Name("keyword")))) 
            .Text(t => t.Name(n => n.Description).Analyzer("auto-complete").Fields(ff => ff.Keyword(k => k.Name("keyword"))))))) 
         .Settings(f => f.Analysis(
          analysis => analysis 
           .Analyzers(
            analyzers => analyzers 
             .Custom("auto-complete", a => a.Tokenizer("standard").Filters("lowercase", "auto-complete-filter")) 
             .Custom("auto-complete-id", a => a.Tokenizer("standard").Filters("lowercase", "auto-complete-id-filter"))) 
             .TokenFilters(tokenFilter => tokenFilter 
                    .EdgeNGram("auto-complete-filter", t => t.MinGram(3).MaxGram(5)) 
                    .EdgeNGram("auto-complete-id-filter", t => t.MinGram(1).MaxGram(5)))))); 
関連する問題