Elasticsearch 搜索模板详解
程序员文章站
2022-07-05 14:48:27
...
Elasticsearch 搜索模板详解
一. 为什么使用搜索模板
日常开发时,通常我们都不需要使用搜索模板,但如果遇到非常复杂的业务场景,如金融、医药等,可能一次搜索需要传入或返回几十个字段,搜索几百个field、过滤条件、聚合分析等逻辑非常复杂,此时搜索模板就派上用场了。搜索模板就像Mysql中的procedure、function那样,只需要使用比如kibana访问ES,定义一次搜索模板,后续在代码中调用模板并传参即可完成搜索功能。
二. template入门案例
本入门案例中定义的搜索模板仅在一次查询调用时生效,没有让Elsticsearch保存(记忆)搜索模板,至于如何创建能让ES记忆的搜索模板,可以看本文第三节。
“source” 代表搜索模板,内含要执行的search语句
"params"是需要向模板中传递的变量。
{{变量名}}用于定义模板中的变量参数。
2.1 标准形式
不难发现,如果去掉"source"标签,实际上这就是一个标准的搜索条件语句。
GET /index_name/_search/template
{
"source": {
"query": {
"match": {
"remark": "{{kw}}"
}
},
"size": "{{size}}"
},
"params": {
"kw": "真正的数值",
"size": 100
}
}
2.2 toJson形式
toJSON形式的特点在于,source使用字符串来定义。注意: source内需要用到转义字符。
GET cars/_search/template
{
"source": "{ \"query\": { \"match\": {{#toJson}}parameter{{/toJson}} }}",
"params": {
"parameter" : {
"remark" : "真正的数值"
}
}
}
2.3 join方法传参
join方式传入的是数组,让Elasticsearch来进行数据的拼接。
GET index_name/_search/template
{
"source" : {
"query" : {
"match" : {
"remark" : "{{#join delimiter=' '}}kw{{/join delimiter=' '}}"
}
}
},
"params": {
"kw" : ["大众", "标致", "奔驰", "宝马"]
}
}
等价于"remark": “大众 标志 奔驰 宝马”。
2.4 default value形式
以下语句中,^end表示为end这个参数设置了默认值。如果在params中传递了end,则使用传递的数值,如果没有传递end,则使用默认的数值。
GET index_name/_search/template
{
"source" : {
"query" : {
"range" : {
"price" : {
"gte" : "{{start}}",
"lte" : "{{end}}{{^end}}200000{{/end}}"
}
}
}
},
"params": {
"start" : 100000
}
}
三. 记忆template并实现重复调用
3.1 Elasticsearch保存template
必须指定template的名称,方便后续反复调用。
POST _scripts/my_test_template
{
"script": {
"lang": "mustache",
"source": {
"query": {
"match": {
"field_name": "{{kw}"
}
}
}
}
}
3.2 调用 template
调用template时,通过id来指定具体的template。
GET index_name/_search/template
{
"id": "my_test_template",
"params": {
"kw": "自定义template的参数值"
}
}
3.3 查询已定义的template
GET _scripts/template_name
3.4 删除已定义的template
DELETE _scripts/template_name
上一篇: Elasticsearch写入性能优化
推荐阅读
-
Laravel + Elasticsearch 实现中文搜索的方法
-
Go html/template 模板的使用实例详解
-
详解ASP.NET MVC 解析模板生成静态页(RazorEngine)
-
ElasticStack学习(十):深入ElasticSearch搜索之QueryFiltering、多/单字符串的多字段查询
-
大数据搜索初创公司Elasticsearch融资1000万美元
-
centos7 esxi6.7模板实际应用详解
-
ElasticStack学习(八):ElasticSearch索引模板与聚合分析初探
-
PHP ElasticSearch做搜索实例讲解
-
详解Linux系统中字符串搜索命令ngrep的用法
-
AngularJS初始化静态模板详解