В индексе 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;
}
}
Код: Выделить всё
{
"query": {
"match": {
"myProperty": {
"query": 1
}
}
}
}
Есть идеи, почему это не работает? Я попытался задать ChatGPT, который дал мне пару решений, но ни одно из них не сработало (по сути, мне дали то же самое решение более сложным способом - попытался создать собственный сериализатор исходного кода с нужными мне параметрами вместо DefaultSourceSerializer, но это все равно не помогло). работа)
Также стоит упомянуть:
- У меня нет других параметров сериализации json, определенных где-либо в моем запуске. код.
- Это работает, если я добавляю атрибут JsonPropertyName в свое свойство, но я не хочу использовать это решение, поскольку оно может повлиять на другие области (например, сериализацию ответа от моего API). для FE), я хочу, чтобы эта сериализация PascalCase выполнялась только для вызовов elasticsearch.
- Когда я попробовал собственное решение сериализатора GPT, я попытался переопределить все методы сериализации и десериализации (не изменилось любой код, просто называемый базовым методом) и поместил туда точку останова, чтобы проверить, каковы параметры сериализации, когда я туда доберусь, но эти точки останова никогда не были затронуты
Подробнее здесь: https://stackoverflow.com/questions/787 ... lcase-inst