【问题标题】:Using elasticsearch NEST on a remote index在远程索引上使用 elasticsearch NEST
【发布时间】:2017-11-27 14:13:49
【问题描述】:

这可能只是我完全监督了明显的“缺失环节”。无论如何:我有一个弹性搜索端点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 错误请求”。我到底做错了什么?

【问题讨论】:

    标签: c# nest elasticsearch-5


    【解决方案1】:

    基本上你手动创建一个包含你需要的属性的 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

    【讨论】:

    • 似乎无法让它工作,从端点收到“400 bad request”。我已经用服务的详细信息编辑了我的问题,请看一下。
    • 如果您使用简单的查询而不绑定到您的搜索类型,它是否有效?例如。 _elasticClient.Search&lt;dynamic&gt;(s =&gt; s.Index("Name_Of_The_Index").AllTypes().From(0).Size(10)); 只是为了确保 _elasticClient 配置正确....
    • AHHHHH,似乎我发现了问题:当我使用 url distribution.virk.dk/cvr- 永久地址和 defaultindex=virksomhed 时,它起作用了。在将 index 和 _search 附加到给出错误端点的 url 之前,即。 distribution.virk.dk/cvr- 永久/virksomhed/_search/virksomhed/_search。所以现在只需要将结果映射到 Company 类 :)
    • 所以,问题简化为:如何进行我提到的简单搜索,并将 cvrNummer 字段(在问题更新中提到的映射中)映射到 cvrNumber 属性公司类在响应? :)
    • 嗯看起来cvrNummer嵌套在Vrvirksomhed中;请尝试从[Text(Name = "Vrvirksomhed.cvrNummer")] 绑定(希望有效)。
    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多