2017-11-11 12 views
1

私はelasticsearchをthis awesome tutorialから学びます。サンプルコードが指定されている「nusearch」インデックスを作成するには :特定のタイプをElasticSearchインデックスにマッピングする

 Client.CreateIndex("nusearch", i => i 
      .Settings(s => s 
       .NumberOfShards(2) 
       .NumberOfReplicas(0) 
       .Analysis(Analysis) 
      ) 
      .Mappings(m => m 
       .Map<Package>(MapPackage) 
      ) 
     ); 

をパッケージのクラスは「nusearch」インデックスに格納されることNESTに伝え.Mappingsセクションがあります。 は、なぜ私はそのようなエラーが出るん:そのようにインデックスパッケージにしようとしたとき

Index name is null for the given type and no default index is set. Map an index name using ConnectionSettings.MapDefaultTypeIndices() or set a default index using ConnectionSettings.DefaultIndex().' 

?:

 foreach (Package pack in packages) 
     { 
      Client.Index<Package>(pack); 
     } 

ConnectionSettings構成はこれに縮小されています

 _connectionSettings = new ConnectionSettings(CreateUri(9200)); 

私は理由は、なぜタイプは、特定のインデックスに格納する必要がありますConnectionSettings情報を追加する必要があるのだろうか? ConnectionSettingsで特定のPOCOをマップする必要はありますか? アプリケーションが大きく、マップする型がたくさんある場合はどうなりますか?それは厄介ではないですか? CreateIndexメソッドは、そのような情報を提供するためのより良い場所です。

私はすでにそれはそのようなコードで可能であることをチェックしました:

    _connectionSettings = new ConnectionSettings(CreateUri(9200)) 
         .MapDefaultTypeIndices(m => m.Add(typeof(Package), "nusearch")) 

か:

   .InferMappingFor<Package>(i => i 
       .TypeName("package") 
       .IndexName("nusearch")) 
      ) 

方法InferMappingForがMapDefaultTypeIndicesの拡張版ですか?

あなたが私に知ってもらえますか?.TypeNameメソッドは正確にElasticSearchを意味しますか?それを使用するベストプラクティスは何ですか?それが省略されたときに機能するので、検索するときに意味があると思いますか?

お返事ありがとうございます。

答えて

1

なぜ私はそのようなエラーが出るん:

インデックス名は、指定された型のnullで、デフォルトのインデックスが設定されていません。 ConnectionSettings.MapDefaultTypeIndices()を使用してインデックス名を にマップするか、ConnectionSettings.DefaultIndex()を使用してデフォルトのインデックスを に設定します。

このようにパッケージをインデックスに登録しようとすると、

エラーメッセージが表示されます。要求の索引名はありません。 Elasticsearchには、どのインデックスに文書のインデックスを作成するかを知るためにインデックス名を指定する必要があります。 NEST is able to infer an index name from a number of different places in order of precedenceであるため、少なくとも1つは設定する必要があります。

パッケージタイプは、特定の インデックスに格納する必要があることを改めてConnectionSettingsに 情報を追加する必要があるなぜ私は思ったんだけど?

あなたが特定のインデックスに対する特定のタイプをマッピングにを持っていないが、そうすることはかなり一般的です。そうでないと決めると、各要求に対して煩雑なインデックスを明示的に指定するか、デフォルトのインデックスを使用します。これは、異なるタイプのインデックスが複数ある場合に行うことはできません。

ConnectionSettingsで特定のPOCOをマップする必要がありますか?

いいえ、ただしオプションです。

アプリケーションが大きく、マップするタイプがたくさんある場合はどうなりますか?それは厄介ではないですか?

すべてのタイプをマップすることができますが、それはあなた次第です。私は、POCO型の規約をConnectionSettingsで一度だけ定義するのは、すべてのリクエストでそれを供給する必要があるよりも、それほど厄介ではないと言いたいと思います。

CreateIndexメソッドは、そのような種類の情報を提供するのに適しています。

私は同意しません。クライアントのすべての使用法がインデックスを作成していない可能性があります(すでに存在しているかもしれませんし、おそらく別のプロセスで作成されている可能性もあります)ので、コンベンショナルセットアップをシングルトン構成オプションと結びつけるのが理にかなっています。

メソッドInferMappingForはMapDefaultTypeIndicesの拡張バージョンですか? InferMappingFor<T>をマッピングすることができます

はい、

  • インデックス名
  • タイプ名
  • の特性を無視する_id
  • 特性のために使用されなければならない
  • POCOプロパティは、フィールド名にマップし
  • Elasticsearch(POCOプロパティ名を単純にcamelcasingするデフォルトの規約と異なる場合)。

.TypeNameメソッドは正確にElasticSearchを意味しますか?それを使用するベストプラクティスは何ですか?

デフォルトで推論されるもの(下段のPOCOタイプ名)とは異なるタイプの名前をPOCOに指定できます。

関連する問題