我得到了这个弹性搜索实例,我试图实现像“动态”搜索模板这样的东西。
案例: 我有一个用户界面,我们可以调整某些类型的提升。 恩。 “将文章中的文章提高10点”,“将产品页面上的点击次数增加20”
今天: 我可以使用流畅的DSL编写查询本身,每次有人搜索时都会生成。
未来: 我希望在搜索模板中有这个,每次更改时都会更新,因此只需传入模板名称和查询字符串 - 而不必在每个请求中查找当前的提升值。
我的研究: 所以嵌套客户端支持将搜索模板添加到ES实例,但似乎它只支持“内联”脚本,我似乎无法找到一种方法将我在“Fluent DSL”中编写的现有查询解析为JSON等价物。
后备理念: 使用json \ query DSL手动编写脚本。
那里有任何想法和解决方案吗? :)
答案 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%"}
}));
希望这可以帮助其他人在同样的事情上挣扎。