在NEST(ElasticSearch)中使用来自searchResponse的storedFields时出错

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (20)

我需要将搜索结果从NEST(ElasticSearch)绑定到ASP.NET中的Gridview(Webform)。

代码我使用NEST从ElasticSearch获得结果:

public class Address
{
    public int SN { get; set; }
    public string JLN { get; set; }
}

protected void BtnSearch_Clicked(object sender, EventArgs e)
{
    string SearchValue = txtSearchValue.Text;
    string es_host = System.Configuration.ConfigurationManager.AppSettings["cnStringIP"];
    string es_port = System.Configuration.ConfigurationManager.AppSettings["cnStringPort"];
    string es_index = System.Configuration.ConfigurationManager.AppSettings["cnStringIndex"];

    var settings = new ConnectionSettings(new Uri("http://" + es_host + ":" + es_port + ""))
        .DefaultIndex("masterlist*");

    var client = new ElasticClient(settings);

    var searchResponse = client.Search<Address>(s => s
            .Index("masterlist*")
            .From(0)
            .Size(10)
            .Query(q => q
                 .QueryString(qs => qs
                    .Query("JLN:\""+ SearchValue +"\"")
                )
            )
        );

    var address = searchResponse.Documents.ToList();

    ESGridview.DataSource = address;
    ESGridview.DataBind();
}

使用此代码,gridview可以自动生成两个正确的标题字段,即“SN”和“JLN”,它可以自动生成10行(我将搜索语法中的大小限制为最多10行)但它是空数据专栏。

我确实发现了另一个带有此链接的POST

https://www.elastic.co/guide/en/elasticsearch/client/net-api/6.x/returned-fields.html#returned-fields

检查此链接后,我将我的代码更改为:

string SearchValue = txtSearchValue.Text;
string es_host = System.Configuration.ConfigurationManager.AppSettings["cnStringIP"];
string es_port = System.Configuration.ConfigurationManager.AppSettings["cnStringPort"];
string es_index = System.Configuration.ConfigurationManager.AppSettings["cnStringIndex"];

var settings = new ConnectionSettings(new Uri("http://" + es_host + ":" + es_port + ""))
    .DefaultIndex("masterlist*");

var client = new ElasticClient(settings);

var searchResponse = client.Search<Address>(s => s
    .StoredFields(sf => sf
        .Fields(
            f => f.SN,
            f => f.JLN
            )
         )
        .From(0)
        .Size(10)
        .Query(q => q
             .QueryString(qs => qs
                .Query("JLN:\""+ SearchValue +"\"")
            )
        )
    );

foreach (var fieldValues in searchResponse.Fields)
{
    var document = new
    {
        SN = fieldValues.ValueOf<Address, int>(p => p.SN),
        JLN = fieldValues.Values<Address, string>(p => p.JLN)
    };
}

var address = searchResponse.Documents;
var count = "MaxScore" + searchResponse.MaxScore;

ESGridview.DataSource = address;
ESGridview.DataBind();

但是从整个foreach(var ...)区域开始运行代码时出现错误:

System.NullReferenceException:'对象引用未设置为对象的实例。'

有没有人可以教我如何解决这个问题或我做错的事情?非常感谢〜

ElasticSearch 7.0.1 NEST 7.0.0 C# ASP.NET(Webform)

提问于
用户回答回答于

我已经解决了我的问题。下面的代码是如何从ElasticSearch获取searchResult并使用NEST将数据绑定到ASP.NET中的Gridview。

public class Address
{
    [Text(Name = "SN")]
    public string SN { get; set; }

    [Text(Name = "JLN")]
    public string JLN { get; set; }
}

protected void BtnSearch_Clicked(object sender, EventArgs e)
{
    string SearchValue = txtSearchValue.Text;
    string es_host = System.Configuration.ConfigurationManager.AppSettings["cnStringIP"];
    string es_port = System.Configuration.ConfigurationManager.AppSettings["cnStringPort"];
    string es_index = System.Configuration.ConfigurationManager.AppSettings["cnStringIndex"];

    var settings = new ConnectionSettings(new Uri("http://" + es_host + ":" + es_port + ""))
        .DefaultIndex("masterlist*");

    var client = new ElasticClient(settings);

    var searchResponse = client.Search<Address>(s => s
            .From(0)
            .Size(100)
            .Query(q => q
                 .QueryString(qs => qs
                    .Query("JLN:\"" + SearchValue + "\"")
                )
            )
        );

    var address = searchResponse.Documents.ToList();

    ESGridview.DataSource = address;
    ESGridview.DataBind();
}

热门问答

单个账号导入接口 返回70402?

嗨喽你好摩羯座
推荐已采纳
您好,70402参数非法,请检查必填字段是否填充,或者字段的填充是否满足协议要求。从您提供的截图来看,是您的请求body没有填写完整,建议按照这个格式改下。 image.png 参考文档:https://cloud.tencent.com/document/product/...... 展开详请

获取不到群成员维度自定义字段CustomInfo是空的?

您好,群成员维度自定义字段值获取不到,可以从以下方面排查: 1、通过控制台查看自定义字段的配置是否正确。 2、确认查询请求中:请求用户是否有读取权限,群组类型是否支持该自定义字段。 3、确认该自定义字段的设置请求是否成功 4、对于群维度的自定义字段: iOS:需要在登录 IM S...... 展开详请

微信小程序什么情况下需要域名,什么情况下不需要?

最爱开车啦互联网的敏感者
推荐已采纳

1:不需要域名:使用微信门店小程序、微信小店小程序,以及静态的小程序(只有前端)

2:需要域名:小程序代码包限制在2M之内,好多东西都没法在代码包中加载,只能通过第三方web后台管理,后台是第三方的,假设是一个web网站,网站必须有服务器,就需要域名备案。

报考TCA可以同时在一天报考运维和架构的考试吗?

推荐

可以的,同一天最多支持报考两个科目,若您报考了两门科目考试,考试将以连考的形式在同一考场内进行。(例:14:00-15:30考云从业者,15:30-17:00考TCA运维)

腾讯云服务器上配置nginx访问对象存储,这样算内网还是外网访问呢?

Jinqn

腾讯 · 高级工程师 (已认证)

腾讯云COS前端开发
推荐

同园区会是内网,准确验证方法是,ping 对应存储桶域名,看看如果是 100. 10. 9. 172. 这样开头的内网 IP,就可以确定是内网访问,否则是外网访问。

关于云空间使用后是否需要再次交费的问题?

骑牛看晨曦love&peace~
推荐
如果是包年包月的服务器一次性付费后,访问服务器里搭建的网站,服务器不会有其他的流量费的,但是如果是后付费按量 按流量计费的服务器,会按每小时扣用户使用服务器资源的费用,产生流量也会按照官网价格计费的 。 请参考文档:https://cloud.tencent.com/produ...... 展开详请

扫码关注云+社区

领取腾讯云代金券