elasticsearch-5,C#,Nest,elasticsearch 5" /> elasticsearch-5,C#,Nest,elasticsearch 5" />

C# 在远程索引上使用elasticsearch嵌套

C# 在远程索引上使用elasticsearch嵌套,c#,nest,elasticsearch-5,C#,Nest,elasticsearch 5,这可能只是我在完全监督明显的“缺失环节”。不管怎样,我有一个elasticsearch端点,我想查询这个端点。相当简单 据我所知,NEST为您提供了与elasticsearch索引进行强类型交互的能力,这与Visual Studio在添加对相应服务的引用时为asmx/svc创建类型的方式大致相同 所以我的问题是:从知道elasticsearch索引的终点到让类型匹配索引并对索引进行查询,我到底是如何做到的?我按下按钮,答案是:“使用嵌套!”,但我找到的所有教程都假设您有一个从c#类型生成的本地索

这可能只是我在完全监督明显的“缺失环节”。不管怎样,我有一个elasticsearch端点,我想查询这个端点。相当简单

据我所知,NEST为您提供了与elasticsearch索引进行强类型交互的能力,这与Visual Studio在添加对相应服务的引用时为asmx/svc创建类型的方式大致相同

所以我的问题是:从知道elasticsearch索引的终点到让类型匹配索引并对索引进行查询,我到底是如何做到的?我按下按钮,答案是:“使用嵌套!”,但我找到的所有教程都假设您有一个从c#类型生成的本地索引,该索引将为您提供一个用于查询的类型。但是,当它是一个“远程”索引,您必须从中构建类型时,该怎么办呢

提前感谢所有指向正确方向的答案

更新:

我已在索引中检索到映射,我已将其简化为以下字段中的“CVRNUMER”:

{
"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; }
}
现在,我要做的(首先)就是搜索具有特定值f的cvrNummer的文档。例如“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")
var searchResponse=client.Search(s=>s
.Type()
.Query(q=>q
.Match(m=>m
.Field(f=>f.cvrNumber)
.Query(“12883404”)
我得到了“400个错误的请求”。我到底做错了什么?

基本上,您可以手动创建一个具有所需属性的C#类,然后告诉nest将结果映射到此类

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; }
}
然后,您可以将结果键入刚才定义的搜索类型:

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;
Task response=wait\u elasticClient.SearchAsync(s=>s
.Index(“索引的名称”)
.Type()
.Query(q=>
q、 Bool(bo=>
bo.Filter(
f=>f.Terms(t=>
t、 字段(searchtype=>searchtype.SomeNumericProperty).Terms(request.NumericInput)),
/* ... */
)
)
)
);
IReadOnylCollection结果=响应。文档;
这说明了如何检索创建绑定所需的名称:。

基本上,您可以手动创建一个具有所需属性的C#类,然后告诉nest将结果映射到此类

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; }
}
然后,您可以将结果键入刚才定义的搜索类型:

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;
Task response=wait\u elasticClient.SearchAsync(s=>s
.Index(“索引的名称”)
.Type()
.Query(q=>
q、 Bool(bo=>
bo.Filter(
f=>f.Terms(t=>
t、 字段(searchtype=>searchtype.SomeNumericProperty).Terms(request.NumericInput)),
/* ... */
)
)
)
);
IReadOnylCollection结果=响应。文档;

这说明了如何检索创建绑定所需的名称:。

似乎无法使其工作,收到“400个错误请求”从结束点开始。我已经用服务的详细信息编辑了我的问题,请看一看。如果您使用一个简单的查询而不绑定到您的搜索类型,它是否有效?例如
\u elasticClient.search(s=>s.Index(“Name\u of the\u Index”).AllTypes().from(0).Size(10))
只是为了确保elasticClient配置正确……啊,似乎我发现了问题:当我使用url permanent和defaultindex=virksomhed时,它起了作用。在它将索引和_搜索添加到url之前,给出了一个错误的端点,即permanent/virksomhed/_search/virksomhed/_search。所以现在只需要将结果映射到o Company class:)因此,问题简化为:如何进行我提到的简单搜索,并将cvrNummer字段(在问题更新中提到的映射中)映射到响应中Company类中的cvrNumber属性?:)Hm看起来像
cvrNummer
嵌套在
Vrvirksomhed
;请尝试从
[Text(Name=“Vrvirksomhed.cvrNummer”)]
绑定(希望可以)。似乎无法使其工作,收到“400个错误请求”从结束点开始。我已经用服务的详细信息编辑了我的问题,请看一看。如果您使用一个简单的查询而不绑定到您的搜索类型,它是否有效?例如
\u elasticClient.search(s=>s.Index(“Name\u of the\u Index”).AllTypes().from(0).Size(10))
只是为了确保elasticClient配置正确……啊,似乎我发现了问题:当我使用url permanent和defaultindex=virksomhed时,它起了作用。在它将索引和_搜索添加到url之前,给出了一个错误的端点,即permanent/virksomhed/_search/virksomhed/_search。所以现在只需要将结果映射到o Company class:)因此,问题简化为:如何进行我提到的简单搜索,并将cvrNummer字段(在问题更新中提到的映射中)映射到响应中Company类中的cvrNumber属性?:)Hm看起来像
cvrNummer
嵌套在
Vrvirksomhed
中;请尝试从
[Text(Name=“Vrvirksomhed.cvrNummer”)]
进行绑定(希望能奏效)。