Elasticsearch系列---几个高级功能

本文介绍了Elasticsearch的高级功能,包括搜索模板的参数替换、Json条件查询、join语法及默认值设置,定制映射模板的动态映射效果,以及高亮搜索的基本语法和自定义标签。此外,还讲解了地理位置搜索,如geo_point类型、geo_bounding_box、geo_distance等查询方法,展示了如何在Elasticsearch中实现基于地理位置的搜索功能。

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

概要

本篇主要介绍一下搜索模板、映射模板、高亮搜索和地理位置的简单玩法。

标准搜索模板

搜索模板search tempalte高级功能之一,可以将我们的一些搜索进行模板化,使用现有模板时传入指定的参数就可以了,避免编写重复代码。对常用的功能可以利用模板进行封装,使用时更简便。

这点类似于我们编程时的接口封装,将一些细节处理的东西封装成接口,供别人调用,使用者就只需要关注参数和响应结果就行,这样可以更好地提高代码复用率。

下面我们来看看最基本的几种用法

参数替换
GET /music/children/_search/template
{
   
  "source": {
   
    "query": {
   
      "match": {
   
        "{
   {field}}":"{
   {value}}"
      }
    }
  },
  "params": {
   
    "field":"name",
    "value":"bye-bye"
  }
}

该搜索模板编译后等同于:

GET /music/children/_search
{
   
  "query": {
   
    "match": {
   
      "name":"bye-bye"
    }
  }
}
使用Json格式的条件查询

{ {#toJson}}块内可以写稍微复杂一些的条件

GET /music/children/_search/template
{
   
  "source": "{\"query\":{\"match\": {
   {#toJson}}condition{
   {/toJson}}}}",
  "params": {
   
    "condition": {
   
      "name":"bye-bye"
    }
  }
}

该搜索模板编译后等同于如下:

GET /music/children/_search
{
   
  "query": {
   
    "match": {
   
      "name":"bye-bye"
    }
  }
}
join语法

join内的参数names可以写多个:

GET /music/children/_search/template
{
   
  "source": {
   
    "query": {
   
      "match": {
   
        "name": "{
   {#join delimiter=' '}}names{
   {/join delimiter=' '}}"
      }
    }
  },
  "params": {
   
    "name":["gymbo","you are my sunshine","bye-bye"]
  }
}

该搜索模板编译后等同于如下:

GET /music/children/_search
{
   
  "query": {
   
    "match": {
   
      "name":"gymbo you are my sunshine bye-bye"
    }
  }
}
搜索模板的默认值设置

可以对搜索模板进行一些默认值的设置,如{ {^end}}500表示如果end参数为空,默认值为500

GET /music/children/_search/template
{
   
  "source":{
   
    "query":{
   
      "range":{
   
        "likes":{
   
          "gte":"{
   {start}}",
          "lte":"{
   {end}}{
   {^end}}500{
   {/end}}"
        }
      }
    }
  },
  "params": {
   
    "start":1,
    "end":300
  }
}

该搜索模板编译后等同于:

GET /music/children/_search
{
   
  "query": {
   
    "range": {
   
      "likes": {
   
        "gte": 1,
        "lte": 300
      }
    }
  }
}
条件判断

在Mustache语言中,它没有if/else这样的判断,但是你可以定section来跳过它如果那个变量是false还是没有被定义

{
   {
   #param1}}
    "This section is skipped if param1 is null or false"
{
   {
   /param1}}

示例:创建mustache scripts对象

POST _scripts/condition
{
   
  "script": {
   
    "lang": "mustache",
    "source": 
    """
        {
   
        	"query": {
   
              "bool": {
   
                "must": {
   
                  "match": {
   
                    "name": "{
   {name}}"
                  }
                },
                "filter":{
   
                  {
   {
   #isLike}}
                    "range":{
   
                      "likes":{
   
                        {
   {
   #start}}
                          "gte":"{
   {start}}"
                          {
   {
   #end}},{
   {
   /end}}
                        {
   {
   /start}}
                        {
   {
   #end}}
                          "lte":"{
   {end}}"
                        {
   {
   /end}}
                      }
                    }
                  {
   {
   /isLike}}
                }
              }
            }
        }
    """
  }
}

使用mustache template查询:

GET _search/template
{
   
    "id": "condition", 
    "params": {
   
      "name":"gymbo",
      "isLike":true,
      "start":1,
      "end":
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值