ES学习记录11——搜索模板(Search Template)

本文介绍了Elasticsearch的搜索模板功能,包括如何使用mustache语言构造模板,处理查询参数,如连接数组值、设置默认值和使用条件语句。还讲解了多搜索模板的使用以及搜索碎片的概念和参数配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 搜索模板

/_search/template端点允许使用mustache language(继承ES沙箱脚本语言的一种语言,是护胡言乱语吗……)为每个呈现搜索请求,在执行前和用模板参数填充现有的模板:

curl -X GET "localhost:9200/_search/template" -H 'Content-Type: application/json' -d'
{
   
   
    "source" : {
   
   
      "query": {
   
    "match" : {
   
    "{
   
   {my_field}}" : "{
   
   {my_value}}" } },
      "size" : "{
   
   {my_size}}"
    },
    "params" : {
   
   
        "my_field" : "message",
        "my_value" : "some message",
        "my_size" : 5
    }
}
'

执行这个请求时,ES卡住没有响应,一直处于loading的状态。

模板样例

用单值填充查询字符串

curl -X GET "localhost:9200/_search/template" -H 'Content-Type: application/json' -d'
{
   
   
    "source": {
   
   
        "query": {
   
   
            "term": {
   
   
                // 使用占位符的方式{
   
   {xxx}}使用一个变量
                "user": "{
   
   {query_string}}"
            }
        }
    },
    "params": {
   
   
        // 定义上述使用到的变量
        "query_string": "kimchy3"
    }
}
'

转换参数成JSON

{ {#toJson}}parameter{ {/toJson}}函数可以用来将map或数组的参数parameter转换成对应的JSON(下面是查询用户名为kimchy4kimchy3两个用户):

curl -X GET "localhost:9200/_search/template" -H 'Content-Type: application/json' -d'
{
   
   
    // 将变量users转成对应的JSON
  "source": "{ \"query\": { \"terms\": {
   
   {#toJson}}users{
   
   {/toJson}} }}",
  "params": {
   
   
      // 将users变量填充到上面的函数中
    "users" : {
   
   
        "user": [ "kimchy4", "kimchy3" ]
    }
  }
}
'

最终的转换结果(但是实际是看不到的)为:

// 转成JSON串
"query": {
   
   
    "terms": {
   
   
        "users": {
   
   
            "user": [
                "kimchy4",
                "kimchy3"
            ]
        }
    }
}

连接数组的值

{ {#join}}array{ {/join}}函数可以用来将数组array内的元素连接为一个用逗号,分隔的字符串(twitter索引中有kimchy1kimchy4kimchy,5五个文档),下面是一个栗子:

curl -X GET "localhost:9200/_search/template" -H 'Content-Type: application/json' -d'
{
   
   
  "source": {
   
   
    "query": {
   
   
      "match": {
   
   
        "user": "{
   
   {#join}}user{
   
   {/join}}"
      }
    }
  },
  "params": {
   
   
    "user": [ "kimchy", "5" ]
  }
}
'

这样最终传入的user变量为kimchy,5(由数组[ "kimchy", "5" ]转成kimchy,5),即直接去匹配了。上述是使用默认的分隔符(即逗号,)来连接数组各个元素,当前这个分隔符也可以自定义,使用自定义分隔符函数{ {#join delimiter='xx'}}date.formats{ {/join delimiter='xx'}}即可将默认的,改为||,比如:

curl -X GET "localhost:9200/_search/template" -H 'Content-Type: application/json' -d'
{
   
   
  "source": {
   
   
    "query": {
   
   
      "range": {
   
   
        "born": {
   
   
            "gte"   : "{
   
   {date.min}}",
            "lte"   : "{
   
   {date.max}}",
            // 将原来逗号的分隔符改为双竖杠||
            "format": "{
   
   {#join delimiter='||'}}date.formats{
   
   {/join delimiter='||'}}"
            }
      }
    }
  },
  "params": {
   
   
    "date": {
   
   
        "min": "2016",
        "max": "31/12/2017",
        "formats": ["dd/MM/yyyy", "yyyy"]
    }
  }
}
'

born最终的转换为:

"born" : {
   
   
    "gte" : "2016",
    "lte" : "31/12/2017",
    "format" : "dd/MM/yyyy||yyyy"
}

默认值

默认值的写法为:{ {var}}{ {^var}}default{ {/var}},下面是小栗子:

curl -X GET "localhost:9200/_search/template" -H 'Content-Type: application/json' -d'
{
   
   
  "source": {
   
   
    "query": {
   
   
      // 查询范围内获赞数的文档
      "range": {
   
   
        // 指定按获赞数进行筛选
        "likes": {
   
   
          // 获赞数的下限
          "gte": "{
   
   {start}}",
          // 获赞数的上限
          "lte": "{
   
   {end}}{
   
   {^end}}20{
   
   {/end}}"
        }
      }
    }
  },
  "params": {
   
   
      ...
  }
}
'

如果params中定义startend两个变量,比如:

  "params": {
   
   
      "start": 12,
      "end": 13
  }

那最终的查询参数最终为:

    "line_no": {
   
   
        "gte": "12",
        "lte": "13"
    }

但如果params中只定义了start变量,没有定义end</

### Elasticsearch 8.x 版本学习笔记 #### 关键特性概述 Elasticsearch 是一款分布式搜索引擎,支持实时搜索、多租户等功能。其核心优势在于能够快速处理大量数据并提供高效的全文检索能力[^1]。 #### 安装与启动 对于初次使用者来说,可以从官方网站下载适合的操作系统版本进行安装。完成安装后通过命令行工具执行 `bin/elasticsearch` 启动服务实例。为了确保集群稳定运行,建议按照官方文档中的最佳实践来调整JVM参数和其他环境变量设置[^2]。 #### 创建索引及Mapping定义 创建一个新的索引时可以通过API指定名称以及配置文件路径: ```json PUT /my-index-000001 { "settings": { "index.number_of_shards": 3, "index.number_of_replicas": 2 }, "mappings": { "_source": { "enabled": true }, "properties": { "name": {"type": "keyword"}, "description": {"type": "text"} } } } ``` 此段代码展示了如何设定shard数量和副本数,并为特定字段指定了相应的类型——例如这里设置了`name`作为关键字型(`keyword`)而`description`则被设成文本型(`text`)[^3]。 #### 动态模板应用 当面对未知结构的数据源时,动态模板允许自动识别新加入字段的性质从而为其分配最恰当的数据表示形式。这极大地方便了灵活应对各种业务场景下的需求变化。 ```json PUT _template/my_template_1 { "index_patterns": ["te*", "bar*"], "priority": 1, "version": 5, "settings": {}, "aliases": {}, "mappings": { "dynamic_templates": [ { "strings_as_keywords": { "match_mapping_type": "string", "mapping": { "type": "keyword" } } } ] } } ``` 这段JSON片段说明了一个简单的动态模板案例,其中任何匹配模式下新增加字符串类型的字段都将默认转换成关键词类型存储。 #### 正排索引 vs 倒排索引 正排索引指的是基于唯一标识符查找对应记录的方式;相反地,倒排索引则是依据某些特征值反向定位到拥有这些特性的所有条目集合之中。这种机制使得即使是在海量数据库里也能迅速实现精准查询操作[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值