【问题标题】:How to retrieve the serialized field name of an Elasticsearch Nest.Field如何检索 Elasticsearch Nest.Field 的序列化字段名称
【发布时间】:2021-11-26 09:14:33
【问题描述】:

我想获取使用Infer.Field<MyDocument>(doc => doc.StringField1) 创建的字段的字段名称。

示例代码:

using System;
using Nest;
using Xunit;

namespace Elasticsearch.Tests
{
    public class MyDocument
    {
        public string StringField1 { get; set; }
    }

    public class SerializeField
    {

        [Fact]
        public void TestFieldName()
        {
            var connectionSettings = new ConnectionSettings(new Uri("http://myesdomain.com:9200"));
            var client = new ElasticClient(connectionSettings);

            var stringField = Infer.Field<MyDocument>(doc => doc.StringField1);
            // TODO: Code to get then name of stringField when serialized
        }
    }
}

我是否可以像在任何请求中那样序列化 stringField 的名称来离开客户端?

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

    还好我自己找到了答案:

    短:

    client.SourceSerializer.Serialize(stringField, ms);
    

    完成:

    using System;
    using System.IO;
    using System.Text;
    using Nest;
    using Xunit;
    
    namespace Elasticsearch.Tests
    {
        public class MyDocument
        {
            public string StringField1 { get; set; }
        }
    
        public class SerializeField
        {
    
            [Fact]
            public void TestFieldName()
            {
                var connectionSettings = new ConnectionSettings(new Uri("http://myesdomain.com:9200"));
                var client = new ElasticClient(connectionSettings);
    
                var stringField = Infer.Field<MyDocument>(doc => doc.StringField1);
                string fieldName;
                using (var ms = new MemoryStream())
                {
                    client.SourceSerializer.Serialize(stringField, ms);
                    ms.Position = 0;
                    using (var reader = new StreamReader(ms, Encoding.UTF8))
                    {
                        fieldName = reader.ReadToEnd();
                    }
                }
                Assert.Equal("\"stringField1\"", fieldName);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      有一个更好的解决方案是使用Nest.FieldResolver。

      using System;
      using Nest;
      using Xunit;
      
      namespace Elasticsearch.Tests
      {
          public class MyDocument
          {
              public string StringField1 { get; set; }
          }
      
          public class TestClass
          {
      
              [Fact]
              public void TestFieldName()
              {
                  var connectionSettings = new ConnectionSettings(new Uri("http://myesdomain.com:9200"));
                  var fieldResolver = new FieldResolver(connectionSettings);
                  var stringField = Infer.Field<MyDocument>(doc => doc.StringField1);
                  var fieldName = fieldResolver.Resolve(stringField);
      
                  Assert.Equal("stringField1", fieldName);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-24
        • 1970-01-01
        • 1970-01-01
        • 2017-11-10
        • 2015-04-14
        • 2015-05-04
        • 2016-10-04
        • 1970-01-01
        相关资源
        最近更新 更多