Хобрук: Ваш путь к мастерству в программировании

Как использовать метод Serialize из класса ElasticClient из клиента NEST в С#?

Я создал успешное соединение с ES, а затем написал свой json-запрос. Теперь я хотел бы отправить этот запрос с помощью метода Serialize. Метод Serialize требует два параметра:

<сильный>1. объект и 2. Поток writableStream

У меня вопрос, со вторым. Когда я создаю поток со следующей строкой кода:

Stream wstream;

И используйте его для инициализации моей переменной json2 следующим кодом:

var json2 = highLevelclient.Serializer.Serialize(query, wstream).Utf8String();

Я получаю следующую ошибку в переменной wstream:

Use of unassigned local variable 'wstream'.

Я что-то упускаю? Это то, как я создаю переменную wstream, которая неверна? благодарю вас.


/* \\\ edit: ///// */ Теперь есть еще одна проблема, я использую Searchblox для индексации и поиска моих файлов, который сам вызывает ES 2.x для выполнения этой работы. Searchblox использует файл mapping.json для инициализации сопоставления при создании индекса. Вот ссылка на этот файл. Как предложил @Russ Cam, я создал свой собственный контент класса со следующим кодом (точно так же, как он сделал с индексом questions и классом Question):

 public class Content
    {
        public string type { get; set; }
        public Fields fields { get; set; }
    }

    public class Fields
    {
        public Content1 content { get; set; }
        public Autocomplete autocomplete { get; set; }
    }

    public class Content1
    {
        public string type { get; set; }
        public string store { get; set; }
        public string index { get; set; }
        public string analyzer { get; set; }
        public string include_in_all { get; set; }
        public string boost { get; set; }
    } //got this with paste special->json class

Эти поля из класса content (type, store и т. д.) берутся из файла mapping.json, прикрепленного выше. Теперь, когда я (как вы мне показали) выполняю следующий код:

var searchResponse = highLevelclient.Search<Content>(s => s.Query(q => q
         .Match(m => m.Field(f => f.fields.content)
        .Query("service")

Все, что я получаю в ответ на переменную searchResponse, это:

Valid NEST response built from a successful low level call on POST: /idx014/content/_search
Audit trail of this API call:
 -HealthyResponse: Node: http://localhost:9200/ Took: 00:00:00.7180404
Request:
{"query":{"match":{"fields.content":{"query":"service"}}}}
Response:
{"took":1,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}

И нет документов в searchResponse.Documents. И наоборот, когда я ищу запрос service в Searchblox или делаю вызов API на localhost:9200 с расширением Sense для Google Chrome, я получаю 2 документа. (документы, которые я искал)

Короче говоря, все, что я хочу, это иметь возможность:

  1. получить все документы (без критериев)
  2. получить все документы в пределах временного диапазона и на основе ключевых слов.. таких как обслуживание

Что я делаю не так? При необходимости могу предоставить дополнительную информацию. Спасибо всем за подробные ответы.

13.12.2016

Ответы:


1

На самом деле это намного проще, чем с NEST :) Клиент будет сериализовать ваши запросы для вас и отправлять их в Elasticsearch, вам не нужно делать шаг, чтобы сериализовать их самостоятельно, а затем передавать их клиенту для отправки в Elasticsearch.

Возьмем, к примеру, поисковый запрос. Учитывая следующие POCO

public class Question
{
    public string Body { get; set; }
}

Мы можем искать вопросы, содержащие фразу "это никогда не должно происходить" в теле с помощью

var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
    .InferMappingFor<Question>(m => m
        .IndexName("questions")
    );


var client = new ElasticClient(settings);

var searchResponse = client.Search<Question>(s => s
    .Query(q => q
        .MatchPhrase(m => m
            .Field(f => f.Body)
            .Query("this should never happen")
        )
    )
);

// do something with the response
foreach (var question in searchResponse.Documents)
{
    Console.WriteLine(question.Body);
}
13.12.2016
  • Спасибо за ваш ответ, я немного изменил свой вопрос :/ 14.12.2016
  • Пожалуйста, откройте новый вопрос с вашим редактированием, так как это другой вопрос 15.12.2016
  • сделано, вот ссылка на него: stackoverflow.com/questions/41156929/ 15.12.2016

  • 2

    эта линия

    У меня вопрос, со вторым. Когда я создаю поток со следующей строкой кода:

    Поток wstream;

    не создает объект. Он почти декларирует это. Вам нужно new отредактировать его.

    Stream wstream = new MemoryStream(); //doesn't have to be MemoryStream here - check what does Serialize expects
    

    Просто не забудьте закрыть его позже или использовать оператор using.

    using(Stream stream = new MemoryStream())
    {
      
       //do operations on wstream
      
    } //closes automatically here
    
    13.12.2016

    3

    Вы только что объявили wstream, но никогда не присваивали ему фактический поток. В зависимости от того, как работает метод Serialize, это может быть:

    • вам нужно создать поток и передать его методу Serialize
    • или вам нужно передать параметр потока с префиксом out
    13.12.2016
    Новые материалы

    Почему шаблоны проектирования и почему нет?
    Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

    Создание дизайна обуви с помощью машинного обучения
    Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

    GraalVM в 2022 году: итоги года
    2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..

    Быстрая разработка: волшебный мир больших языковых моделей
    РУКОВОДСТВО Быстрая разработка: волшебный мир больших языковых моделей Подход, основанный на данных, для получения наилучшего ответа Искусство и наука Можно ли совместить машинное..

    Ускоренный курс по Node Redis
    Сегодня мы будем учиться использовать Redis в Node.js, однако я не собираюсь вываливать сюда всю документацию и утомлять вас до смерти. Это руководство для начинающих? — спросите вы. Ну..

    Обзор Python для науки о данных и машинного обучения
    Python стал наиболее предпочтительным языком программирования среди разработчиков, которые в основном занимаются наукой о данных и машинным обучением. Интуитивно понятные и уникальные функции..

    Принудительный сброс состояния компонента React с помощью ключевого свойства
    Принудительный сброс состояния компонента React с помощью ключевого свойства Знаете ли вы, что вы можете использовать опору key для принудительного сброса состояния компонента? В..