Elastic Stack核心技术实战02--Elasticsearch中的Domain Specific Language详解

      上一篇博客中给大家介绍了Elasticsearch单机版的环境搭建以及简单的增删改查,今天我们就来学习一下Elasticsearch的Domain Specific Language,也就是我们常说的DSL查询。在es中以JSON的格式出现。

     在此之前先给大家介绍一下分词器,首先我们安装的es版本是6.5.4,所以我们准备好对应版本的ik分词器,并将解压放到es的plugins目录下,如下图所示:

 

解压完成之后我们只需要重新启动es即可。启动成功之后我们在浏览器中通过kibana来进行测试。如下图所示:

大家可以分别执行以下上面的两条语句,看看分词之后的下效果有什么不同。这里先提前说明一下我遇到的坑,在es6.x的版本中String类型的数据主要分为text和keyword两种。前者支持分词,后者不建议分析,主要用于修饰一些不需要分析的字段。加入我们想要的对keyword进行分词的话,很遗憾,如下图所示:

es报错了,所以我们在开发中,一般会将需要分词的字段用text,不想需要分词的使用keyword。好了,下面给大家来介绍一下es中的数据类型。如下所示:

字符串型:text、keyword

数值型:long、integer、short、byte、double、float、half_float、scaled_float

日期类型:date

布尔类型:boolean

二进制类型:binary

范围类型:integer_range、float_range、long_range、double_range、date_range

还以一些复杂的数据类型:数组类型:array 、对象类型:object 、嵌套类型:nested object。下面我们来自定义一个Mapping,深入的研究一下今天的主题---es中的Domain Specific Language。

 首先我们创建一个mapping,语法如下所示:

PUT martial_arts
{
  "mappings": {
    "_doc":{
      "properties":{
        "name":{
          "type": "keyword"
        },
        "sex":{
          "type" : "integer"
        },
        "age":{
          "type":"integer"
        },
        "force":{
          "type":"double"
        },
        "girlfriend":{
          "type":"keyword"
        },
        "novel":{
          "type":"keyword"
        },
        "hobby":{
          "type":"text",
          "analyzer":"ik_max_word"
        },
        "home":{
          "type":"text",
          "analyzer":"ik_smart"
        }
      }
    }
  }
}

 

接着我们可以添加数据, 我们依次添加7条数据,如下图所示(查询语句下面先以截图的形式展示,具体的DSL语言会在最后面粘贴出来):

然后我们查询一下,GET /martial_arts/_search或者GET /martial_arts/_doc/_search都可以。

一共有7条数据。接下来我们就先来学习一下 全词匹配filter的使用方法。例如我们要查询出天龙八部中的人,可以编写如下的DSL

 

其中filter中使用term来包含查询的关键词, 同样的我们也可以查询射雕中的人物。好了,接下来我们再来看看分词匹配怎么使用,我们搜索会降龙十八掌的人有哪些:

这里我们很意外的我发现了一个问题,为什么归海一刀会出现在结果集中呢。我们知道hobby这字段设置成了ik_max_word,也就是最大程度的拆分,我们来看一下降龙十八掌差分之后的情况:

我们线最后有一个掌字,应该就是这个掌字匹配上了归海一刀的如来神掌。好吧,我们接下来用十八来试试

我们发现依然可以查询出来郭靖和萧峰两个人。我们再按照home字段来搜索

 好了,接下来我们来试试更加复杂的查询,我们来查询在倚天屠龙记里面hobby里面带有白骨的人,如下图所示:

好了,查询出来了一个周芷若。我们再来看一下在倚天屠龙记中,hobby里面带有拳字的人

好了,这就是先按全词匹配,然后再结果集中在做分词匹配,稍微复杂一点的查询。下面我们继续学习更加复杂的查询,按小说分组来分组,并统计每个小说中人的个数:

好吧,既然聊到了分组,那怎么少得了聚合呢。下面来看看聚合函数的用法 

我们发现出现了一点小意外,数据似乎不是我们想要的,于是查看了一下官网上的文档,这样这样写不对,于是做了以下的修改:

好了,关于这种复杂的查询语法,大家可以自行去查看文档这里给出官网地址:https://www.elastic.co/cn/

关于DSL(Domain Specific Language)的使用就先给大家介绍这么多了,明天我们学习一下怎么使用Java语言去调用es的api来实现查询的功能。好了,下面给出上图中的具体的语句:

GET _analyze
{
  "text":"降龙十八掌",
  "analyzer": "ik_max_word"
}

GET _analyze
{
  "text":"爱因斯坦的舅舅是哈根达斯",
  "analyzer": "ik_smart"
}


GET _analyze
{
  "keyword":"爱因斯坦的舅舅是哈根达斯",
  "analyzer": "ik_smart"
}

DELETE martial_arts

PUT martial_arts
{
  "mappings": {
    "_doc":{
      "properties":{
        "name":{
          "type": "keyword"
        },
        "sex":{
          "type" : "integer"
        },
        "age":{
          "type":"integer"
        },
        "force":{
          "type":"double"
        },
        "girlfriend":{
          "type":"keyword"
        },
        "novel":{
          "type":"keyword"
        },
        "hobby":{
          "type":"text",
          "analyzer":"ik_max_word"
        },
        "home":{
          "type":"text",
          "analyzer":"ik_smart"
        }
      }
    }
  }
}

GET /_cat/indices?v


PUT /martial_arts/_doc/001
{
  "name":"张无忌",
  "sex":1,
  "age":22,
  "force":8.9,
  "girlfriend":"赵敏",
  "novel":"倚天屠龙记",
  "hobby":"乾坤大挪移、九阳神功、七伤拳",
  "home":"武当山"
}

PUT /martial_arts/_doc/002
{
  "name":"归海一刀",
  "sex":1,
  "age":24,
  "force":9.3,
  "girlfriend":"叶璇",
  "novel":"天下第一",
  "hobby":"阿鼻三刀、霸刀、如来神掌",
  "home":"北京"
}

PUT /martial_arts/_doc/003
{
  "name":"萧峰",
  "sex":1,
  "age":26,
  "force":9.0,
  "girlfriend":"阿朱",
  "novel":"天龙八部",
  "hobby":"降龙十八掌、打狗棒法",
  "home":"五台山"
}

PUT /martial_arts/_doc/004
{
  "name":"郭靖",
  "sex":1,
  "age":45,
  "force":8.5,
  "girlfriend":"黄蓉",
  "novel":"射雕英雄传",
  "hobby":"降龙十八掌",
  "home":"湖北襄阳"
}

PUT /martial_arts/_doc/005
{
  "name":"杨逍",
  "sex":1,
  "age":40,
  "force":8.5,
  "girlfriend":"纪晓芙",
  "novel":"倚天屠龙记",
  "hobby":"乾坤大挪移、弹指神功、黯然销魂拳",
  "home":"昆仑山"
}

PUT /martial_arts/_doc/006
{
  "name":"朱铁胆",
  "sex":1,
  "age":50,
  "force":9.5,
  "girlfriend":"素心",
  "novel":"天下第一",
  "hobby":"吸功大法,霸王拳,九阳神功",
  "home":"北京"
}

PUT /martial_arts/_doc/007
{
  "name":"段誉",
  "sex":1,
  "age":22,
  "force":8.5,
  "girlfriend":"王语嫣",
  "novel":"天龙八部",
  "hobby":"六脉神剑",
  "home":"云南大理"
}

PUT /martial_arts/_doc/008
{
  "name":"周芷若",
  "sex":0,
  "age":18,
  "force":7.5,
  "girlfriend":"张无忌、宋青书",
  "novel":"倚天屠龙记",
  "hobby":"九阴白骨爪、九阴真经",
  "home":"四川峨嵋山"
}

PUT /martial_arts/_doc/009
{
  "name":"赵敏",
  "sex":0,
  "age":18,
  "force":7.0,
  "girlfriend":"张无忌",
  "novel":"倚天屠龙记",
  "hobby":"七伤拳、大力金刚指、玄冥神功",
  "home":"内蒙古"
}


GET /martial_arts/_doc/_search
{
  "query":{
    "bool":{
      "filter":{
        "term":{
          "girlfriend" : "阿朱"
        }
        
      }
    }
  }
}


GET /martial_arts/_doc/_search
{
  "query":{
    "match":{
      "home":"北京"
    }
  }
}



GET /martial_arts/_doc/_search
{
  "query":{
    "bool":{
      "filter":{
        "term":{
          "novel" : "倚天屠龙记"
        }
        
      },
      "must":[{
        "match":{
          "hobby":"拳"
         }
       }
      ]
    }
  }
}


GET /martial_arts/_doc/_search
{
  "aggs":{
    "count with novel":{
      "terms":{
        "field":"novel"
      },
      "aggs":{
       "max_force":{
         "max":{
           "field":"force"
          }
        }
     }
    }
   }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值