上一篇博客中给大家介绍了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"
}
}
}
}
}
}