Ошибка при использовании сохраненных полей из searchResponse в NEST (ElasticSearch) - PullRequest
0 голосов
/ 12 мая 2019

Мне нужно привязать результат поиска из NEST (ElasticSearch) к Gridview в ASP.NET (Webform).

Код Я получаю результат от ElasticSearch от использования NEST:

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 ...) area:

System.NullReferenceException: 'Ссылка на объект не установлена ​​для экземпляра объекта.'

Кто-нибудь может научить меня, как можно решить эту проблему или что-то, в чем я виноват? Большое спасибо ~

ElasticSearch 7.0.1 NEST 7.0.0 C # ASP.NET (веб-форма)

1 Ответ

0 голосов
/ 12 мая 2019

Я уже решил свою проблему.Приведенный ниже код показывает, как получить searchResult из ElasticSearch и связать данные в Gridview в ASP.NET с помощью NEST.

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();
}
...