Elasticsearch
Elasticsearch就是一个基于Lucene封装的web服务,实现了索引的CRUD功能,并对外提供了可 以访问的Rest风格的接口。
Elasticsearch:具备以下特点
1、 分布式 无需人工搭建集群(solr需要人为配置,使用Zookeeper作为注册中心)
2、 Restful风格,一切API都遵循Rest原则,容易上手
3、 近实时搜索,数据更新在Elasticsearch中几乎是完全同步的
启动失败可以修改jvm.options文件 -Xms256m 默认的是1G 还不行改128m
9300: 集群节点间通讯接口,接受TCP协议
9200:客户端访问接口, 接受Http协议
Kibana是一个基于Node.js的Elasticsearch索引库数据统计工具,可以利用Elasticsearch的聚合功能, 生成各种图表,如柱形图,线状图,饼图等。Kibana监听端口是5601
Ik分词器:把解压后的ikwenjian拷贝到elasticserash的plugins下变重命名为ik, 重新启动ElasticSearch,即可加载IK分词器
索引库操作:
索引库(indices)---------------------------------Database 数据库
类型(type)----------------------------------Table 数据表
文档(Document)--------------------------Row 行
字段(Field)---------------------Columns 列
text:可分词,不可参与聚合
keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合
基本查询:
查询类型:match_all match term range
查询所有match_all: GET /heima/_search { “query”:{ //代表查询对象
“match_all”: {} } }//查询所有
匹配查询:“match”:{ “title”:“小米电视” }是or关系
And关系 “title”:{“query”:“小米电视”,“operator”:“and”}
词条匹配(term): term 查询被用于精确值 匹配
“term”:{ “price”:2699.00 }
布尔组合(bool)
bool 把各种其它查询通过 must (与)、 must_not (非)、 should (或)的方式进行组合
"bool":{
"must": { "match": { "title": "大米" }},
"must_not": { "match": { "title": "电视" }}, //查询的是大米手机
"should": { "match": { "title": "手机" }} }
范围查询(range) gt > gte>= lt< lte<=
"range": {
"price": {
"gte": 1000.0,
"lt": 2800.00
} }
模糊查询(fuzzy)
"fuzzy": { "title": "appla" }//偏差度为2。
"title": { "value":"appla", "fuzziness":1 }//偏差度改为1
结果过滤
直接指定字段
GET /heima/_search {
"_source": ["title","price"],
"query": {
"term": {
"price": 2699
}
} }
includes:来指定想要显示的字段 excludes:来指定不想要显示的字段
“_source”: { “includes”:[“title”,“price”] },
过滤(filter)
“filter”:{ “range”:{“price”:{“gt”:2000.00,“lt”:3800.00}} }
排序
单子段排序
"sort": [
{
"price": {
"order": "desc"
} } ]
多字段排序
“sort”: [ { “price”: { “order”: “desc” }}, { “_score”: { “order”: “desc” }}//相关性得分排序 ]
分页from:开始位置 size:每页大小
高亮
"highlight": {
"pre_tags": "",
"post_tags": "",
"fields": {
"title": {}
} }
聚合aggregations
聚合aggregations max min avg sum count
桶:相当于是group by
度量:相当于聚合函数获取的结果
Term聚合 获取每个品牌的手机数量
GET heima/goods/_search
{
"size": 0,
"aggs": {
"brand_count": {
"terms": {
"field": "brand",
"size": 10
}
}
}
}
桶内聚合:
上面已经获取了每个品牌的数量,根据上面的结果继续获取每个手机品牌的平均价格
GET heima/goods/_search
{
"size": 0,
"aggs": {
"brand_count": {
"terms": {
"field": "brand",
"size": 10
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
集群:
高可用集群:两者共享资源,互为主从,处理业务也基本一致,若发生故障服务和资源 会转移到
负载均衡集群:,集群中的每一台计算机都来完成相同业务,不分主次。当用户请求到达时, 通过某种算法,让请求均衡的分发到集群中的每个节点,充分利用每个节点的资源。
科学计算集群(分布式处理):把复杂任务拆分成一个个小的子任务,然后分配到集群中的不同节点上完成,最后再把计算结果汇总。
分布式架构:按照上面的分布式集群概念,集群中的每个节点完成不同业务。在web开发中也是如此,我们把完整系 统进行拆分,形成独立系统,然后部署到不同的tomcat节点,不同节点通过网络通信,相互协作,这样就将复杂系统细分,但是却带来了另一个问题,就是单个节点故障会导致整个系统不完整。
高可用分布式集群架构:为分布式系统中的每个节点都部署负载均衡节点,即:每 个业务系统都有一个负载均衡的小集群。
Elasticsearch集群
node-01:http端口9201,TCP端口9301
node-02:http端口9202,TCP端口9302
node-03:http端口9203,TCP端口9303
单点的elasticsearch存在哪些可能出现的问题呢?
单台机器存储容量有限
单服务器容易出现单点故障,无法实现高可用
单服务的并发处理能力有限
为了应对这些问题,我们需要对elasticsearch搭建集群
我们可以把数据拆分成多份,每一份存储到不同机器节点(node),从而实现减少每个节点数 据量的目的。这就是数据的分布式存储,也叫做: 数据分片(Shard)
每个分片数据进行备,存储到其它节点,防止数据丢失,这就是数据备份,也叫数据副本
SpringDataElasticsearch: 简称SDE
org.springframework.boot
spring-boot-starter-data-elasticsearch
底层是TransportClient 采用TCP端口 9300
Kibana:http 9200
原生API:tcp 9300
Rest API :http 9200
SDE : 封装的是原生api tcp 9300
SpringBoot已经帮我们配置好了各种SDE配置,并且注册了一个ElasticsearchTemplate供我们 使用
在实体类上用到的注解:
@Document:声明索引库配置
indexName:索引库名称
type:类型名称,默认是“docs”
shards:分片数量,默认5
replicas:副本数量,默认1
@Id:声明实体类的id
@Field:声明字段属性
type:字段的数据类型
analyzer:指定分词器类型
index:是否创建索引