es基本原理及使用kibana操作es的常见命令
一、es的基本原理与基础概念
1.1 倒排索引
倒排索引
源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted
index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。
如图
1.2 索引 index
一个索引就是一个拥有几分相似特征的文档的集合。比如说,可以有一个客户 数据的索引,另一个产品目录的索引,还有一个订单数据的索引
一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应 于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字类似于mysql中的库的概念,不同的是es的数据是存于索引,mysql是存于库下面的表
1.3 集群Cluster
一个集群就是由一个或多个服务器节点组织在一起,共同持有整个的数据,并一起提供索引和搜索功能。一个Elasticsearch集群有一个唯一的名字标识,这个名字默认就是”elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。
1.4 节点Node
集群中包含很多服务器,一个节点就是其中的一个服务器。作为集群的一部分,它存储数据,参与集群的索引和搜索功能
1.5 分片
分片一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文
档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点 处理搜索请求,响应太慢 为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫 做分片当创建一个索引的时候,可以指定你想要的分片的数量 每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置 到集群中的任何节点上 分片很重要,主要有两方面的原因
1.允许水平分割/扩展你的内容容量
2.允许在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量
原则:分片数要配置成集群节点数的倍数,且不超过3倍,业务索引每个分片不超过30GB。
1.6 副本
在一个网络 /
云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片(副本)。
副本之所以重要,有两个主要原因 1) 在分片/节点失败的情况下,提供了高可用性。
注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非 常重要的 2)
扩展搜索量/吞吐量,因为搜索可以在所有的副本上并行运行 每个索引可以被分成多个分片。一个索引有0个或者多个副本
一旦设置了副本,每个索引就有了主分片和副本分片,分片和副本的数量可以 在索引在索引创建之后,可以在任何时候动态地改变副本的数量,但是不能改变分片的数量,也就是创建索引的时候就创建分片
例如:某es集群有3个节点
PUT eslog
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
}
}
1.7 映射(Mapping)
mapping是处理数据的方式和规则方面做一些限制,如:某个字段的数据类型、默认值、分析器、是否被索引等等。这些都是映射里面可以设置的,其它就是处理ES里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。
GET my_index/_mapping
设置
创建新的索引并设置mapping信息
PUT user
{
"mappings": {
"properties": {
"address": {
"type": "text",
"index": false
},
"age": {
"type": "long"
},
"name": {
"type": "text"
}
}
}
1.8 字段类型
es字段类型设置可选为
keyword与text的区别
keyword 映射 只能精准查询, 不能分词查询,能聚合、 排序、过滤。term是精确查找,但只支持keyword类型
text 映射 能模糊查询, 能分词查询,不能聚合、排 序
二、使用kibana操作es的常见命令
2.1 基础命令
#所有节点
GET /_cat/nodes/
#查看主节点GET /_cat/master
#查看健康状况GET /_cat/health
#查看所有索引GET /_cat/indices
#查看所有索引及数据量GET /_cat/indices?v
#查看索引数据GET /eslog/_search
结果说明:
#查看分词器装没有
#最大分词GET _analyze { "analyzer":"ik_max_word", "text":"我是中国人" }
#最小分词GET _analyze { "analyzer":"ik_smart", "text":"我是中国人" }
#所有节点GET /_cat/nodes/
dilmrt代表全部权限
添加索引PUT /eslog
删除索引DELETE /eslog
查看索引GET /eslog
创建索引并指定字段类型及分词类型:
PUT user
{
"mappings": {
"properties": {
"address": {
# keyword类型不能指定分词类型,因为它存的是一个整体,不能分词搜索
"type": "keyword"
},
"age": {
"type": "long"
},
"name": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
2.2 索引数据的操作
2.2.1 建立索引并插入数据
创建索引,并插入数据
PUT /eslog
POST /eslog/_doc
{ "name": "长沙",
"sex": 0,
"age": 19,
"address": "长沙岳麓山"
}
2.22 索引数据的增删改查
1、当前索引 doc类型的所有文档
GET /eslog/_search
格式:
GET /索引名称/类型/_search举例:
GET /eslog/_search类似:
SQL: select * from eslog
#2、条件查询, 如要查询age等于28岁的 _search?q=:**
GET /eslog/_search?q=age:25
格式:
GET /索引名称/类型/_search?q=:**举例:
GET /es_db/_search?q=age:28类似:
SQL: select * from student where age = 28
3、范围查询, 如要查询age在25至26岁之间的 _search?q=[
**
TO**
] 注 意: TO 必须为大写GET /eslog/_doc/_search?q=age[25 TO 26]
格式:
GET /索引名称/类型/_search?q=***[25 TO 26]举例:
GET /es_db/_search?q=age[25 TO 26]类似:
SQL: select * from student where age between 25 and 26
4、根据多个ID进行批量查询 _mget ,注意:这里的id是指es的生成的id(若未指定)不是数据里的id
GET /eslog/_mget { "ids":["3","2"] }
格式:
GET /索引名称/类型/_mget举例:
GET /es_db/_mget { “ids”:[“1”,“2”] }类似:
SQL: select * from student where id in (1,2)
5、查询年龄小于等于28岁的 :<= (同理:>,<,>=,<=)
GET /eslog/_search?q=age:<=28
格式:
GET /索引名称/类型/_search?q=age:<=**举例:
GET /es_db/_search?q=age:<=28类似:
SQL: select * from student where age <= 28
6、分页查询 from=&size= (注意:from+size不能超过10000(默认值,可以手动修改))
GET /eslog/_search?q=age[25 TO 26]&from=0&size=1
格式:
GET /索引名称/类型/_search?q=age[25 TO 26]&from=0&size=1举例:
GET/es_db/_search?q=age[25 TO 26]&from=0&size=1类似:
SQL: select * from student where age between 25 and 26 limit 0, 1
7、对查询结果只输出某些字段 _source=字段,字段
GET /eslog/_search?_source=name,age
格式:
GET /索引名称/类型/_search?_source=字段,字段举例:
GET /es_db/_search?_source=name,age类似:
SQL: select name,age from student
8、对查询结果排序 sort=字段:desc/asc
GET /eslog/_search?sort=age:asc
格式:
GET /索引名称/类型/_search?sort=字段 desc类似:
SQL: select * from student order by age desc
2.23 DSL语言高级查询
1、
term
根据名称精确查询姓名 term, term查询不会对字段进行分词查询,会 采用精确匹配 注意: 采用term精确查询, 查询字段映射类型属于为keyword
POST /eslog/_search {
"query":
{ "term":
{
"name": "admin"
}
}
}
类似: SQL: select * from student where name = 'admin'
1.1 多关键字精确查询
POST /eslog/_search
{
"query": {
"terms": {
"name": ["zhangsan","lisi"]
}
}
}
类似: SQL: select * from student where name in ('zhangsan','lisi')
2、
match
根据备注信息模糊查询 match, match会根据该字段的分词器,进行分 词查询,多个词条之间是or的关系
POST /eslog/_search
{
"from": 0,
"size": 2,
"query": {
"match": {
"address": "广州"
}
}
}
类似: SQL: select * from user where address like '%广州%' limit 0, 2
3、
multi_match
多字段模糊匹配查询与精准查询 multi_match
POST /eslog/_search
{
"query":{
"multi_match":{
"query":"长沙",
"fields":["address","name"]
}
}
}
类似:SQL: select * from student where name like '%长沙%' or address like '%长沙%'
注:json请求字符串中部分字段的含义
range:范围关键字
gte 大于等于
lte 小于等于
gt 大于
lt 小于
now 当前时间
range
范围查询
POST /eslog/_search
{
"query" : {
"range" : {
"age" : {
"gte":25,
"lte":28
}
}
}
}
类似于:SQL: select * from user where age between 25 and 28
5.
from+ size
分页、输出字段、排序综合查询
POST /eslog/_search
{
"query" : {
"range" : {
"age" : {
"gte":25,
"lte":28
}
}
},
"from": 0,
"size": 2,
"_source": ["name", "age", "book"],
"sort": {"age":"desc"}
}
filter
过滤器方式查询,它的查询不会计算相关性分值,也不会对结果 进行排序, 因此效率会高一点,查询的结果可以被缓存。
POST /eslog/_search
{
"query" : {
"bool" : {
"filter" : {
"term":{
"age":25
}
}
}
}
}
_delete_by_query
按条件删除
POST eslog/_delete_by_query
{
"query":{
"match":{
"sensorName":"一体化设备"
}
}
}
8.
bool/filter/range
复杂删除里面的条件跟查询条件一样的,例如按时间范围删除
POST eslog/_delete_by_query
{
"query":{
"bool":{
"filter":[
{
"range":{
"loginTimeMills":{
"from":1628004803000,
"to":1629957806000
}
}
}
]
}
}
}
keyword 与 text 映射类型的区别
将 book 字段设置为 keyword 映射 (只能精准查询, 不能分词查询,能聚合、 排序、过滤)将 book 字段设置为 text 映射 (能模糊查询, 能分词查询,不能聚合、排 序)。
#查看es索引字段的类型(keyword或者text)GET /eslog/_mapping?pretty
9.过滤返回字段
includes
:来指定想要显示的字段excludes
:来指定不想要显示的字段
POST /eslog/_search{
"_source": {
"includes": ["name","nickname"]
},
"query": {
"terms": {
"nickname": ["zhangsan"]
}
}
}
10 .
bool
组合查询bool
把各种其它查询通过must
(必须 )、must_not
(必须不)、should
(应该)的方式进行组合
POST /student/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "zhangsan"
}
}
],
"must_not": [
{
"match": {
"age": "40"
}
}
],
"should": [
{
"match": {
"sex": "男"
}
}
]
}
}
}
11.模糊查询
fuzzy
返回包含与搜索字词相似的字词的文档。
编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括:
更改字符(box → fox)
删除字符(black → lack)
插入字符(sic → sick)
转置两个相邻字符(act → cat)
fuzzy 查询会用到两个很重要的参数,fuzziness
:表示输入的关键字通过几次操作可以转变成为ES库里面的对应field的字段
操作是指:新增一个字符,删除一个字符,修改一个字符,每次操作可以记做编辑距离为1,如中文集团到中威集团编辑距离就是1,只需要修改一个字符;该参数默认值为0,即不开启模糊查询,同样,如果fuzziness值在这里设置成2,会把编辑距离为2的东东集团也抓出来。prefix_length
:表示限制输入关键字和ES对应查询field的内容开头的第n个字符必须完全匹配,不允许错别字匹配。如这里等于1,则表示开头的中字必须匹配,不匹配则不返回,默认值也是0。加大prefix_length的值可以提高效率和准确率。
GET /eslog/_search
{
"query": {
"fuzzy": {
"address": {
"value": "广州",
"fuzziness": 1
}
}
}
}
12.排序
sort
sort 可以让我们按照不同的字段进行排序,并且通过order指定排序的方式。desc降序,asc升序。
GET /eslog/_search
{
"query": {
"match": {
"address": "广州"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
13.高亮查询
highlight
在使用match查询的同时,加上一个highlight属性:
pre_tags:前置标签
post_tags:后置标签
fields:需要高亮的字段
title:这里声明title字段需要高亮,后面可以为这个字段设
fragment_size :指定高亮数据展示多少个字符回来
GET /eslog/_search
{
"query": {
"match": {
"address": "广州"
}
},
"highlight": {
"pre_tags": "<font color='red'>",
"post_tags": "</font>",
"fields": {
"address": {}
}
}
}
14 短语查询
match_phrase
对要查询的句子短语作为整体去模糊查询,采用短语查询才得行(matchPhraseQuery)
GET eslog/_search
{
"query":{
"match_phrase":{
"address":"白云山"
}
}
}
15 字段超长的数据
比如吧我要查询索引中的某些字段的长度大于20的全部数据,在数据清洗时常常要求删除字段长度大于多少的数据。怎么整?
GET eslog/_search
{
"query": {
"bool": {
"filter":{
"script": {
"script":{
"source" : "doc['address.keyword'].value.length()>20",
"lang" : "painless"
}
}
}
}
}
}
16 设置它的默认值
max_result_window
的值
注意:es使用from +size处理分页问题时,会将所有数据全部取出来,然后再截取指定范围的数据返回,所以当数据量较大时,这种机制会存在内存溢出的可能,所以谨慎
使用。
PUT /eslog/_settings
{
"index":{
"max_result_window":999999999
}
}
17 es聚合分组,组数过多解决办法
问题: trying to create too many buckets.must be less than or equal to :[20000] but was [86391].this limit can be set
by changing the [search.max_buckets] clusterlevel setting.
原因:es7版本之后默认支持最大分桶为65535,如果大于这个值,则不会查询到数据,所以可以将这个值设置更大文章来源:https://www.toymoban.com/news/detail-526983.html
# 临时解决办法(重启es会回到默认值):
PUT _cluster/settings
{
"transient":{
"search.max_buckets":100000
}
}
# 永久解决方法
PUT /_cluster/settings
{
"persistent": {
"search.max_buckets": 1000000
}
}
18 根据es的_id查询
ids查询
文章来源地址https://www.toymoban.com/news/detail-526983.html
POST /eslog/_search
{
"query": {
"ids": {
"values": ["oI9GVHQBH0SEUrtlhvX7","oY9HVHQBH0SEUrtlaPUO"]
}
}
}
到了这里,关于elasticsearch 7.9.3知识归纳整理(二)之 es基本原理及使用kibana操作es的常见命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!