首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在嵌套(ElasticSearch)中使用来自searchResponse的storedFields时出错

在嵌套(ElasticSearch)中使用来自searchResponse的storedFields时出错
EN

Stack Overflow用户
提问于 2019-05-12 20:34:38
回答 1查看 47关注 0票数 0

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

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

代码语言:javascript
复制
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();
}

有了这段代码,网格视图可以自动生成正确标题的两个字段"SN“和"JLN",它可以自动生成10行(我在搜索语法中将大小限制为最大10行),但列中的数据为空。

我找到了另一篇有这个链接的帖子

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

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

代码语言:javascript
复制
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)

EN

回答 1

Stack Overflow用户

发布于 2019-05-13 01:28:47

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

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56099290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档