什么是ElasticSearch?
es能干嘛
lucene和es的关系
ES的核心概念:
1、近实时
2、Cluster
集群,
3、节点Node
*4、Document&field
*5、index
*6、type
type在7的版本已经移除掉了,但是目前还能用,
7、shard
分片
8、replica
以上概念和数据库对比
ES的安装
ES端口:9200
kibana端口:5601
ES的一个可视化工具:kibana
注意:ES和kibana版本要相对应才能使用!
基本操作
基本检索
商品的CRUD
新建文档,建立索引
post,
不指定id则自动生成id,它给的id,永远都为创建
指定id,指定了已存在的id,为修改,并增加版本号
指定id,指定了不存在的id,为创建
put:
必须指定id
总结:
查询
get
并发操作:带版本号操作
修改:替换
新版:PUT /ecommerce/_doc/1 {}
修改:更新
新版:
老版:
删除
批量新增
批量增删改
增加测试数据
数据是官方提供的
使用批量新增,
批量查询
ES搜索
支持的搜索:
query String Search
query DSL(常用)
查询所有,并排序
query DSL
格式
from返回部分字段
查询所有的商品
query/match匹配查询
分页
query/match_phrase[不拆分匹配]
包含不分词
query/multi_math[多字段匹配]
或的关系
query/bool/must[复合查询]
与的关系
匹不匹配的上都不会影响,能匹配就匹配上,匹配不到也不影响结果 ,但会贡献得分
query/filter[结果过滤]
在gte和lte之间,大于等于gte小于等于lte
query/term
highlight search(高亮搜索结果)
还可以改写高亮:
聚合分析
格式
搜索address中包含mill的所有人的年龄平均分布以及平均年龄,但不显示这些人的详情
2、按照年龄聚合,并且求这些年龄段的这些人的平均薪资
3、查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资水平
计算每个tag下的商品数量
对名称中包含yaogao的商品,计算每个tag下的商品数量
计算每个tag下的商品的平均价格
计算每个tag下的商品的平均价格,并且按照平均价格降序排序
按照指定的价格范围区间进行分组,然后在每组内再按照tag进行分组,最后再计算每组的平均价格
sum、max、mix,avg
type也可以是这几种
Mapping的映射
文档
查看Mapping信息
新版本改变
创建映射
查看映射
添加映射
更新映射只有进行数据迁移
nested
分词器
基本介绍
使用分词器
安装ik分词器
自己添加词库
ES的java操作
两种操作方式
方式一:
9300 tcp连接
方式二:
9200 http连接
springboot整合
导入依赖
<properties> <java.version>11</java.version> <!--指定elasticsearch版本 --> <elasticsearch.version>7.14.1</elasticsearch.version> </properties><!--导入ES--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.14.1</version> </dependency> <!--导入fastjson依赖 转换json--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency>
配置类
@Configuration
public class ESConfig {
public static final RequestOptions COMMON_OPTIONS;
static{
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
@Bean
public RestHighLevelClient restHighLevelClient(){
RestClientBuilder builder = null;
builder = RestClient.builder(new HttpHost("192.168.79.91",9200,"http"));
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);
return restHighLevelClient;
}
}
简单测试
增加:
@Autowired
private RestHighLevelClient esClient;
@Test
public void insertTest(){
IndexRequest request = new IndexRequest("emp");//创建索引
request.id("9527");//设置id
//数据
Emp emp = new Emp();
emp.setEmpno(9527);
emp.setEname("周星星");
emp.setJob("干饭");
//转换json
String jsonString = JSONObject.toJSONString(emp);
request.source(jsonString, XContentType.JSON);
try {
esClient.index(request, ESConfig.COMMON_OPTIONS);
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
查询:
@Autowired
private RestHighLevelClient esClient;
//查询
@Test
public void getTest(){
GetRequest getRequest = new GetRequest("emp");
getRequest.id("9527");
try {
GetResponse response = esClient.get(getRequest, ESConfig.COMMON_OPTIONS);
log.info("----------->"+response);
log.info("----------->"+response.getSource());
} catch (IOException ioException) {
ioException.printStackTrace();
}
}