文章目录
前言
在了解过 ElasticSearch 的基础和基本的对外提供的接口之后,我接触了 IK分词器和 Kibana 工具。提示:以下是本篇文章正文内容,下面案例可供参考
一、IK 分词器
1.1 简介
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开 始,IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词和 文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于 Lucene项目,同时提供了对Lucene的默认优化实现。
IK分词器3.0的特性如下:
- 采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。 ;
- 采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科 学计数法),中文词汇(姓名、地名处理)等分词处理;
- 对中英联合支持不是很好,在这方面的处理 比较麻烦.需再做一次查询,同时是支持个人词条的优化的词典存储,更小的内存占用;
- 支持用户词 典扩展定义 ;
- 针对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
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=我是程序员
总结:
- ik_max_word:会将文本做最细粒度的拆分;
比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂”等词语; - ik_smart:会做最粗粒度的划分;
比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、人民大会堂”。
二、Kibana 使用 — 掌握 DSL 语句
2.1 简介
我们原来使用过 elasticsearch-header 插件实现数据查找的,但是 elasticsearch-header 的功能比较单一,因此引入一个更加专业的工具实现对日志的实时分析。就是 Kibana。
Kibana 是一款开源的数据分析可视化平台,他是 ElasticSearch 成员之一,用于和 ElasticSearch 协作。我们可以通过 Kibana 对 ElasticSearch 索引中的数据进行搜索、查看和交互。可以很方便的利用图表、表格以及地图对数据进行多元化的分析和呈现。
Kibana 可以使大数据通俗易懂。它很简单,基于浏览器的界面使得可以快速创建和分享动态数据仪表板来追踪 ElasticSearch 的实时数据变化。
搭建 Kibana 也非常简单。通过他的镜像自带的容器就可以实现安装,并不需要额外的代码和设施。
2.2 Kibana 下载安装
- 镜像下载
docker pull docker.io/kibana:5.6.8
- 安装 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 是访问端口。
- 部分快捷键
ctrl+i ⾃动缩进
ctrl+enter 提交请求
down 打开⾃动补全菜单
enter或tab 选中项⾃动补全
esc 关闭补全菜单
-
- 测试
# 根据自己的实际的 地址和端口进行访问
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 索引操作
- 查询所有索引
GET /_cat/indices?v
2. 删除某个索引
DELETE /blog1 # DELETE 索引名称
- 新增索引
PUT /user
- 创建映射
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!"
}
- 修改数据
a. 替换操作
更新数据可以使用之前的增加操作,,这种操作回将数据整个替换:
#更新数据,id=4
PUT /user/userinfo/4
{
"name":"张三丰",
"description":"在武汉读书,家在武汉!在深圳⼯作!"
}
在查看一下数据:
b. 替换操作:
使用 POST 更新某个列数据
再使用 GET 命令查询一下数据:
7. 删除 Document
DELETE /user/userinfo/7
2.3.3.3 数据查询
- 查询所有数据
GET /user/_search
2. 根据 ID 查询
GET /user/userinfo/3
3. sort 排序
GET /user/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
- 分页
from:从第 N 条记录开始查询;
size:每页显示的数量
GET /user/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
],
"from": 0,
"size": 2
}
2.3.3.4 查询模式
- 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": "深圳北京"
}
}
}
- 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
}
}
}
}
- 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": {}
}
}
- match 查询
match 查询是一个标准查询,不管你需要全文本查询还是精确查询,及本省都需要用到它。
如果使用 match 查询一个全文本字段,他会在真正查询之前,先通过分析器分析 match 以下要查询的字符:
GET _search
{
"query": {
"match": {
"city": "北京"
}
}
}
- 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"
]
}
}
}