Клиент Elasticsearch .NET — имена свойств в запросе анализируются как CamelCase вместо PascalCase.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Клиент Elasticsearch .NET — имена свойств в запросе анализируются как CamelCase вместо PascalCase.

Сообщение Anonymous »

Я выполняю POC, используя elasticsearch для своего приложения.
В индексе elasticsearch имена свойств моих документов находятся в PascalCase, но когда я генерирую запрос из кода, он преобразует имена свойств в CamelCase
Я пробовал следовать документации по настройке пользовательских параметров сериализации, но у меня это не сработало.
Вот как я создаю ElasticsearchClient в файле Startup.cs:

Код: Выделить всё

services.AddSingleton(x => GetElasticsearchClient());
...
private ElasticsearchClient GetElasticsearchClient()
{
var uri = new Uri("my-deployment-uri");
var settings = new ElasticsearchClientSettings(
new SingleNodePool(uri),
sourceSerializer: (defaultSerializer, settings) =>
new DefaultSourceSerializer(settings, o => o.PropertyNamingPolicy = null))
.Authentication(new ElasticsearchApiKey("my-api-key"))
.EnableDebugMode();
return new ElasticsearchClient(settings);
}
А это пример использования:

Код: Выделить всё

public class TestDocument
{
public int MyProperty { get; set; }
}

public class ElasticSearchFetcher
{
private readonly ElasticsearchClient _elasticsearchClient;

public ElasticSearchFetcher(ElasticsearchClient elasticsearchClient)
{
_elasticsearchClient = elasticsearchClient;
}

public async Task[*]> GetDocumentsAsync(int propValue)
{
var searchResponse = await _elasticsearchClient.SearchAsync("test", s => s
.Query(q => q
.Match(m => m
.Field(f => f.MyProperty).Query(propValue))))
.ConfigureAwait(false);

var requestJson = searchResponse.ApiCallDetails?.RequestBodyInBytes != null
? Encoding.UTF8.GetString(searchResponse.ApiCallDetails.RequestBodyInBytes)
: null;

if (searchResponse.IsValidResponse)
{
var hits = searchResponse.Hits;
return hits.Select(h => h.Source).ToList();
}

return null;
}
}
Если я отлаживаю и смотрю на значение «requestJson», я вижу вот что:

Код: Выделить всё

{
"query": {
"match": {
"myProperty": {
"query": 1
}
}
}
}
Но я ожидаю, что имя свойства будет «MyProperty», а не «myProperty», и из-за этой проблемы поиск elasticsearch всегда возвращает 0 результатов
Есть идеи, почему это не работает? Я попытался задать ChatGPT, который дал мне пару решений, но ни одно из них не сработало (по сути, мне дали то же самое решение более сложным способом - попытался создать собственный сериализатор исходного кода с нужными мне параметрами вместо DefaultSourceSerializer, но это все равно не помогло). работа)
Также стоит упомянуть:
  • У меня нет других параметров сериализации json, определенных где-либо в моем запуске. код.
  • Это работает, если я добавляю атрибут JsonPropertyName в свое свойство, но я не хочу использовать это решение, поскольку оно может повлиять на другие области (например, сериализацию ответа от моего API). для FE), я хочу, чтобы эта сериализация PascalCase выполнялась только для вызовов elasticsearch.
  • Когда я попробовал собственное решение сериализатора GPT, я попытался переопределить все методы сериализации и десериализации (не изменилось любой код, просто называемый базовым методом) и поместил туда точку останова, чтобы проверить, каковы параметры сериализации, когда я туда доберусь, но эти точки останова никогда не были затронуты


Подробнее здесь: https://stackoverflow.com/questions/787 ... lcase-inst
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

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

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»