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%"}
                        }));

Надеюсь, что это помогает кому-то еще бороться с тем же.

Другие вопросы по тегам