2017-09-12 16 views
0

私のインデックス用のディスクリプタが正常に作成されました。すでに索引を作成しています。生成された応答は有効な応答です。 その後、どのように記述子を使用するかわかりません。NESTクライアントを使用したElastic Search用のCreateMappingDescriptorを使用してインデックスを作成する方法は?

var defaultIndex = "mynestclient"; 
var node = new Uri("http://localhost:9200"); 
var settings = new ConnectionSettings(node 
      ).DefaultIndex(defaultIndex); 
     var client = new ElasticClient(settings); 
     var clientcreated= client.CreateIndex(defaultIndex); 
     Console.WriteLine("Index Created"); 

var descriptor = new CreateIndexDescriptor(defaultIndex) 
        .Settings(s => s 
        .Analysis(a => a 
         .TokenFilters(t => t 
          .NGram("my_filter", ng => ng.MaxGram(32).MinGram(1))) 
         .Analyzers(an => an 
          .Custom("my_analyzer", ca => ca 
           .Tokenizer("standard") 
           .Filters("my_filter", "lowercase") 
          ) 
         ) 
        ) 
       ) 
       .Mappings(ms => ms 
        .Map<Investor>(m => m 
         .Properties(props => props 
          .Text(t => t 
           .Name(p => p.Name) 
           .Analyzer("my_analyzer") 
          ) 
          .Text(t => t 
           .Name(p => p.SomeOtherField) 
           .Analyzer("my_analyzer")) 
          .Boolean(b => b 
           .Name(p => p.IsActive)))); 

私はドキュメントを読んでいます。 Descriptorsを使うのはあまりありません。 また、誰かがPutMappingDescriptorsとCreateIndexDescriptorsの違いを指定するNESTを中心にドキュメントを指すことができた場合、または同様に役立つと思われます。 すべての入力を非常に感謝します。

答えて

2

記述子は、NESTを使用してElasticsearchエンドポイントへのリクエストを流暢に構築するためのタイプです。 Descriptorは、クライアント上の対応するメソッドに渡されます。あなたは、単に流暢に、この代わりに

var createIndexResponse = client.CreateIndex(defaultIndex, c => c 
     .Settings(s => s 
     .Analysis(a => a 
      .TokenFilters(t => t 
       .NGram("my_filter", ng => ng.MaxGram(32).MinGram(1))) 
      .Analyzers(an => an 
       .Custom("my_analyzer", ca => ca 
        .Tokenizer("standard") 
        .Filters("my_filter", "lowercase") 
       ) 
      ) 
     ) 
    ) 
    .Mappings(ms => ms 
     .Map<Investor>(m => m 
      .Properties(props => props 
       .Text(t => t 
        .Name(p => p.Name) 
        .Analyzer("my_analyzer") 
       ) 
       .Text(t => t 
        .Name(p => p.SomeOtherField) 
        .Analyzer("my_analyzer")) 
       .Boolean(b => b 
        .Name(p => p.IsActive)))) 
    ) 
); 
からパラメータを構築することができますので、例えば、 CreateIndex()方法で

var descriptor = new CreateIndexDescriptor(defaultIndex) 
        .Settings(s => s 
        .Analysis(a => a 
         .TokenFilters(t => t 
          .NGram("my_filter", ng => ng.MaxGram(32).MinGram(1))) 
         .Analyzers(an => an 
          .Custom("my_analyzer", ca => ca 
           .Tokenizer("standard") 
           .Filters("my_filter", "lowercase") 
          ) 
         ) 
        ) 
       ) 
       .Mappings(ms => ms 
        .Map<Investor>(m => m 
         .Properties(props => props 
          .Text(t => t 
           .Name(p => p.Name) 
           .Analyzer("my_analyzer") 
          ) 
          .Text(t => t 
           .Name(p => p.SomeOtherField) 
           .Analyzer("my_analyzer")) 
          .Boolean(b => b 
           .Name(p => p.IsActive)))); 

var createIndexResponse = client.CreateIndex(defaultIndex, c => descriptor); 

2番目のパラメータは、そうcパラメータは、デリゲートに渡されたCreateIndexDescriptorあるFunc<CreateIndexDescriptor, ICreateIndexRequest>です

Descriptorsを使用したAPI設計では、Descriptorの新しいインスタンスを自分でインスタンス化する必要はなく、Descriptorが作成されたFunc<TRequestDescriptor, TRequestInterface>を取得してから、必要なメソッドを呼び出してプロパティthを設定するだけです.Settings().Mappings()などで行ったことに似ています。これはFluent Lambda構文と呼ばれます。

FESTの代理人とラムダ式があなたのものでない場合、NESTはすべてのAPIのリクエストタイプ(オブジェクト初期化子の構文とも呼ばれます)も提供します。また、要求タイプはそれぞれ対応するTRequestInterfaceを実装し、NESTクライアントの各メソッドはオーバーロードされ、TRequestInterfaceになります。上記の例のオブジェクト初期化子当量が、それはあなた次第

var createIndexRequest = new CreateIndexRequest(defaultIndex) 
{ 
    Settings = new IndexSettings 
    { 
     Analysis = new Analysis 
     { 
      TokenFilters = new TokenFilters 
      { 
       { "my_filter", new NGramTokenFilter 
        { 
         MaxGram = 32, 
         MinGram = 1 
        } 
       } 
      }, 
      Analyzers = new Analyzers 
      { 
       { "my_analyzer", new CustomAnalyzer 
        { 
         Tokenizer = "standard", 
         Filter = new[] {"my_filter", "lowercase" } 
        } 
       } 
      } 
     } 
    }, 
    Mappings = new Mappings 
    { 
     { typeof(Investor), new TypeMapping 
      { 
       Properties = new Properties<Investor> 
       { 
        { i => i.Name, new TextProperty 
         { 
          Analyzer = "my_analyzer" 
         } 
        }, 
        { i => i.SomeOtherField, new TextProperty 
         { 
          Analyzer = "my_analyzer" 
         } 
        }, 
        { i => i.IsActive, new BooleanProperty() } 
       } 
      } 
     } 
    } 
}; 

var createIndexResponse = client.CreateIndex(createIndexRequest); 

流暢ラムダ構文、オブジェクト初期化子の構文、またはその両方を使用していている:)

また、誰もがに私を指すことができればPutMappingDescriptorsとCreateIndexDescriptorsの間の相違を指定するNESTに関する文書、またはLikewiseが参考になります。

PutMappingDescriptorCreateIndexDescriptorあなたは、必要に応じて同時にマッピングを作成することができ、インデックスを作成するのに対し、既存のインデックスにマッピングします。トピックは、ドキュメントのintroduction to the mapping sectionで議論されています。

関連する問題