IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Elasticsearch基础知识 -> 正文阅读

[大数据]Elasticsearch基础知识

1、我们都知道Elasticsearch是一个实时分布式搜索和分析引擎,是面向文档类型的。
首先我们先看一下关系型数据库和Elasticsearch的关系对比图
在这里插入图片描述
此时的可以认为的关系是关系型数据库的数据库(database)名相当于Elasticsearch的索引(indices),数据库表(table)相当于Elasticsearch的的type,以此类推。(暂时这样可以理解方便)。
在关系型数据库中我们找数据库都是“找到数据库名->找到表名->找到所需要的行->找到列->最后找到字段的信息”。所以我们可以理解Elasticsearch的逻辑设计同样也是“找到索引indices->找到types->找到documents->找到field”,由此得到的逻辑结构是“索引-》类型-》文档ID-》文件体”。
前面所说的Elasticsearch是面向文档的,那么就意味着索引和搜索的数据的最小单位是文档,所以要理解文档的几个重要的属性:
(1)自我包含,即一篇文档同时包含字段和对应的值,也就是同时包含 key:value。就是key:value中又包含key:value。类似于(如下图) JSON的格式
在这里插入图片描述(2)可以是层次型的,一个文档中包含自文档,复杂的逻辑实体就是这么来的
(3)灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,在elasticsearch中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态的添加一个
新的字段。
2、关于Elasticsearch的类型
类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。 类型中对于字段的定义称为映射,比如 name 映 射为字符串类型。 我们说文档是无模式的,它们不需要拥有映射中所定义的所有字段,
比如新增一个字段,那么elasticsearch是怎么做的呢?elasticsearch会自动的将新字段加入映射,但是这个字段的不确定它是什么类型,elasticsearch就开始猜,如果这个值是18,那么elasticsearch会认为它
是整形。 但是elasticsearch也可能猜不对, 所以最安全的方式就是提前定义好所需要的映射,这点跟关系型数据库殊途同归了,先定义好字段,然后再使用。
简单地说就是elasticsearch可以是自己猜你所增加的字段的类型,当可能又猜不准,但MySql不会猜你的字段类型,直接报错,一次为了避免一些愚蠢的错误,我们设计是都合理地加上类型。
3、elasticsearch的索引
索引是映射类型的容器,elasticsearch中的索引是一个非常大的文档集合。索引存储了映射类型的字段和其他设置
4、先看一个表
在这里插入图片描述
如果要搜索含有 python 标签的文章,那相对于查找所有原始数据而言,查找倒排索引后的数据将会快的多。只需要查看标签这一栏,然后获取相关的文章ID即可。
传统的我们的检索是通过文章,逐个遍历找到对应关键词的位置。
而倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典+映射表即为倒排索引。
5、ik分词器。其实就是将获得的一段文字划分为一个个关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词。
如果熟悉Python的词云那一部分知识的对于ik分词器就明白是什么意思。
IK提供了两个分词算法:ik_smart,ik_max_word。
ik_smart:粗粒度分词,优先匹配最长的词,一般只有一个词
ik_max_word:细粒度分词,会尽穷一个语句中所有分词的可能
6、增删改查命令

1)增加数据
PUT /lamguage/php/1
{
	“ID”:”php语言”,
	“name”:”php语言”,
	“desc”:”世界上最好的语言”
}

/lamguage/php/1的格式就是前面说的:索引-》类型-》文档ID
注意:put也有修改的功能(post也可以修改):当执行 命令时,如果数据不存在,则新增该条数据,如果数据存在则修改该条数据。
(2)更新(修改)数据
我们使用 POST 命令,在 id 后面跟 _update(这个是修改功能固定的,不是自定义的),要修改的内容放到 doc 文档(属性)中即可。

POST /lamguage/php/1/_update
{
 “doc”:{
		“ID”:1”
 		“name”:”php语言No1,
 		“desc”:”世界上最好的语言”
	}
}

(3)查询(无条件查询和有条件查询)
无条件查询:GET lamguage/php/_search
有条件查询:GET lamguage/php/_search?q=name: php语言No1
当然,也可以构建查询语句:格式
例子1:

GET lamguage/php/_search
{
	“query”:{#查询关键词
		“match”:{#查询条件
			“name”:” php语言No1}
	}
}

例子2:

GET lamguage/php/_search
{
	“query”:{#查询关键词
		“match_all”:{}
	}
}

“match_all”:{}空值时表示没有查询条件,全部查找
例子3:

GET lamguage/php/_search
{
	“query”:{#查询关键词
		“match_all”:{}
	},
	“_source”:[“name”,”desc”]#通过_source来返回的属性name和desc
}

(4)排序查询,关键词:sort
注意:在排序的过程中,只能使用可排序的属性(数字、日期、ID)进行排序。其它的都不可用。

GET lamguage/php/_search
{
	“query”:{#查询关键词
		“match_all”:{}
	},
	“sort”:[
		{
			“ID”{
				“order”:”desc”#desc降序,asc就是升序了
			}
		}
	]
}

(5)分页查询:关键词:form和size

GET lamguage/php/_search
{
	“query”:{#查询关键词
		“match_all”:{}
	},
	“sort”:[
		{
			“ID”{
				“order”:”desc”#desc降序,asc就是升序了
			}
		}
	],
	“from”:0,	#从第n条开始
	“size”:1	#返回n条数据
}

(6)布尔查询
1、关键词must(类似MySql语句的and)

GET  person/user/_search
{
	“query”:{	#查询bool”:{		#返回Boolean值
			“must”:[		# must(类似MySql语句的and)
				{
					“match”:{		#条件1		match{条件内容}
						“name”:”法外狂徒”
					}
				},
				{
					“match”:{		#条件2		match{条件内容}
						“age”:27
					}
				}
			]
		}
	}
}

2、关键词should(类似MySql语句的or)

GET  person/user/_search
{
	“query”:{	#查询
		“bool”:{		#返回Boolean值
			“should”:[		# should (类似MySql语句的or)
				{
					“match”:{		#条件1		match{条件内容}
						“name”:”法外狂徒”
					}
				},
				{
					“match”:{		#条件2		match{条件内容}
						“age”:27
					}
				}
			]
		}
	}
}

3、关键词must_not(类似MySql语句的not)

GET person/user/_search
{
	"query": {
		"bool": {
			"must_not": [	# must_not(类似MySql语句的not)
				{ 					"match": {
						"age": 18
						}
					}
				]
			}
		}
}

4、Filter:过滤(比如数据库语句:大于多少,少于多少,在什么区间)
关键词:gt表示大于
gte表示大于等于
lt表示小于
lte表示小于等于

GET user/student/_search
{
	“query”:{	#查找条件
		“bool”:{		#判断返回结果
			“must”[		#关系
				{
					“match”:{	#条件必须是类似where后面的条件
						“name”:”张三狂徒”
					}
				}
			],
			“filter”:{		#过滤条件
				“range”:{	#范围
					“age”:{
						“gte”:25,	#大于等于
						“lte”:30		#小于等于
					}
				}
			}
		}
	}
}

5、短语检索(Mysql的模糊查询)

GET student/user/_search
{
	"query":{
		"match": {
			"tags": "狂徒"	#有狂徒的标签
		}
	}
} 

6、精确查询(term查询)
term查询是直接通过倒拍索引指定的词条,也就是精确查找。
term和match的区别:
·match是经过分析(analyer)的,也就是说,文档是先被分析器处理了,根据不同的分析器,分析出的结果也会不同,在会根据分词 结果进行匹配。
·term是不经过分词的,直接去倒排索引查找精确的值。
(1)创建数据

PUT  /testdb
{
	“mappings”:{
		“properties”:{
			“name”:{
				“type”:”text”
			},desc”:{
				“type”:”keyword”
			}
		}
	}
}

有没有发现,这次添加的数据与其它有所不同,主要的就是用mappings properties去给多个字段(field)指定类型的时候,不能给我们的索引(/testdb)制定类型
(2)插入数据
插入第一条数据

PUT  /testdb/_doc/1
{
	“name”:” 张三狂徒”,desc”:”永远在刑法的路上”
}

插入第二条数据

PUT  /testdb/_doc/1
{
	“name”:” 张三狂徒”,desc”:”终于服刑了”
}

此时我们用分析器来对比keyword类型和standard类型
·keyword类型:不会被分析器处理
·standard类型:会被分析器处理,分成一个个
_analyze是Elasticsearch一个非常有用的API,它可以帮助你分析每一个field或者某个analyzer/tokenizer是如何分析和索引一段文字。
如1:

GET _analyze
{
	“analyzer”:”keyword”,	#属于keyword类型,不会被分析器处理text”:” 永远在刑法的路上”		#整个text内容输出
}

如2:

GET _analyze
{
	“analyze”:”standard”,		#属于standard类型,会被分析器处理text”:” 永远在刑法的路上”		#输出结果会被一个一个字拆开
}

7、查找多个精确值,关键词terms
例如:

GET testdb/_serch
{
	“query”:{
		“bool”:{
			“should”:[
				{
					“term”:{
						“t1”:”查找的数据”
					}
				},
				{
					“term”:{
						“t1”:” 查找的数据”
					}
				}
			]
		}
	}
}

8、高亮显示:类似当你在百度输入一个词语是,查到的网页中显示的你输入的词语用不同的颜色表示
关键词:highlight
例1:默认显示高亮样式

GET student/user/_search
{
		“query”:{
			“match”:{
				“name”:”张三”
			}
		},
		“highlight”:{	 #显示高亮
			“fileds”:{
				“name”:{}
			}
		}
}

例1:自定义显示高亮样式

GET student/user/_search
{
	“query”:{
		“match”:{
			“name”:”张三”
		}
	}
	“hightlight”:{
		“pre_tags”:”<b class =key’ style=’color:red’>,#自定标签样式:pre_tags代表前置标签
		“post_tags”:”</b>,		#结束标签,post_tags代表结束标签fields”:{
			“name”:{}
		}
	}
}
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:48:25  更:2021-07-30 12:48:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 10:02:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码