在远程索引

时间:2017-11-27 14:13:50

标签: c# nest elasticsearch-5

这可能只是我完全监督明显的“缺失环节”。无论如何,这里有一个:我有一个elasticsearch端点http://distribution.virk.dk/cvr-permanent/virksomhed/_search,我想查询这个终点。相当简单。

据我了解,NEST使您能够强烈地键入与elasticsearch索引的交互,这与Visual Studio在添加对相应服务的引用时为asmx / svc创建类型的方式非常相似。

所以我的问题是:从了解弹性搜索索引的终点到拥有匹配索引的类型并对索引进行查询,我究竟如何?我按下答案是:“使用NEST!”,但我能找到的所有教程都假设你有一个你从c#-type生成的本地索引,然后会给你一个在你的查询中使用的类型。但是,当你需要从中构建类型的“远程”索引时该怎么办?

提前感谢任何指向正确方向的答案!

更新:

我已经检索了索引中的映射,我已将其缩减为以下字段“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; }
}

现在,我想要做的所有事情(首先)是搜索具有特定值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")

我收到“400个不良请求”。我究竟做错了什么?

1 个答案:

答案 0 :(得分:0)

基本上,您手动创建一个包含所需属性的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;

这解释了如何检索创建绑定所需的名称:Get all index and types' names from cluster in ElasticSearch