目录
=== 1、什么是elasticsearch
——1、搜索引擎干了什么
——2、elasticsearch 如何提供搜索服务
——3、elasticsearch 中的restful接口、索引、分词器、类型mapping
=== 2、索引的操作
——1、创建、删除索引
——2、索引对数据项的字段类型mapping
——3、在kibana中查看和管理索引
=== 3、数据的操作
——1、restfull接口的插入、删除数据项
——2、restfull接口的查询、批量查询、聚合查询、复合查询、过滤查询
——3、python的客户端sdk 对数据条目的增、删、改、查
=== 4、kibana的可视化数据
——1、kibana的功能简介
——2、kibana的索引管理和数据查询
——3、kibana添加饼图、柱状图、折线图并选取数据
——4、kibana在dashboard中展示可视化统计数据
1、什么是elasticsearch
1、搜索引擎干了什么
思考一下:
(1)百度搜索、谷歌搜索、必应搜索,是怎么通过我们输入的关键词找到相关的文字链接的呢 ?
(2) 搜索引擎怎么知道哪些文章里有我想要的信息?
(3) 搜索引擎怎么去找到的这些文章?
(4) 搜索引擎怎么在那么短(毫秒级)时间内检索那么多文章?
我们不去做搜索引擎,也不必详细知道百度内部是什么架构,用的什么核心技术。但是我们可以通过相关知识的探索大致知道,搜索引擎实现的逻辑是怎么样的,以百度为例:
首先,当有新的网页、博客、帖子被提交发布,百度的爬虫服务器就把这些新的网页信息下载到百度的云主机上,这个动作也可能是定期的,保障搜索的最新内容。
然后,下载下来的网页内容,根据标题、主体内容等文本信息,提取分词、关键词。并通过建立类似数据库索引的方式,提高这些关键词的搜索效率。
最后,当你在网页输入 要查找的关键词,百度的搜索服务器会根据关键词检索,所有有关的文档,根据关键词出现的频率、关键词相似程度,给出排序后的文档链接。
当然,百度也就可以修改排序置顶的顺序来达到广告植入的收益。
那么,里面涉及到的几个关键的地方:第一,定期爬取全网修改或者新发的文档;第二,文档内容分词和关键词建立高速索引;第三,通过关键词查询索引。
2、elasticsearch 如何提供搜索服务
elasticsearch 的设计初始 根据搜索引擎lucence,据说是一个外国佬为老婆简化查找菜谱做的(映像野史)。
elasticsearch的内部,也有分词器,插件化的,有语法分词器、中文分词器、特定语义分词器等等,灵活的保留了文档的关键字的意义。
elasticsearch的内部,也有索引,类似于mysql的表结构,有索引名称、索引类型、索引字段及类型,也可以通过gmapping设定将某个值映射为某个类型。
elasticsearch的内部,有索引倒排。大概就是说 哪个条目有哪些索引,搜索的时候比重多少,主要是在对索引名称查找到数据之后,根据各个字段来聚合或者过滤,具体不再展开。
3、elasticsearch 中的restful接口、索引、分词器、类型mapping
满足restful的接口规范,使用 put、get、post、delete发送json格式的请求,并得到json的响应。
可以通过restful的接口,设置索引,然后添加条目。(可以理解创建表、插入表数据项)
也有一个修改、删除的接口。但不是我们关心的重点,生产环境大多数不会去把他仅仅当做数据库使用,那样干嘛不直接选择关系型数据库或者k-v数据库。
生产环境中,大家更加在意的是,elasticsearch集成了大规模数据存储(分布式的),索引查询,kibana的可视化数据统计的功能。能够很少工作量的情况下,拿到直观的统计图表信息。
举几个例子:
淘宝网希望看看,全国在线销售苹果的销量在各个地区的分别情况,那么kibana的热力图可以直观查看。
淘宝网希望看看,近半年来苹果手机在线成交情况的按半月统计的数据,那么kibana的柱状图能直接查询到。
这些,只需要在产生数据的源头,往elastic插入信息条目,然后通过查询索引获得图表。
传统的数据库,需要建立复杂的关系表系统存储数据,查询结果再单独做一个chart的页面来展示,费时费力。
2、索引的操作
https://www.elastic.co/guide/en/kibana/7.6/managing-indices.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.6/indices.html
(版本差异很大,确定好自己用到版本再看api)
以下操作建议多在kibana的tools里面完成,或者postman。
1、创建、删除索引
// 一般创建索引会指定 分片和副本数量, 以及数据条目中字段的类型、分词方式
PUT /my_index_name
{
settings:
{
"number_of_shards":3, // 分片
"number_of_replicas":0, // 副本
},
mappings:
{
“index_type1”:{"properties":{...}}
“index_type2”:{"properties":{...}}
}
}
GET /my_index_name/_settings // 查询索引配置
GET _all/_settings // 查询所有索引配置
DELETE /my_index_name // 删除索引, 类似于删除表(表项都会丢)
2、索引对数据项的字段类型mapping
主要是在指定条目的字段类型,默认情况下,数字是long,带小数是double,除了date外,其他的都是string。
其中string 分为text 和keyword 。区别在于 text 会被分词,keyword 不会分词。影响检索时的最小词粒度。
还有一些其他的mapping配置项,store选项、分词器类型、boost字段分数加权、ignore_above超长文本忽略分词和索引、index可否索引选择项等等。
进阶项为动态mapping,此处不做展开。我也不会。
一个比较简单的例子, ik中文分词器的设置(ik_smart 分词少,ik_max_word分词多),keword和text的区别,嵌套object的数据类型,日期的格式format
PUT books
{
"mappings": {
"properties":{
"title":{
"type":"text",
"analyzer": "ik_max_word"
},
"price":{
"type":"integer"
},
"addr":{
"type":"keyword"
},
"company":{
"properties":{
"name":{"type":"text"},
"company_addr":{"type":"text"},
"employee_count":{"type":"integer"}
}
},
"publish_date":{"type":"date","format":"yyy-MM-dd"}
}
}
}
直接插入, 会自动创建的mapping, 但是非常不推荐这样做
PUT /lib/person/1
{
''name'':"tom",
"age":25,
"address":{
"country":"china",
"city":"wuhan"
}
} // 直接插入, 会自动创建的mapping
GET /lib/persion/_mapping // 查询索引的mapping
// 手动创建mapping ,主要是date类型, string的text,keyword区别
// 可以 根据查询出来的mapping 拷贝出来,修改指定的字段类型
“properties”:{
"title":{"type":"text"},
"name":{"type":"text", "analyzer":"standard"}, // 标准分词器
"date":{"type":"date", "index":false}, // 不会被索引, 默认每个字段都会建立倒排索引。
}
3、在kibana中查看和管理索引
https://www.elastic.co/guide/en/kibana/7.6/managing-indices.html
kibana中的索引有索引模板、索引的配置settings,索引的类型映射,索引的状态和统计。
提供了索引管理的API 和 索引模板的API,此处不再缀述。
3、数据的操作
1、restfull接口的插入、删除数据项
PUT /my_index_name/my_index_type/index_id
{
} // 指定 _id 的情况下,用put是插入 ,或者覆盖更新
POST /my_index_name/my_index_type
{
} // 不指定ID的情况下,使用post插入,由es自动生生成_id
GET /my_index_name/my_index_type/index_id // 已知id查询
POST /my_index_name/my_index_type/index_id/_update
{
}// 对指定字段的更新
DELETE /my_index_name/my_index_type/index_id // 仅仅删除已知id的条目
2、restfull接口的查询、批量查询、聚合查询、复合查询、过滤查询
查询操作是最核心的部分,实际应用中更新和删除操作很少,主要就是插入大量数据后,做查询和展示。
// 基本查询
// 索引和类型映射说明
PUT /lib/user/2
{
"name":"zhangsan",
"age":24,
"birthday":"1998-12-12"
"interests":"guitar,baskitball,haking"
}
// query查询(基本查询)
GET /lib/user/_search?q+name:zhangsan
GET /lib/user/_search?+interests:guitar&sort=age:desc // 爱好有guitar ,按照age排序
// term terms 查询, 不知道分词器
GET /lib/user/_search {“query”:{"term":{"name":"zhangsan"}}}
GET /lib/user/_search {“query”:{"terms":{"interests":["guitar","haking"]}}}
// match match_phrase match_phrase_pretix查询, 知道分词器
GET /lib/user/_search {“query”:{"match":{"name":"zhangsan lisi"}}} // 会查出名字包含zhangsan 或者lisi的, 使用term/terms 查不到内容
GET /lib/user/_search {"query":{"match_all":{}}} // 查询所有记录
GET /lib/user/_search {
“_source”:["name", "address"], // 查询结果带哪些字段, 也可用 include exclude 控制。
"query":{"match_all":{}},
"range":{"age":{"from":20, "to":25}}, // 查询范围
“sort”:{"age":{"order":"desc"}}, // 查询结果根据字段排序
} // 查询所有记录
// 模糊查询 通配符 fuzzy wildcard
.... 找些例子
// filter 过滤查询
// filter 查询不计算相关性, 速度快于query。
1、简单过滤查询
2、bool过滤查询、嵌套bool过滤
// 聚合查询, 求平均值、最大值、最小值、sum、count
GET /lib/iterms/_search
{
"eggs":{
"price_of_sum":{"sum":{"field":"price"}}
}
}
// 复合查询
不例举了,麻烦
3、python的客户端sdk 对数据条目的增、删、改、查
pip install elasticsearch
import elasticsearch
...
4、kibana的可视化数据
1、kibana的功能简介
kibana 可以理解为 es的客户端,es提供存储和高效检索数据的服务,kibana将es的服务功能和配置可视化。
kibana 可以可视化配置索引:索引的mapping、setting,可以查看索引的状态和统计。
kibana 可以查询数据,query查询、filter查询、聚合查询等,tools工具栏能干几乎所有restful接口的事情
kibana 可以可视化数据, 将查询的结果用图标展示,自定义dashboard显示。
附加的其他功能,大数据分析和集成了深度学习,集成了监控和告警,各种格式的生产日志的采集。还有些像APM、SIEM一堆看似...看都不想看的功能(我理解不把东西做到平民化就是设计的根本缺陷,这个功能就废了)
2、kibana的索引管理和数据查询
image.pngimage.png
3、kibana添加饼图、柱状图、折线图并选取数据
查看官网教程
4、kibana在dashboard中展示可视化统计数据
查看官网教程
网友评论