2017-11-27 10 views
1

これは明らかに「欠けているリンク」を完全に監督しているだけのことです。とにかくここに行く:私はelasticsearchエンドポイントhttp://distribution.virk.dk/cvr-permanent/virksomhed/_searchを持って、私はこのエンドポイントを照会したいと思います。かなりシンプル。elasticsearch NESTをリモートインデックスに使用する

私が理解するように、NESTではelasticsearchインデックスとのやりとりを強力に行うことができます。これは、Visual Studioがそれぞれのサービスへの参照を追加するときにasmx/svcの型を作成するのと同じです。

私の質問は、elasticsearchインデックスのエンドポイントがインデックスに一致するタイプを持つことを知ってインデックスを照会するのはどうしてですか?私は答えを押します:「NESTを使用してください!」ですが、見つけることができたすべてのチュートリアルでは、C#タイプから生成したローカルインデックスがあると仮定しています。しかし、あなたがあなたのタイプを構築しなければならない "リモート"インデックスのときに、何をすべきか?

正しい方向を指す任意の回答をお寄せいただきありがとうございます!

UPDATE:

私は、次の中で唯一のフィールド「cvrNummer」に減少しているインデックスにマッピングを取得しています

{ 
"cvr-permanent-prod-20170205" : { 
"mappings" : { 
    "virksomhed" : { 
    "_size" : { 
     "enabled" : true 
    }, 
    "properties" : { 
     "Vrvirksomhed" : { 
     "properties" : { 

      "type" : "long" 
      }, 
      "cvrNummer" : { 
      "type" : "string" 
      },    

      } 
     } 
     },   
    } 
    } 
    } 
} 
} 

私は、次のクラスを作ってきました:

[ElasticsearchType(Name = "virksomhed")] 
public class Company 
{ 
    [Text(Name = "cvrNummer")] 
    public string cvrNumber { get; set; } 
} 

さて、私は(そもそも)やりたいことすべてが一定の値でcvrNummerを持つ文書を検索することで、 f。例。 "12883404"。私は、単純なコンソールアプリケーションで次のコードを持っている:

var node = new Uri("http://distribution.virk.dk/cvr- 
permanent/virksomhed/_search"); 

     var settings = new ConnectionSettings(node).DefaultIndex("defaultindex"); 

     settings.BasicAuthentication("username", "password");    

     var client = new ElasticClient(settings); 

私はその後、次の非常に単純な要求してみてください:

var searchResponse = client.Search<Company>(s => s 
.Type<Company>() 
.Query(q => q 
    .Match(m => m 
     .Field(f => f.cvrNumber) 
     .Query("12883404") 

をそして私は「400不正な要求」を取得します。私は間違って何をしていますか?

答えて

0

基本的に必要なプロパティを持つC#クラスを手作業で作成し、結果をこのクラスにマップするようにネストに指示します。

using Nest; 
using System; 

[ElasticsearchType(Name = "Name_Of_The_Mapping_In_Index_Mappings")] 
public class MySearchType { 

     [Text(Name = "_id")] 
     public string Id { get; set; } 

     [Date(Name = "@timestamp")] 
     public DateTime Timestamp { get; set; } 

     [Number(NumberType.Long, Name = "some_numeric_property_in_the_mapping")] 
     public long SomeNumericProperty { get; set; } 
} 

次に、あなたはあなただけで定義された検索タイプに検索結果を入力することができますGet all index and types' names from cluster in ElasticSearch

Task<ISearchResponse<MySearchType>> response = await _elasticClient.SearchAsync<MySearchType>(s => s 
    .Index("Name_Of_The_Index") 
    .Type<MySearchType>() 
    .Query(q => 
     q.Bool(bo => 
      bo.Filter( 
       f => f.Terms(t => 
        t.Field(searchtype => searchtype.SomeNumericProperty).Terms(request.NumericInput)), 
       /* ... */ 
      ) 
     ) 
    ) 
); 

IReadOnylCollection<MySearchType> result = response.Documents; 

これは、バインディングを作成するために必要な名前を取得する方法について説明します。

+0

エンドポイントから「400悪い要求」を取得しても動作しないようです。私は、サービスの詳細と私の質問を編集して、それを見てください。 –

+0

検索タイプにバインドせずに単純なクエリを使用すると機能しますか?例えば。 '_elasticClient.Search (s => s.Index(" Name_Of_The_Index ")。AllTypes()。(0).Size(10));' '_elasticClient'が正しく設定されていることを確認するだけです.... –

+0

AHHHHH、私は問題を発見したようだ:私はURLをhttp://distribution.virk.dk/cvr- defaultindex = virksomhedで使用したときにうまくいった。それが間違ったエンドポイントを与えるurlにindexと_searchを追加する前に、すなわち。 http://distribution.virk.dk/cvr- 永久/ virksomhed/_search/virksomhed/_search。だから、結果だけをCompanyクラスにマップする必要があります:) –

関連する問題