Elasticsearch使用search template将搜索模板化

295次阅读  |  发布于3年以前

前言

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

1、search template入门

search template:"{{field}}" : "{{value}}" ,设置search template

GET /blog_website/blogs/_search/template
{
  "inline" : {
    "query": { 
      "match" : { 
        "{<!-- -->{field}}" : "{<!-- -->{value}}" 
      } 
    }
  },
  "params" : {
      "field" : "title",
      "value" : "博客"
  }
}

相当于

GET /blog_website/blogs/_search
{
  "query": { 
    "match" : { 
      "title" : "博客" 
    } 
  }
}

2、toJson

以json格式传入,

设置

search template

GET /blog_website/blogs/_search/template
{
  "inline": "{\"query\": {\"match\": {<!-- -->{#toJson}}matchCondition{<!-- -->{/toJson}}}}",
  "params": {
    "matchCondition": {
      "title": "博客"
    }
  }
}

相当于

GET /blog_website/blogs/_search
{
  "query": { 
    "match" : { 
      "title" : "博客" 
    } 
  }
}

3、join

一个field多值查询,join关联,

设置

search template

GET /blog_website/blogs/_search/template
{
  "inline": {
    "query": {
      "match": {
        "title": "{<!-- -->{#join delimiter=' '}}titles{<!-- -->{/join delimiter=' '}}"
      }
    }
  },
  "params": {
    "titles": ["博客", "网站"]
  }
}

相当于

GET /blog_website/blogs/_search
{
  "query": { 
    "match" : { 
      "title" : "博客 网站" 
    } 
  }
}

4、default value

初始化search template数据,params未传values时候,使用初始化的默认数据查询初始化搜索数据

POST /blog_website/blogs/1/_update
{
  "doc": {
    "views": 5
  }
}

设置search template

GET /blog_website/blogs/_search/template
{
  "inline": {
    "query": {
      "range": {
        "views": {
          "gte": "{<!-- -->{start}}",
          "lte": "{<!-- -->{end}}{<!-- -->{^end}}20{<!-- -->{/end}}"
        }
      }
    }
  },
  "params": {
    "start": 1,
    "end": 10
  }
}

相当于

GET /blog_website/blogs/_search
{
  "query": {
    "range": {
      "views": {
        "gte": 1,
        "lte": 10
      }
    }
  }
}

设置

search template,使用default value

GET /blog_website/blogs/_search/template
{
  "inline": {
    "query": {
      "range": {
        "views": {
          "gte": "{<!-- -->{start}}",
          "lte": "{<!-- -->{end}}{<!-- -->{^end}}20{<!-- -->{/end}}"
        }
      }
    }
  },
  "params": {
    "start": 1
  }
}

相当于

GET /blog_website/blogs/_search
{
  "query": {
    "range": {
      "views": {
        "gte": 1,
        "lte": 20
      }
    }
  }
}

5、conditional

条件查询模版,

设置

search template

{
  "query": {
    "bool": {
      "must": {
        "match": {
          "line": "{<!-- -->{text}}" 
        }
      },
      "filter": {
        {<!-- -->{#line_no}} 
          "range": {
            "line_no": {
              {<!-- -->{#start}} 
                "gte": "{<!-- -->{start}}" 
                {<!-- -->{#end}},{<!-- -->{/end}} 
              {<!-- -->{/start}} 
              {<!-- -->{#end}} 
                "lte": "{<!-- -->{end}}" 
              {<!-- -->{/end}} 
            }
          }
        {<!-- -->{/line_no}} 
      }
    }
  }
}

相当于

GET /my_index/my_type/_search 
{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "my_index",
        "_type": "my_type",
        "_id": "1",
        "_score": 1,
        "_source": {
          "line": "我的博客",
          "line_no": 5
        }
      }
    ]
  }
}

6、保存search template

es的config/scripts目录下,预先保存这个复杂的模板,后缀名是.mustache,文件名是conditonal

在进行 条件 search template 查询

GET /my_index/my_type/_search/template
{
  "file": "conditional",
  "params": {
    "text": "博客",
    "line_no": true,
    "start": 1,
    "end": 10
  }
}

提供一个思路

比如说,一般在大型的团队中,可能不同的人,都会想要执行一些类似的搜索操作

这个时候,有一些负责底层运维的一些同学,就可以基于search template,封装一些模板出来,然后是放在各个es进程的scripts目录下的

其他的团队,其实就不用各个团队自己反复手写复杂的通用的查询语句了,直接调用某个搜索模板,传入一些参数就好了

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8