ElasticSearch相关概念
1.ElasticSearch介绍
1.1为什么要使用ElasticSearch
Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene的配置及使用非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
1.2什么是ElasticSearch
ES是一个分布式的全文搜索引擎,为了解决原生Lucene使用的不足,优化Lucene的调用方式,并实现了高可用的分布式集群的搜索方案,ES的索引库管理支持依然是基于Apache Lucene(TM)的开源搜索引擎。
ES也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API来隐Lucene的复杂性,从而让全文搜索变得简单。
#添加
PUT /pethome/pet/1
{
"id":1,
"name":"土狗"
}
#获取
GET /pethome/pet/1
1.3ES的特点
-
分布式的实时文件存储
-
分布式全文搜索引擎,每个字段都被索引并可被搜索
-
能在分布式项目/集群中使用
-
本身支持集群扩展,可以扩展到上百台服务器
-
处理PB级结构化或非结构化数据
-
简单的 RESTful API通信方式
-
支持各种语言的客户端
-
基于Lucene封装,使操作简单
1.4ES的lucene的区别
-
Lucene只支持Java,ES支持多种语言
-
Lucene非分布式,ES支持分布式
-
Lucene非分布式的,索引目录只能在项目本地 , ES的索引库可以跨多个服务分片存储
-
Lucene使用非常复杂 , ES屏蔽了Lucene的使用细节,操作更方便
-
单体/小项目使用Lucene ,大项目,分布式项目使用ES
2.ES下载和安装
2.1下载ElasticSearch
下载地址:Download Elasticsearch | Elastic
2.2安装与启动
解压即可,双击安装目录 bin/elasticsearch.bat即可启动
![](https://i-blog.csdnimg.cn/blog_migrate/1561959a58de0599bb91cb9a84d282e4.png)
2.3ES内存配置
如果ES启动占用的内存比较大可以通过修改 jvm.options 文件来修改内存
-Xms1g ---->-Xms512m
-Xms1g -----> -Xms512m
3.Kibana5安装
3.1下载Kibana5
下载地址:Download Kibana Free | Get Started Now | Elastic
3.2安装与启动
解压即可安装 , 执行bin\kibana.bat 即可启动Kibana
3.3Kinbana连接ES配置
解压并编辑config/kibana.yml,设置elasticsearch.url的值为已启动的ES
默认情况下,Kibana会链接本地的默认ES http://localhost:9200
,如果需要修改链接的ES服务器,通过修改安装目录下 config/kibana.yml,将配置项 #elasticsearch.url: "http://localhost:9200"
取消注释即可修改连接的ES服务器地址。
4.ElasticSearch基础
1.几个基本概念
1.1.Near Realtime(NRT)
近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级
1.2.Index:索引库
包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。
1.3.Type:类型
每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,·`一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。
1.4.Document&field
文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。
2.索引库CRUD
#增加索引库
#创建一个名字为 shopping的索引库,5个Master Shard分片,每个Master Shard分片有1个Replica Shard从分片
PUT shopping
{
"settings":{
"number_of_shards":5,
"number_of_replicas":1
}
}
#查询索引库
##查询所有索引库
GET _cat/indices?v
#查看指定索引库
GET _cat/indices/aigou
#删除索引库
DELETE 名字
#修改索引库
删除再添加
3.文档的CRUD
MySql 与 ES对比,ES集群可以包含多个索引(indices)(数据库),每一个索引库中可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。
3.1获取文档
-
基本语法
#指定ID创建索引文档
PUT index/type/id
{
JSON,文档内容
}
--解释---------------------------------------
PUT 索引库/文档类型/文档id
{
JSON格式,文档原始数据
}
使用内置ID创建索引文档
POST index/type/
{
JSON,文档内容
}
--解释---------------------------------------
PUT 索引库/文档类型/
{
JSON格式,文档原始数据
}
没有指定文档ID,ES会自动生成ID
案例
PUT crm/user/11
{
"id":11,
"username":"zs",
"age":18,
"name":"zs",
"sex":1,
"join_date": 1584092062348
}
3.2获取文档
#获取指定文档
GET 索引库/类型/文档ID
#指定返回的列
GET /crm/user/123?_source=fullName,email
#只要内容不要元数据
GET /crm/user/123/_source
3.3修改文档
#整体修改
PUT {index}/{type}/{id}
{
"id":11,
"username":"zs"
}
#上面的修改会把ES中的数据全部覆盖,即age字段会消失。
#局部修改
POST /crm/user/123/_update
{
"doc":{
"id" : 11,
"username": "xx"
}
}
#上面修改只会修改id,和username字段,age字段不会作任何改变。
3.4删除文档
DELETE {index}/{type}/{id}
4.文档简单查询
4.1基本查询
#查询所有
GET _search
#查询指定索引库
GET crm/_search
#查询指定类型
GET crm/user/_search
#查询指定文档
GET crm/user/11
4.2分页查询
&size=2&from=2
size: 每页条数
form:从多少条数据开始查
4.3字符串查询
GET crm/user/_search?q=age:17&size=2&from=2&sort=id:desc&_source=id,username
4.4批量查询
#不同索引库查询
GET _mget
{
"docs" : [
{
"_index" : "itsource",
"_type" : "blog",
"_id" : 2
},
{
"_index" : "itsource",
"_type" : "employee",
"_id" : 1,
"_source": "email,age"
}
]
}
#同索引库同类型 - 推荐
GET itsource/blog/_mget
{
"ids" : [ "2", "1" ]
}
5.DSL查询与DSL过滤
5.1DSL查询
match如同:where username = hello or username = java (match要分词)
term如同:where username = "Hello Java" (term不分词)
5.2DSL过滤
DSL过滤和DSL查询在性能上的区别:
-
过滤结果可以缓存并应用到后续请求。:
where intro like "%zs%" and id = 1
where id = 1 and intro like "%zs%"
-
查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。
-
过滤语句可有效地配合查询语句完成文档过滤。
总结:需要模糊查询的使用DSL查询 ,需要精确查询的使用DSL过滤,在开发中组合使用(组合查询) ,关键字查询使用DSL查询,其他的都是用DSL过滤。
GET /crm/user/_search
{
"query": {
"bool": { //booleanQuery 组合
"must": [{ //与(must) 或(should) 非(must not)
"match": { //match : 匹配,吧查询的内容分词后去查询
"username": "zs"
},
}],
"filter": {
"term": {
"name": "zs ls"
}
}
}
},
"from": 20,
"size": 10,
"_source": ["name", "age", "username"],
"sort": [{
"join_date": "desc"
}, {
"age": "asc"
}]
}
全匹配(match_all)
标准查询(match和multi_match): match一般只用于全文字段的匹配与查询,一般不用于过滤。multi_match 查询允许你做 match查询的基础上同时搜索多个字段
单词搜索与过滤(Term和Terms):单词/词元查询 , 可以理解为等值查询,字符串,数字等都可以使用它,把查询的内容看成一个整体去检索ES库,Terms支持多个字段查询,where tags in (jvm , hadoop , lucene)
组合条件搜索与过滤(Bool):组合搜索bool可以组合多个查询条件为一个查询对象,查询条件包括must、should和must_not。
范围查询与过滤(range):gt:> gte:>= lt:< lte:<=
存在和缺失过滤器(exists和missing):exists和missing只能用于过滤结果
前匹配搜索与过滤(prefix):和term查询相似,前匹配搜索不是精确匹配,而是类似于SQL中的like ‘key%’
通配符搜索(wildcard):使用*代表0~N个,使用?代表1个。