Поиск определенного запроса (TermsQuery) без класса для конкретного типа в NEST

Впервые использую ElasticSearch (используя NEST в качестве оболочки). Я хочу выполнить поиск во внешней базе данных ElasticSearch.

Я просто хочу запустить тестовый запрос к определенному полю с именем cvrNummer. У меня есть следующий код, который не компилируется, потому что: The type arguments for method 'ElasticSearch.Search<T> .. ', cannot be inferred from the usage.

Я предполагаю, что это потому, что я не могу указать класс для конкретного типа. Проблема в том, что я не знаю этого.

Мой вопрос: как выполнить приведенный ниже запрос, точно не зная, что я получу в ответ (чтобы создать модель для конкретного типа)? И если мне нужна эта модель, как мне «сделать» эту модель, когда нет документации?

Мой код:

        var settings = new ConnectionSettings(new Uri(_path)).
        BasicAuthentication(_username,_password);

        var client = new ElasticClient(settings);

        var es_query = new TermsQuery
        {
            Name = "named_query",
            Boost = 1.1,
            Field = "cvrNummer",
            Terms = new string[] { "36406208" }
        };

        client.Search(es_query);

Единственная документация, которая у меня есть:

curl -u "<brugernavn>:<password>" -XPOST http://URL -d'
{ "from" : 0, "size" : 1,
  "query": {
    "term": {
      "cvrNummer": VALUE
    }
  }
}

ИЗМЕНИТЬ БОЛЬШЕ ДАННЫХ:

Модель документа из документации:

curl -u "<brugernavn>:<password>" -XGET http://distribution.virk.dk/cvr-permanent/_mapping

Пример полного поиска:

curl -u "<brugernavn>:<password>" -XPOST http://distribution.virk.dk/cvr-permanent/_search -d'
{ "from" : 0, "size" : 1,
  "query": {
    "term": {
      "cvrNummer": 10961211
    }
  }
}
'

person Lars Holdgaard    schedule 04.03.2018    source источник
comment
Попробуйте что-то вроде этого: client.Search<dynamic>(s => s.From(0).Size(1).Query(q => q.Terms(t => t.Name("named_query").Boost(1.1f).Field("cvrNummer").Terms("36406208"))));   -  person Evk    schedule 04.03.2018
comment
@Evk Спасибо! Это приводит к: «Имя индекса равно null для данного типа, и индекс по умолчанию не установлен. Сопоставьте имя индекса с помощью ConnectionSettings.DefaultMappingFor‹TDocument›() или установите индекс по умолчанию с помощью ConnectionSettings.DefaultIndex().' . Есть идеи? :-)   -  person Lars Holdgaard    schedule 04.03.2018
comment
И как выглядит полный URL-адрес в документации curl (часть пути после домена)?   -  person Evk    schedule 04.03.2018
comment
@Evk Только что обновил данные :-) спасибо за вопрос   -  person Lars Holdgaard    schedule 04.03.2018
comment
Затем попробуйте s => s.From(0).Size(1).Index("cvr-permanent").AllTypes().(... the rest of the above...)   -  person Evk    schedule 04.03.2018
comment
@Evk Perfect - это работает. Я все еще получаю недействительный ответ NEST, созданный из неудачного низкоуровневого вызова POST, но это ошибка, которая имеет смысл (URL-адрес не совпадает). Я исправлю это. Вы добавите быстрый ответ? Тогда отмечу как ответ :-)   -  person Lars Holdgaard    schedule 04.03.2018
comment
Ага. Просто заставил его работать, изменив исходный путь на distribution.virk.dk без каких-либо параметров. Большое спасибо @Evk - решил мою проблему :-)!   -  person Lars Holdgaard    schedule 04.03.2018
comment
Вы видели документацию по адресу: elastic.co /guide/en/elasticsearch/client/net-api/current/   -  person Russ Cam    schedule 04.03.2018


Ответы (1)


Вы можете преобразовать свой запрос curl «документации» в синтаксис API С# следующим образом:

client.Search<dynamic>(s => s //dynamic because you don't know the structure
    .From(0)
    .Size(1)
    .Index("cvr-permanent") // index you are searching, taken from url of curl
    .AllTypes() // search all types in that index
    .Query(q => q.Terms(t => 
         t.Name("named_query")
        .Boost(1.1f)
        .Field("cvrNummer")
        .Terms("36406208"))));

Если вам не нравится dynamic, вы можете использовать JObject, который будет реальным типом, возвращаемым Search, если вы использовали dynamic:

var response = client.Search<JObject>(...);

Затем вы можете получить доступ к соответствующим документам следующим образом:

foreach (var document in result.Documents) {
    // if you used `JObject`:
    Console.WriteLine(document["account_number"]);
    // if you used `dynamic`:
    Console.WriteLine(document.account_number);
}

Если вы использовали JObject, вы также можете вызвать ToString() для полученного JObject (так, document.ToString() в приведенном выше примере), чтобы увидеть полный json возвращаемого документа, чтобы вы могли узнать его структуру.

person Evk    schedule 04.03.2018