标签:全球 map mic 过程 最小化 rip 全局替换 cloc malformed
1、线上实战提问Elasticsearch做模版查询的时候,在使用 terms 进行批量查询的时候放入数组在模版中进行查询失败,类似于模版传入数组该如何实现?
问题来源:死磕Elasticsearch知识星球
# 定义索引
PUT uint-2020-08-17
{
"mappings": {
"properties": {
"clock": {
"type": "date",
"format": "epoch_second"
},
"itemid": {
"type": "long"
},
"ns": {
"type": "long"
},
"ttl": {
"type": "long"
},
"value": {
"type": "long"
}
}
}
}
# 添加内容
PUT uint-2020-08-17/_bulk
{ "index" : { "_id" : "1" } }
{"itemid":1,"ns":643214179,"clock":1597752311,"value":"1123","ttl":604800}
{ "index" : { "_id" : "2" } }
{"itemid":2,"ns":643214179,"clock":1597752311,"value":"123555","ttl":604800}
{ "index" : { "_id" : "3" } }
{"itemid":3,"ns":643214179,"clock":1597752311,"value":"1","ttl":604800}
{ "index" : { "_id" : "4" } }
{"itemid":4,"ns":643214179,"clock":1597752311,"value":"134","ttl":604800}
{ "index" : { "_id" : "5" } }
{"itemid":2,"ns":643214179,"clock":1597752311,"value":"123556","ttl":604800}
查询语句:
PUT _scripts/item_agg
{
"script": {
"lang": "mustache",
"source": {
"_source": [
"value"
],
"size": 0,
"query": {
"bool": {
"filter": [
{
"terms": "{{#toJson}}statuses{{/toJson}}"
},
{
"range": {
"clock": {
"gte": "{{startTime}}",
"lte": "{{endTime}}"
}
}
}
]
}
},
"aggs": {
"group_terms": {
"terms": {
"field": "itemid"
},
"aggs": {
"avg_value": {
"avg": {
"field": "value"
}
},
"max_value": {
"max": {
"field": "value"
}
}
}
}
}
}
}
}
查询模版参数:
POST uint-*/_search/template
{
"id": "item_agg",
"params": {
"itemid":{
"statuses":[1,2]
},
"startTime":1597752309,
"endTime":1597752333
}
}
以上内容看着很长,根据注释拆解为:
很多人都听说使用过 索引模板 index template,索引模板的好处:
根据第一部分实战中的数据,定义了如下的模板。
PUT _scripts/cur_search_template
{
"script": {
"lang": "mustache",
"source": {
"query": {
"match": {
"{{cur_field}}": "{{cur_value}}"
}
},
"size": "{{cur_size}}"
}
}
}
POST uint-*/_search/template
{
"id": "cur_search_template",
"params": {
"cur_field":"itemid",
"cur_value":1,
"cur_size":50
}
}
该模板:支持用户自定义动态设置搜索字段及搜索参数字段。
实战中可以通过如下_scripts 的方式,将检索模板定义到服务器端。
如果想检索别的字段:客户端或者请求端传递不同的参数即可。
真正意义上的实现了:检索和请求参数的分离。
更多原理和基础参见官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html
以下内容摘自:Wood 大叔的——Elastic认证考试心得。
按照要求写一个search template
熟悉search template的mustache模版语言即可轻松写出,但是很遗憾,平常没用过search template,虽然知道个大概,但是当时写的时候,不知道哪里语法有问题,PUT template总是不成功。猜想可能是哪个位置的字符没有转译产生非法json字符,或者哪一层嵌套有问题。总之就是调试不成功,又浪费了很多时间。
https://elasticsearch.cn/article/6133
如上引用想说明的是:search template的语法比较复杂,如果没用过,很容易头大。
实战一把,报错如下:
{
"error": {
"root_cause": [
{
"type": "parsing_exception",
"reason": "[terms] query malformed, no start_object after query name",
"line": 1,
"col": 67
}
],
"type": "parsing_exception",
"reason": "[terms] query malformed, no start_object after query name",
"line": 1,
"col": 67
},
"status": 400
}
拆解一下。
POST /_search
{
"_source": [
"value"
],
"size": 0,
"query": {
"bool": {
"filter": [
{
"terms": {
"itemid": [
1,
2
]
}
},
{
"range": {
"clock": {
"gte": 1597752309,
"lte": 1597752333
}
}
}
]
}
},
"aggs": {
"group_terms": {
"terms": {
"field": "itemid"
},
"aggs": {
"avg_value": {
"avg": {
"field": "value"
}
},
"max_value": {
"max": {
"field": "value"
}
}
}
}
}
}
GET _search/template
{
"source": "{ \"query\": { \"terms\": {{#toJson}}statuses{{/toJson}} }}",
"params": {
"statuses" : {
"itemid": [ 1, 2 ]
}
}
}
用现在正确的对比第一部分出错的,可以找到如下两处错误:
POST _scripts/test_script_01
{
"script": {
"lang": "mustache",
"source": "{ \"query\": { \"terms\": {{#toJson}}statuses{{/toJson}} }}"
}
}
POST uint-*/_search/template
{
"id": "test_script_01",
"params": {
"statuses": {
"itemid": [
1,
2
]
},
"startTime": 1597752309,
"endTime": 1597752333
}
}
GET _search/template
{
"source": "{\"_source\":[\"value\"],\"size\":0,\"query\":{\"bool\":{\"filter\":[{\"terms\":{{#toJson}}statuses{{/toJson}}},{\"range\":{\"clock\":{\"gte\":{{startTime}},\"lte\":{{endTime}}}}}]}},\"aggs\":{\"group_terms\":{\"terms\":{\"field\":\"itemid\"},\"aggs\":{\"avg_value\":{\"avg\":{\"field\":\"value\"}},\"max_value\":{\"max\":{\"field\":\"value\"}}}}}}",
"params": {
"statuses" : {
"itemid": [ 1, 2 ]
},
"startTime":1597752309,
"endTime":1597752333
}
}
拷贝 source 部分转换为脚本格式就可以,篇幅问题,不再赘述。
看似复杂,拆解后便不复杂。
看似很难,拆解后就很简单。
检索模板用的好,前后端扯皮少、效率高很多!
你的小问题,我的大问题。
和你一起,死磕 Elasticsearch!
参考:
https://elastic-search-in-action.medcl.com/3.site_search/3.3.search_box/search_template/
https://subscription.packtpub.com/book/big_data_and_business_intelligence/9781787128453/7/ch07lvl1sec61/search-templates
推荐:
重磅 | 死磕 Elasticsearch 方法论认知清单(2020年国庆更新版)
能拿驾照就能通过 Elastic 认证考试!
更短时间更快习得更多干货!
中国 40%+ Elastic 认证工程师出自于此!
和全球 800+ Elastic 爱好者一起死磕 Elasticsearch!
标签:全球 map mic 过程 最小化 rip 全局替换 cloc malformed
原文地址:https://blog.51cto.com/15050720/2562579