根据b站视频整理笔记: https://www.bilibili.com/video/BV1Qz411e7yx?p=1
文章目录
1、ElasticSearch简介
1.1、什么是ES
ES是使用java 语言并且基于Lucence编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于restful风格的web 接口。
lucence:一个搜索引擎底层
分布式:突出ES的横向扩展能力
全文检索:将一段词语进行分词,并将分出的词语统一的放在一个分词库中,再搜索时,根据关键字取分词库中检索,找到匹配的内容(倒排索引)。
restful风格的web 接口:只要发送一个http请求,并且根据请求方式的不同,携带参数的不同,执行相应的功能。
1.2、ES和Solr
1.solr 查询死数据,速度比es快。但是数据如果是改变的,solr查询速度会降低很多,ES的查询速度没有明显的改变
2.solr搭建集群 依赖ZK,ES本身就支持集群搭建
3.最开始solr 的社区很火爆,针对国内文档 少,ES出现后,国内社区火爆程度 上升,,ES的文档非常健全
4.ES对云计算和大数据支持很好
1.3、ES的由来小故事
许多年前,一个刚结婚的名叫 Shay Banon 的失业开发者,跟着他的妻子去了伦敦,他的妻子在那里学习厨师。
在寻找一个赚钱的工作的时候,为了给他的妻子做一个食谱搜索引擎,他开始使用 Lucene 的一个早期版本。直接使用 Lucene 是很难的,因此 Shay 开始做一个抽象层,Java 开发者使用它可以很简单的给他们的程序添加搜索功能。
他发布了他的第一个开源项目 Compass。后来 Shay 获得了一份工作,主要是高性能,分布式环境下的内存数据网格。这个对于高性能,实时,分布式搜索引擎的需求尤为突出, 他决定重写
Compass,把它变为一个独立的服务并取名 Elasticsearch。第一个公开版本在2010年2月发布,从此以后,Elasticsearch 已经成为了 Github 上最活跃的项目之一,他拥有超过300名
contributors(目前736名 contributors )。 一家公司已经开始围绕 Elasticsearch
提供商业服务,并开发新的特性,但是,Elasticsearch 将永远开源并对所有人可用。据说,Shay 的妻子还在等着她的食谱搜索引擎…
1.4、ElasticSearch和Kibana
ElasticSearch是一个基于Lucence的搜索服务器。
Kibana是es的一个开源分析和可视化平台,主要用到 Dev Tools 和 Management。
2、ElasticSearch基本操作
2.1、操作ES的RESTful语法
GET请求:
http://ip:port/index :查询索引信息
http://ip:port/index/type/doc_id :查询指定的文档信息
POST请求:
http://ip:port/index/type/_search: 查询文档,可以在请求体中添加json字符串来代表查询条件
http://ip:port/index/type/doc_id/_update: 修改文档,在请求体中添加json字符串来代表修改的信息
PUT请求:
http://ip:port/index : 创建一个索引,需要在请求体中指定索引的信息
http://ip:port/index/type/_mappings:代表创建索引时,指定索引文档存储属性的信息
DELETE 请求:
http://ip:port/index: 删除跑路
http://ip:port/index/type/doc_id: 删除指定的文档
2.2、索引的创建、查看和删除
创建一个索引
#创建一个索引
#number_of_shards 分片
#number_of_replicas 备份
PUT /person
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}
查看一个索引
1.使用management。图形化界面
2.
#查看索引信息
GET /person
删除索引
1.management
2.
#删除索引
DELETE /person
3.4 、ES中Field可以指定的类型
字符串类型:
text: 一般用于全文检索,将当前field 进行分词
keyword:当前field 不会进行分词数值类型:
long,Intger,short,byte,double,float,
half_float: 精度比float 小一半
scaled_float:根据一个long 和scaled 来表达一个浮点型 long-345, -scaled 100 ->3.45时间类型:
date类型,根据时间类型指定具体的格式二进制类型:
binary类型暂时支持Base64编码的字符串范围类型:
integer_range:赋值时,无需指定具体的内容,只需存储一个范围即可,gte,lte,gt,lt,
float_range:同上
long_range:同上
double_range:同上
date_range:同上
ip_range:同上经纬度类型:
geo_point:用来存储经纬度IP类型:
ip:可以存储IPV4 和IPV6
创建索引并指定数据结构
#创建索引,指定数据类型
PUT /book
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"author": {
"type": "keyword"
},
"count": {
"type": "long"
},
"onSale": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"descr": {
"type": "text"
}
}
}
}
match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,
而term会直接对关键词进行查找。
一般模糊查找的时候,多用match,而精确查找时可以使用term。
term查询
term的查询是代表完全匹配,搜索之前不会对你的关键字进行分词
#term匹配查询
POST /sms_logs_index/sms_logs_type/_search
{
"from": 0, #limit from,size
"size": 5,
"query": {
"term": {
"province": {
"value": "河北"
}
}
}
}
##不会对term中所匹配的值进行分词查询
terms是针对一个字段包含多个值得运用
- terms: where province = 河北 or province = ? or province = ?
#terms 匹配查询
POST /sms_logs_index/sms_logs_type/_search
{
"from": 0,
"size": 5,
"query": {
"terms": {
"province": [
"河北",
"河南"
]
}
}
}
match查询
match查询,实际底层就是多个term查询,将多个term查询的结果进行了封装
- 查询的如果是日期或者是数值的话,它会根据你的字符串查询内容转换为日期或者是数值对等
- 如果查询的内容是一个不可被分的内容(keyword),match查询不会对你的查询的关键字进行分词
- 如果查询的内容是一个可被分的内容(text),match则会根据指定的查询内容按照一定的分词规则去分词进行查询
match_all查询
查询全部内容,不指定任何查询条件
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"match_all": {}
}
}
match查询 根据某个Field
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"match": {
"smsContent": "打车"
}
}
}
布尔match查询
基于一个Filed匹配的内容,采用and或者or的方式进行连接
# 布尔match查询
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"match": {
"smsContext": {
"query": "打车 女士",
"operator": "and" #or
}
}
}
}
multi_match查询
match针对一个field做检索,multi_match针对多个field进行检索,多个key对应一个text
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"multi_match": {
"query": "河北", #指定text
"fields": ["province","smsContext"] #指定field
}
}
}
filter 查询
query 查询:根据你的查询条件,去计算文档的匹配度得到一个分数,并根据分数排序,不会做缓存的。
filter 查询:根据查询条件去查询文档,不去计算分数,而且filter会对经常被过滤的数据进行缓存。
#filter 查询
POST /sms-logs-index/sms-logs-type/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"corpName": "海尔智家公司"
}
},
{
"range":{
"fee":{
"lte":50
}
}
}
]
}
}
}