Я представляю Elasticsearch в проекте C # API. Я хотел бы использовать существующие модели API в качестве поисковых документов, многие из которых позволяют добавлять пользовательские точки данных. Они реализованы с использованием типа JObject из Json.NET. Например:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public JObject ExtraProps { get; set; }
}
Это позволяет пользователям отправлять тела запросов JSON следующим образом, что прекрасно работает:
{
"Id": 123,
"Name": "Thing",
"ExtraProps": {
"Color": "red",
"Size": "large"
}
}
Однако, если я использую это как тип документа в NEST, эти дополнительные свойства как-то теряют свои значения, сериализуя как:
{
"Id": 123,
"Name": "Thing",
"ExtraProps": {
"Color": [],
"Size": []
}
}
Добавление атрибута [Nest.Object]
к ExtraProps
не изменило поведение. Насколько я понимаю, NEST использует Json.NET для себя, поэтому я не ожидаю, что у него будут проблемы с типами Json.NET. Есть ли относительно простое исправление для этого?
Вот несколько вариантов, которые я взвешиваю:
Использовать настраиваемую сериализацию . Я пошел по этому пути, мне стало гораздо сложнее, чем должно быть, и я так и не заработал.
Карта JObject
с Dictionary<string, object>
с. Я проверил это работает, но если есть вложенные объекты (которые могут быть), мне нужно улучшить его с помощью рекурсии. И, в идеале, я бы хотел, чтобы это работало с более общим типом JToken . Это вариант, к которому я склоняюсь, но, опять же, он кажется более сложным, чем должен быть.
Используйте «Низкоуровневый» клиент или даже необработанные HTTP-вызовы. По общему признанию я не исследовал это, но если это действительно проще / чище, чем альтернативы, я открыт для этого.
Сообщить об ошибке. Я, вероятно, сделаю это независимо. У меня есть предположение, что это должно работать с JObject
или любым JToken
из коробки, если только по какой-то причине это не является предполагаемым поведением.