出自 图灵学院 ElasticSearch课程, 我自己学完了,整理了一下,然后给老师说的话,记录了一下,发了个博客

概述

搜索模板,search template,高级功能,就可以将我们的一些搜索进行模板化,然后的话,每次执行这个搜索,就直接调用模板,给传入一些参数就可以了

search template就类似MySQL的存储过程和存储函数

MySQL的存储过程和存储函数就直接放到MySQL里面的,执行效率比较高,比较复杂的逻辑可以直接封装好,然后程序员直接快速的调用就可以了.

search template搜索模板在公司不一定能用得到.

但是一般高阶专门搞ElasticSearch的开发人员可能就会用到了.

template入门案例

简单定义参数并传递

source和params 是关键字,不能随便改的.

  1. GET /cars/_search/template
  2. {
  3. "source": {
  4. "query": {
  5. "match": {
  6. "remark": "{{kw}}"
  7. }
  8. },
  9. "size": "{{size}}"
  10. },
  11. "params": {
  12. "kw": "大众",
  13. "size": 2
  14. }
  15. }

toJson方式传递参数

  1. GET cars/_search/template
  2. {
  3. "source": """{ "query": { "match": {{#toJson}}parameter{{/toJson}} }}""",
  4. "params": {
  5. "parameter": {
  6. "remark": "大众"
  7. }
  8. }
  9. }

toJson不要随便改,是一个关键字

join方式传递参数

  1. GET cars/_search/template
  2. {
  3. "source": {
  4. "query": {
  5. "match": {
  6. "remark": "{{#join delimiter=' '}}kw{{/join delimiter=' '}}"
  7. }
  8. }
  9. },
  10. "params": {
  11. "kw": [
  12. "大众",
  13. "标致"
  14. ]
  15. }
  16. }

上面的dsl的意思是
remark:”大众 标致”

默认值定义:

下面的 {{^end}}200000{{/end}}” 语法就是定义了一个默认值


  1. GET cars/_search/template
  2. {
  3. "source": {
  4. "query": {
  5. "range": {
  6. "price": {
  7. "gte": "{{start}}",
  8. "lte": "{{end}}{{^end}}200000{{/end}}"
  9. }
  10. }
  11. }
  12. },
  13. "params": {
  14. "start": 100000,
  15. "end" : 200000
  16. }
  17. }
  1. GET cars/_search/template
  2. {
  3. "source": {
  4. "query": {
  5. "range": {
  6. "price": {
  7. "gte": "{{start}}",
  8. "lte": "{{end}}{{^end}}200000{{/end}}"
  9. }
  10. }
  11. }
  12. },
  13. "params": {
  14. "start": 100000
  15. }
  16. }

“lte”: “{{end}}{{^end}}200000{{/end}}” 中{{^end}}200000{{/end}}的意思是声明默认值

上面两个dsl语句效果是一样的.

记录template实现重复调用

可以使用Mustache语言作为搜索请求的预处理,它提供了模板,然后通过键值对来替换模板中的变量。把脚本存储在本地磁盘中,默认的位置为:elasticsearch\config\scripts,通过引用脚本名称进行使用

1 保存template到ES

test 是模板名字

  1. POST _scripts/test
  2. {
  3. "script": {
  4. "lang": "mustache",
  5. "source": {
  6. "query": {
  7. "match": {
  8. "remark": "{{kw}}"
  9. }
  10. }
  11. }
  12. }
  13. }

2 调用template执行搜索

“id”: “test”, 意思是调用名字为test的模板
params就是调用模板的值

  1. GET cars/_search/template
  2. {
  3. "id": "test",
  4. "params": {
  5. "kw": "大众"
  6. }
  7. }

3 查询已定义的template

  1. GET _scripts/test

结果:

  1. {
  2. "_id" : "test",
  3. "found" : true,
  4. "script" : {
  5. "lang" : "mustache",
  6. "source" : """{"query":{"match":{"remark":"{{kw}}"}}}""",
  7. "options" : {
  8. "content_type" : "application/json; charset=UTF-8"
  9. }
  10. }
  11. }

4 删除已定义的template

  1. DELETE _scripts/test