C# 在远程索引上使用elasticsearch嵌套
这可能只是我在完全监督明显的“缺失环节”。不管怎样,我有一个elasticsearch端点,我想查询这个端点。相当简单 据我所知,NEST为您提供了与elasticsearch索引进行强类型交互的能力,这与Visual Studio在添加对相应服务的引用时为asmx/svc创建类型的方式大致相同 所以我的问题是:从知道elasticsearch索引的终点到让类型匹配索引并对索引进行查询,我到底是如何做到的?我按下按钮,答案是:“使用嵌套!”,但我找到的所有教程都假设您有一个从c#类型生成的本地索引,该索引将为您提供一个用于查询的类型。但是,当它是一个“远程”索引,您必须从中构建类型时,该怎么办呢 提前感谢所有指向正确方向的答案 更新: 我已在索引中检索到映射,我已将其简化为以下字段中的“CVRNUMER”:C# 在远程索引上使用elasticsearch嵌套,c#,nest,elasticsearch-5,C#,Nest,elasticsearch 5,这可能只是我在完全监督明显的“缺失环节”。不管怎样,我有一个elasticsearch端点,我想查询这个端点。相当简单 据我所知,NEST为您提供了与elasticsearch索引进行强类型交互的能力,这与Visual Studio在添加对相应服务的引用时为asmx/svc创建类型的方式大致相同 所以我的问题是:从知道elasticsearch索引的终点到让类型匹配索引并对索引进行查询,我到底是如何做到的?我按下按钮,答案是:“使用嵌套!”,但我找到的所有教程都假设您有一个从c#类型生成的本地索
{
"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”)]
进行绑定(希望能奏效)。