Сериализация объекта в JSON, а затем использование этого для отправки запроса в эластичном поиске с использованием NEST

#c# #elasticsearch #nest #nosql

#c# #elasticsearch #гнездо #nosql

Вопрос:

Я немного смущен и разочарован, когда дело доходит до использования NEST для запросов, поскольку это кажется очень удачным. У меня нет проблем с запросами при использовании стандартного JSON, поэтому мне было интересно, есть ли какой-нибудь способ запроса с использованием объекта JSON, у меня есть код ниже

 var query = "bkala";

var q = new
{
    query = new
    {
        text = new
        {
            _all = "jane"
        }
    }
};

var qJson = JsonConvert.SerializeObject(q);
var hits = client.Search<Users>(qJson);
 

Однако я получаю сообщение об ошибке «Невозможно преобразовать из типа string в System.Функция, гнездо.ISearchRequest »

Если кто-нибудь знает, как я могу просто запросить, используя объект JSON, это было бы фантастически, заранее приветствую.

Комментарии:

1. У меня нет никакого опыта работы с ElasticSearch, но я думаю, что вы неправильно используете API. Очевидно, что метод поиска принимает a Func<ISearchRequest> , в то время как вы передаете a string . Взгляните на документы здесь: elastic.co/guide/en/elasticsearch/client/net-api/2.x /…

Ответ №1:

NEST и Elasticsearch.Net, низкоуровневый клиент, который NEST использует под прикрытием, гибок в том, как вы хотите запрашивать. С NEST у вас есть несколько разных способов:

NEST — клиент высокого уровня

1. Свободный API

 var query = "bkala";

var searchResult = client.Search<MyDocument>(s => s
    .Query(q => q
        .Match(m => m
            .Field("_all")
            .Query(query)
        )
    )
);
 

Изложенный, как указано выше, этот API использует лямбда-выражения для определения плавного интерфейса, который имитирует структуру API Elasticsearch json и запроса DSL.

2. Синтаксис инициализатора объекта

 var query = "bkala";

var request = new SearchRequest<MyDocument>
{
    Query = new MatchQuery
    {   
        Field = "_all",
        Query = query
    }
};

var searchResult = client.Search<MyDocument>(request);
 

Если лямбда-выражения вам не подходят, вы всегда можете определить свои запросы, используя определенные типы поиска.

Elasticsearch.Клиент низкого уровня Net

В тех случаях, когда вы хотите выполнить запрос с анонимными типами (согласно вашему вопросу), строками json или байтовым представлением запроса, вы можете использовать низкоуровневый клиент Elasticsearch.Net, для достижения этой цели. Клиент низкого уровня отображается на клиенте высокого уровня через .LowLevel свойство

1. Анонимные типы

 var query = new
{
    query = new
    {
        match = new
        {
            _all = new
            {
                query = "bkala"
            }
        }
    }
};

var searchResult = client.LowLevel.Search<SearchResponse<MyDocument>>(query);
 

Использование низкоуровневого клиента на клиенте высокого уровня означает, что вы все еще можете воспользоваться преимуществами использования Json.NET для десериализации результатов поиска; в этом примере к ответу на поиск можно получить доступ через searchResult.Body

2.Строка Json

 var query = @"
{
  ""query"": {
    ""match"": {
      ""_all"": {
        ""query"": ""bkala""
      }
    }
  }
}";

var searchResult = client.LowLevel.Search<SearchResponse<MyDocument>>(query);
 

3.Массив байтов

 var bytes = new byte[] { 123, 13, 10, 32, 32, 34, 113, 117, 101, 114, 121, 34, 58, 32, 123, 13, 10, 32, 32, 32, 32, 34, 109, 97, 116, 99, 104, 34, 58, 32, 123, 13, 10, 32, 32, 32, 32, 32, 32, 34, 95, 97, 108, 108, 34, 58, 32, 123, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 34, 113, 117, 101, 114, 121, 34, 58, 32, 34, 98, 107, 97, 108, 97, 34, 13, 10, 32, 32, 32, 32, 32, 32, 125, 13, 10, 32, 32, 32, 32, 125, 13, 10, 32, 32, 125, 13, 10, 125 };

var searchResult = client.LowLevel.Search<SearchResponse<MyDocument>>(bytes);
 

Все вышеперечисленные методы выдают следующий запрос

 {
  "query": {
    "match": {
      "_all": {
        "query": "bkala"
      }
    }
  }
}
 

Ознакомьтесь с руководством по началу работы в репозитории github, а также с документацией на веб-сайте Elastic. Мы постоянно работаем над улучшением документации, и PR более чем приветствуются в тех областях, где, по вашему мнению, нам не хватает 🙂