ElasticSearch - добавить \ обновить SearchTemplate, используя NEST (.net)
Я получил этот экземпляр asticsearch, и я пытаюсь реализовать что-то вроде "динамического" шаблона поиска.
Кейс: у меня есть пользовательский интерфейс, где мы можем настроить усиление определенных типов. ех. "Увеличить попадания в статьях на 10", "Увеличить попадания на странице товара на 20"
Сегодня: я могу написать сам запрос, используя свободный DSL, который будет генерироваться каждый раз, когда кто-то ищет.
Будущее: Я хотел бы иметь это в шаблоне поиска, который будет обновляться каждый раз при внесении изменений, таким образом, просто передавая имя шаблона и строку запроса - вместо того, чтобы искать текущие значения повышения в каждом запросе.
Мое исследование: Таким образом, клиент nest поддерживает добавление searchtemplates к экземпляру ES, но кажется, что он поддерживает только "встроенные" сценарии, и я не могу найти способ проанализировать мой существующий запрос, написанный на "Fluent DSL", в эквивалент JSON.
Альтернативная идея: написание сценария вручную с использованием json \ query DSL.
Какие-нибудь идеи \ решения там?:)
1 ответ
Версия: ElasticSearch\ElasticSearch.NET\NEST v5.2
Как указано в комментариях, на NEST-клиенте есть сериализатор, вы также можете использовать библиотеку JSON NewtonSoft, как указывается в этом ответе, но, как уже говорилось, для получения точного JSON используйте сериализатор Nest Client, который обертывает NewtonSoft. JSON с правильной конфигурацией.
Вот пример реализации, которую я сделал, используя синтаксис инициализатора объекта, поскольку тот, который указан в ответе, упомянутом выше, использует старую библиотеку.
var searchRequest = new SearchRequest()
{
Query = query
};
var myBytes = _client.Serializer.SerializeToBytes(searchRequest);
var jsonSearchTemplate = Encoding.UTF8.GetString(myBytes);
Как дополнительная информация, вот как вы добавляете ее в свой кластер:
//Define your template ID, this is later used when doing the search.
var templateRequest = new PutSearchTemplateDescriptor("my_template");
//Add your parsed json as the inline script
templateRequest.Template(jsonSearchTemplate);
var response = _client.PutSearchTemplate(templateRequest);
Как сделать запрос с использованием шаблона: (я также получил несколько параметров, которые нужно отправить)
var response =
_client.SearchTemplate<MyIndexObject>(
e =>
e.Index($"myIndex")
.Id("my_template")
.Params(new Dictionary<string, object>()
{
{"query_string", "Obamacare"},
{"min_should_match", "70%"}
}));
Надеюсь, что это помогает кому-то еще бороться с тем же.