ElasticSearch - 使用NEST(.net)添加\ update SearchTemplate

时间:2017-03-30 14:20:04

标签: c# elasticsearch nest elasticsearch-net

我得到了这个弹性搜索实例,我试图实现像“动态”搜索模板这样的东西。

案例: 我有一个用户界面,我们可以调整某些类型的提升。 恩。 “将文章中的文章提高10点”,“将产品页面上的点击次数增加20”

今天: 我可以使用流畅的DSL编写查询本身,每次有人搜索时都会生成。

未来: 我希望在搜索模板中有这个,每次更改时都会更新,因此只需传入模板名称和查询字符串 - 而不必在每个请求中查找当前的提升值。

我的研究: 所以嵌套客户端支持将搜索模板添加到ES实例,但似乎它只支持“内联”脚本,我似乎无法找到一种方法将我在“Fluent DSL”中编写的现有查询解析为JSON等价物。

后备理念: 使用json \ query DSL手动编写脚本。

那里有任何想法和解决方案吗? :)

1 个答案:

答案 0 :(得分:0)

版本:ElasticSearch \ ElasticSearch.NET \ NEST v5.2

正如评论中指出的那样,在NEST客户端上有一个序列化程序,您也可以在this answer中使用NewtonSoft JSON库作为pointet - 但同样如上所述,要获得确切的JSON使用Nest客户端序列化程序,它使用正确的配置包装NewtonSoft JSON。

以下是我使用Object初始化程序语法实现的示例,正​​如上面提到的答案中所述的使用旧库。

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

希望这可以帮助其他人在同样的事情上挣扎。