Elasticsearch,如何使 NEST 地图响应类

Posted

技术标签:

【中文标题】Elasticsearch,如何使 NEST 地图响应类【英文标题】:Elasticsearch, how to make NEST map response to class 【发布时间】:2017-11-28 14:09:34 【问题描述】:

首先,我使用的是 NEST 5.5.0。

我对远程 elasticsearch-index 有以下用途:

var node = new Uri("http://distribution.virk.dk/cvr-permanent");

        var settings = new 
ConnectionSettings(node).DefaultIndex("virksomhed");

        settings.BasicAuthentication("username", "password");

        var client = new ElasticClient(settings);

        var searchResponse = client.Search<Company>(s => s
.AllTypes().Query(q => q
     .Match(m => m
        .Field(f => f.cvrNumber)
        .Query("35954716")
     )
)
);

索引中的映射(除了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 = "Vrvirksomhed.cvrNummer")]
    public string cvrNumber  get; set; 

现在,搜索 (searchResponse) 包含预期的结果(1 个结果),其中有关 cvrNummer 的部分如下所示:

"hits": 
"total": 1,
"max_score": 17.34601,
"hits": [
  
    "_index": "cvr-permanent-prod-20170205",
    "_type": "virksomhed",
    "_id": "4000333383",
    "_score": 17.34601,
    "_source": 
      "Vrvirksomhed": 
        "cvrNummer": 35954716,
        "regNummer": [
          
            "regnummer": "A/S35855",
            "periode": 
              "gyldigFra": "1956-06-01",
              "gyldigTil": "1999-10-18"
            ,
            "sidstOpdateret": "2015-02-10T00:00:00.000+01:00"
          
        ],
        "brancheAnsvarskode": null,
        "reklamebeskyttet": false,
        "navne": [
...

但是,当我查看 searchResponse.Documents 时,我有正确的类型(公司),但 cvrNumber 的值为 null。

任何想法我做错了什么,因为 cvrNummer 的值没有映射到 searchResponse.Documents 中 Company 实例上的 cvrNumber?

提前感谢您的意见!

更新

我尝试了以下但没有成功,仍然得到了预期的结果,但 cvrNumber 仍然为空(在 searchResponse.Documents 中):

[ElasticsearchType(Name = "virksomhed")]
public class Company

    [Object(Name = "Vrvirksomhed")]
    public Vrvirksomhed Vrvirksomhed  get; set; 


public class Vrvirksomhed

    [Text(Name = "cvrNummer")]
    public string cvrNumber  get; set; 

使用查询:

 var searchResponse = client.Search<Vrvirksomhed>(s => s
            .AllTypes().Query(q => q
                .Match(m => m
                    .Field(f => f.cvrNumber)
                    .Query("35954716")
                )
            )
        );

更新

它适用于对查询的以下修改:

 var searchResponse = client.Search<Company>(s => s
            .AllTypes().Query(q => q
                .Match(m => m
                    .Field(f => f.Vrvirksomhed.cvrNumber)
                    .Query("35954716")
                )
            )
        );

【问题讨论】:

您的目标是什么版本的 Elasticsearch? 5.x(这里还有一些字符,因为 5.x 太短,不能作为评论) 【参考方案1】:
[ElasticsearchType(Name = "virksomhed")]
public class Company

    [Text(Name = "Vrvirksomhed.cvrNummer")]
    public string cvrNumber  get; set; 

Vrvirksomhed 看起来应该是 Company 上的 POCO 属性,映射为 object datatype 或 nested datatype(请查看 nested objects in the Definitive Guide 了解差异),其中 POCO 有一个名为 @ 的属性987654328@,类似

[ElasticsearchType(Name = "virksomhed")]
public class Company

    [Object(Name = "Vrvirksomhed")]
    public Vrvirksomhed Vrvirksomhed  get; set; 


public class Vrvirksomhed

    [Text(Name = "cvrNummer")]
    public string cvrNumber  get; set; 

【讨论】:

然后我是否将类型 Vrvirksomhed 放入查询中,即: var searchResponse = client.Search(s => s .AllTypes().Query(q => q .Match( m => m .Field(f => f.cvrNumber) .Query("35954716") ) ) );我试过了,它仍然不起作用(我更新问题) 不,您仍然在Company 上查询,并使用f =&gt; f.Vrvirksomhed.cvrNumber 作为字段的表达式 天哪,它起作用了,我想我已经看到了(一些)光。谢谢! :) 不用担心@KimSchioett :) 你看到elastic.co/guide/en/elasticsearch/client/net-api/current/… 的文档了吗? 是的,它对我来说并没有破解(对我来说,它似乎总是假设您自己从映射中生成索引)。

以上是关于Elasticsearch,如何使 NEST 地图响应类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NEST 中禁用驼峰式 Elasticsearch 字段名称?

如何在 NEST2 中更新 Elasticsearch 文档

ElasticSearch 和 NEST:如何从索引中清除所有文档?

如何将单个 .NET 类型映射到 ElasticSearch/NEST 中的多个嵌套对象类型?

如何在 C# Nest 中将日期值发送到 elasticsearch 聚合查询

使用 NEST 的 Elasticsearch:如何配置分析器来查找部分单词?