ElasticSearch 学习(二)—— IK 分词器和 Kibana


前言

在了解过 ElasticSearch 的基础和基本的对外提供的接口之后,我接触了 IK分词器和 Kibana 工具。

提示:以下是本篇文章正文内容,下面案例可供参考

一、IK 分词器

1.1 简介

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开 始,IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词和 文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于 Lucene项目,同时提供了对Lucene的默认优化实现。

IK分词器3.0的特性如下:

  1. 采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。 ;
  2. 采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科 学计数法),中文词汇(姓名、地名处理)等分词处理;
  3. 对中英联合支持不是很好,在这方面的处理 比较麻烦.需再做一次查询,同时是支持个人词条的优化的词典存储,更小的内存占用;
  4. 支持用户词 典扩展定义 ;
  5. 针对Lucene全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询 关键字的搜索排列组合,能极大的提高Lucene检索的命中率。

1.2 安装

IK 分词器的下载地址 , 下载完成之后上传到我们准备好的服务器上,并进行解压。然后改名为 ik(改名是为了方便操作,可以不改)。

解压和重命名的指令:

# 解压
unzip elasticsearch-analysis-ik-5.6.8.zip
# 重命名
mv elasticsearch ik

然后,将 IK 分词器插件拷贝到 ElasticSearch 容器的 plugins 目录下(容器的下载安装参考前面的 ElasticSearch基础):

# ik 插件的路径根据自己的实际情况改一下
docker cp ./ik  c_es:/usr/share/elasticsearch/plugins

然后重启容器,插件就生效了。

1.3 简单的参数说明

  • _analyze: 发送请求到分词器;
  • analyzer: 分词器:有两种,一种是 ik_smar 会做最粗粒度的拆分 , 比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。 一种是 ik_max_word 会将文本做最细粒度的拆分, 比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共 和国、人民、共和国、大会堂、大会、会堂等词语。
  • pretty: 格式化数据,便于查看。
  1. 测试1
http://192.168.191.128:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员

返回结果:
在这里插入图片描述
2. 测试2

http://192.168.191.128:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员

在这里插入图片描述
总结:

  1. ik_max_word:会将文本做最细粒度的拆分;
    比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂”等词语;
  2. ik_smart:会做最粗粒度的划分;
    比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、人民大会堂”。

二、Kibana 使用 — 掌握 DSL 语句

2.1 简介

我们原来使用过 elasticsearch-header 插件实现数据查找的,但是 elasticsearch-header 的功能比较单一,因此引入一个更加专业的工具实现对日志的实时分析。就是 Kibana。

Kibana 是一款开源的数据分析可视化平台,他是 ElasticSearch 成员之一,用于和 ElasticSearch 协作。我们可以通过 Kibana 对 ElasticSearch 索引中的数据进行搜索、查看和交互。可以很方便的利用图表、表格以及地图对数据进行多元化的分析和呈现。

Kibana 可以使大数据通俗易懂。它很简单,基于浏览器的界面使得可以快速创建和分享动态数据仪表板来追踪 ElasticSearch 的实时数据变化。

搭建 Kibana 也非常简单。通过他的镜像自带的容器就可以实现安装,并不需要额外的代码和设施。

2.2 Kibana 下载安装

  1. 镜像下载
docker pull docker.io/kibana:5.6.8
  1. 安装 kibana 容器
docker run -it -d -e ELASTICSEARCH_URL=http://192.168.198.100:9200 --name
kibana -p 5601:5601 kibana:5.6.8

ELASTICSEARCH_URL=http://192.168.198.100:9200 是指链接的 ElasticSearch 地址。5601 是访问端口。

  1. 部分快捷键
ctrl+i ⾃动缩进
ctrl+enter 提交请求
down 打开⾃动补全菜单
enter或tab 选中项⾃动补全
esc 关闭补全菜单
    1. 测试
# 根据自己的实际的 地址和端口进行访问
http://192.168.198.100:5601/

在这里插入图片描述

2.3 Kibana 使用

2.3.1 配置索引

使用 Kibana 时,必须至少配置一个索引。索引用于标识 ElasticSearch 以运行搜索、分析和配置字段。
在这里插入图片描述
我们修改索引名称的匹配方式即可,下面两个选项不用勾选。然后点击 create,会展示出当前配置的索引的域信息;

我们在刚进来的时候是看不到 create 的按钮的(因为默认的匹配规则 logstash-* 在我们的 ElasticSearch 中匹配不到信息),当我们在 Index pattern 的输入框中输入我们要连接的索引后,就会出现 create 按钮
在这里插入图片描述
我们创建之后,就能看到对应的索引的信息了
在这里插入图片描述

域的每个标题选项分别代表如下意思:
在这里插入图片描述

2.3.2 数据搜索

Discover 为数据搜索部分,可以对日志信息进行搜索操作。
在这里插入图片描述

可以使⽤Discover实现数据搜索过滤和搜索条件显⽰以及关键词搜索:
在这里插入图片描述

2.3.3 DSL 语句

2.3.3.1 Query DSL 结构化查询介绍

Query DSL 是一个 JAVA 开源框架,用于构建类型安全的 SQL 查询语句。采用 API 代替传统的拼接字符串来构造查询语句。目前 Query DSL 支持的平台包括 JPA、JDO、SQL、Java Collections、RDF、Lucene、Hibernate Search。ElasticSearch 提供了一整套基于 JSON 的 DSL 语言来定义查询。

2.3.3.2 索引操作
  1. 查询所有索引
GET /_cat/indices?v

在这里插入图片描述
2. 删除某个索引

DELETE /blog1  # DELETE 索引名称

在这里插入图片描述

  1. 新增索引
PUT /user

在这里插入图片描述

  1. 创建映射
PUT /user/userinfo/_mapping 
{
 "properties": {
   "name": {
     "type": "text",
     "analyzer": "ik_smart",
     "search_analyzer": "ik_smart"
   },
   "city": {
     "type": "text",
     "analyzer": "ik_smart",
     "search_analyzer": "ik_smart"
   },
   "age": {
     "type": "long"
   },
   "description": {
     "type": "text",
     "analyzer": "ik_smart",
     "search_analyzer": "ik_smart"
   }
 }
}

在这里插入图片描述
5. 新增文档数据

PUT /user/userinfo/1
{
  "name": "李四",
  "age": 22,
  "city": "北京",
  "description": "李四来自湖北武汉 "
}

在这里插入图片描述
在增加几条数据:

# 新增⽂档数据 id=2
PUT /user/userinfo/2
{
 "name":"王五",
 "age":35,
 "city":"深圳",
 "description":"王五家住在深圳!"
}
#新增⽂档数据 id=3
PUT /user/userinfo/3
{
 "name":"张三",
 "age":19,
 "city":"深圳",
 "description":"在深圳打⼯,来⾃湖北武汉"
}
#新增⽂档数据 id=4
PUT /user/userinfo/4
{
 "name":"张三丰",
 "age":66,
 "city":"武汉",
 "description":"在武汉读书,家在武汉!"
}
#新增⽂档数据 id=5
PUT /user/userinfo/5
{
 "name":"赵⼦⻰",
 "age":77,
 "city":"⼴州",
 "description":"赵⼦⻰来⾃深圳宝安,但是在⼴州⼯作!",
 "address":"⼴东省茂名市"
}
#新增⽂档数据 id=6
PUT /user/userinfo/6
{
 "name":"赵毅",
 "age":55,
 "city":"⼴州",
 "description":"赵毅来⾃⼴州⽩云区,从事电⼦商务8年!"
}
#新增⽂档数据 id=7
PUT /user/userinfo/7
{
 "name":"赵哈哈",
 "age":57,
 "city":"武汉",
 "description":"武汉赵哈哈,在深圳打⼯已有半年了,⽉薪7500!"
}
  1. 修改数据
    a. 替换操作
    更新数据可以使用之前的增加操作,,这种操作回将数据整个替换:
#更新数据,id=4
PUT /user/userinfo/4
{
 "name":"张三丰",
 "description":"在武汉读书,家在武汉!在深圳⼯作!"
}

在这里插入图片描述
在查看一下数据:
在这里插入图片描述
b. 替换操作:
使用 POST 更新某个列数据
在这里插入图片描述
再使用 GET 命令查询一下数据:
在这里插入图片描述
7. 删除 Document

DELETE /user/userinfo/7

在这里插入图片描述

2.3.3.3 数据查询
  1. 查询所有数据
GET /user/_search

在这里插入图片描述
2. 根据 ID 查询

GET /user/userinfo/3

在这里插入图片描述
3. sort 排序

GET /user/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

在这里插入图片描述

  1. 分页
    from:从第 N 条记录开始查询;
    size:每页显示的数量
GET /user/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 2
}

在这里插入图片描述

2.3.3.4 查询模式
  1. term 查询
    term 主要用于分词精确匹配,如字符串、数值、日期等。但不适用于 (1)列中除英文字符外还有其他值; (2)字符串值中有冒号或者中文; (3)系统自带属性(如 _version)
GET _search 
{
  "query": {
    "term": {
      "city": {
        "value": "深圳"
      }
    }
  }
}

在这里插入图片描述
2. terms 查询
terms 和 term 有点相似,但是 terms 可以指定多个匹配条件。如果某个字段制定了多个值,那么文档需要一起做匹配

GET _search
{
  "query": {
    "terms": {
      "city": [
        "北京",
        "深圳"
      ]
    }
  }
}

在这里插入图片描述
3. match 查询
会对我们的查询语句进行匹配

{
  "query": {
    "match": {
      "city": "深圳北京"
    }
  }
}

在这里插入图片描述

  1. query_string 查询
GET _search
{
  "query": {
    "query_string": {
      "default_field": "city",
      "query": "深圳北京"
    }
  }
}

在这里插入图片描述
5. range 查询

# range:表示过滤范围
# gt 表示 >;  gte 表示 >=
# lt 表示 <;  lte 表示 <=
GET _search
{
  "query": {
    "range": {
      "age": {
        "gte": 30,
        "lte": 50
      }
    }
  }
}

在这里插入图片描述

  1. exists 查询
    exists 过滤可以用于查找拥有某个域的数据:
GET _search
{
  "query": {
    "exists": {
      "field": "address"
    }
  }
}

在这里插入图片描述
7. bool 查询
bool 可以用来合并多个查询条件的布尔逻辑值;它包含以下操作符:

  • must:多个查询条件的完全匹配,相当于 and;
  • must_not:多个查询条件的相反匹配,相当于 not;
  • should:至少有一个查询条件匹配,相当于 or。

这些参数可以分别继承一个过滤条件或者一个过滤条件的数组。

GET _search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "city": {
              "value": "深圳"
            }
          }
        },
        {
          "range": {
            "age": {
              "gte": 10,
              "lte": 20
            }
          }
        }
      ]
    }
  }
}

在这里插入图片描述
8. match_all 查询
可以查询到所有文档,是没有查询条件下的你默认语句;

GET _search
{
  "query": {
    "match_all": {}
  }
}

在这里插入图片描述

  1. match 查询
    match 查询是一个标准查询,不管你需要全文本查询还是精确查询,及本省都需要用到它。
    如果使用 match 查询一个全文本字段,他会在真正查询之前,先通过分析器分析 match 以下要查询的字符:
GET _search
{
  "query": {
    "match": {
      "city": "北京"
    }
  }
}

在这里插入图片描述

  1. prefix 查询
    以 某字符开头 的,可以更简单的使用 prefix ,例如:查询所有以 张 开始的用户描述:
GET  _search
{
  "query": {
    "prefix": {
      "name": {
        "value": "赵"
      }
    }
  }
}

在这里插入图片描述
11. multi_match 查询
multi_match 查询允许允许在做 match 查询的基础上同时搜索多个字段,在多个字段(域)中同时查一个:

GET _search
{
  "query": {
    "multi_match": {
      "query": "深圳",
      "fields": [
        "city",
        "description"
        ]
    }
  }
}

在这里插入图片描述

2.2.3.5 完整 DSL 语句代码
# 查看所有索引
GET /_cat/indices?v

# 删除 skuinfo 索引
DELETE /skuinfo

# 新增 user 索引
PUT /user

# 创建 userinfo 映射
PUT /user/userinfo/_mapping 
{
  "properties": {
    "name": {
      "type": "text",
      "analyzer": "ik_smart",
      "search_analyzer": "ik_smart"
    },
    "city": {
      "type": "text",
      "analyzer": "ik_smart",
      "search_analyzer": "ik_smart"
    },
    "age": {
      "type": "long"
    },
    "description": {
      "type": "text",
      "analyzer": "ik_smart",
      "search_analyzer": "ik_smart"
    }
  }
}


# 新增文档 user 中的 id 为 1 的文档
# 更新文档 
PUT /user/userinfo/1
{
  "name": "李四",
  "age": 22,
  "city": "北京",
  "description": "李四来自湖北武汉 "
}


# 根据 id 查询,查询 id=4 的文档数据
GET user/userinfo/4

 # 更新 id=4 的文档信息
POST /user/userinfo/4/_update
{
  "doc": {
    "name": "张三丰1",
    "description": "在武汉读书,家在武汉!在深圳⼯作........."
  }
}    

#删除数据
DELETE user/userinfo/4

#查询所有
GET /user/_search

#搜索排序
GET /user/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

#分⻚实现
GET /user/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 2
}


#查询-term
# term 查询 
GET _search 
{
  "query": {
    "term": {
      "city": {
        "value": "深圳"
      }
    }
  }
}

#查询-terms 允许多个Term
GET _search
{
  "query": {
    "terms": {
      "city": [
        "北京",
        "深圳"
      ]
    }
  }
}

# match查询
GET _search
{
  "query": {
    "match": {
      "city": "深圳北京"
    }
  }
}

# query_string
GET _search
{
  "query": {
    "query_string": {
      "default_field": "city",
      "query": "深圳北京"
    }
  }
}


#过滤-range 范围过滤
#gt表示> gte表示=>
#lt表示< lte表示<=
GET _search
{
  "query": {
    "range": {
      "age": {
        "gte": 30,
        "lte": 50
      }
    }
  }
}

#过滤搜索 exists:是指包含某个域的数据检索
GET _search
{
  "query": {
    "exists": {
      "field": "address"
    }
  }
}

#过滤搜索 bool
#must : 多个查询条件的完全匹配,相当于 and。
#must_not : 多个查询条件的相反匹配,相当于 not。
#should : ⾄少有⼀个查询条件匹配, 相当于 or。
GET _search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "city": {
              "value": "深圳"
            }
          }
        },
        {
          "range": {
            "age": {
              "gte": 10,
              "lte": 20
            }
          }
        }
      ]
    }
  }
}

#查询所有 match_all
GET _search
{
  "query": {
    "match_all": {}
  }
}

#字符串匹配
GET _search
{
  "query": {
    "match": {
      "city": "北京"
    }
  }
}

#前缀匹配 prefix
GET  _search
{
  "query": {
    "prefix": {
      "name": {
        "value": "赵"
      }
    }
  }
}

#多个域匹配搜索
GET _search
{
  "query": {
    "multi_match": {
      "query": "深圳",
      "fields": [
        "city",
        "description"
        ]
    }
  }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值