繁体   English   中英

在远程索引上使用Elasticsearch NEST

[英]Using elasticsearch NEST on a remote index

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

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

所以我的问题是:从知道弹性搜索索引的终点到拥有与索引匹配的类型并对该索引进行查询,我到底该如何做? 我想答案是:“使用NEST!”,但是我能够找到的所有教程都假设您具有从ac#-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; }
}

现在,我要做的(首先)是搜索具有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错误请求”。 我到底在做什么错?

基本上,您可以使用所需的属性创建一个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;

这说明了如何检索创建绑定所需的名称:从ElasticSearch中的集群获取所有索引和类型的名称

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM