文章目录
高级操作
批量操作-脚本
Bulk批量操作是将文档的增删改查一系列操作。通过一次请求全部做完,减少网络传输次数
这一组文档的增删改查命令,其中一个失败,不会影响其他的命令
增删改的语法
批量操作java代码
将请求的方式,通过java封装后的代码,来操作
@Test
public void BulkTest()throws Exception{
// 创建BulkRequest对象整合所有操作
BulkRequest bulkRequest = new BulkRequest();
/*
删除1号记录
添加6号记录
修改3号记录,名称为三号
*/
// 删除操作传入Bulk
DeleteRequest deleteboot01 = new DeleteRequest("boot01", "1");
bulkRequest.add(deleteboot01);
// 新增操作传入Bulkbulktest
Map<String,Object> map = new HashMap<>();
map.put("name","6号");
IndexRequest insetboot01 = new IndexRequest("boot01").id("6").source(map);
bulkRequest.add(insetboot01);
// 更新操作传入Bulk
Map<String,Object> map2 = new HashMap<>();
map2.put("name","三号");
UpdateRequest updateboot01 = new UpdateRequest("boot01","3").doc(map2);
bulkRequest.add(updateboot01);
// 将Bulk放入客户端进行执行
restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);
}
数据导入
我们想要使用ES进行查询操作,就需要将我们的数据库信息添加到我们的ES中
实现步骤
- 创建 指定(数据库中数据表) 对应(Es的索引)
- 对索引的映射进行指定
- 查询数据库中的表数据
- 批量添加到ES中
小拓展
我们在商品表中,经常会看到商品的规格
但是每一类的商品规格是不同的。
我们可以将规格信息通过JSON的形式存储到数据库中
对应的索引映射
数据库需要对应索引映射编写,我们在编写索引映射的时候。
只需要对属性的,类型和是否分词进行指定即可
# 创建一个索引,指定映射
# 属性 propertyId 类型是integer
# 属性 propertyName 类型是可分词字符串
# 并且指定分词器是 ik的max_word
# 属性 propertyCategoryId 类型是integer
PUT property/_mapping
{
"properties":{
"propertyId":{
"type":"integer"
},
"propertyName":{
"type":"text",
"analyzer":"ik_max_word"
},
"propertyCategoryId":{
"type":"integer"
}
}
}
具体示例
通过前面的学习
- 数据库查询到对象
- 对象转换为JSON
- 将数据作为文档放入索引
引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
Mybatis-plus的yaml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: ok
url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
#Mybatis-Plus的配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 配置在控制台打印 sql语句
# 配置自定义sql语句的 *mapper.xml 文件位置
mapper-locations: classpath:**/mapper/**.xml
实体类和数据访问层
@Mapper
public interface PropertyDao extends BaseMapper<Property> {
}
测试类
主要的操作都是在测试类中
这里我在添加数据前没有去创建索引
直接进行添加会及进行自动创建
@Test
public void getList() throws Exception{
// 创建BulkRequest对象整合所有操作
BulkRequest bulkRequest = new BulkRequest();
// Mybatis-plus获取对象集合
List<Property> properties = propertyDao.selectList(null);
// 遍历对象集合放入 Bulk
for (Property property : properties) {
// 将获取的对象转为json
String str = JSON.toJSONString(property);
long propertyId = property.getPropertyId();
String strPropertyId = String.valueOf(propertyId);
// 得到添加文档
// 传入JSON的时候要带入指定的文档类型
IndexRequest insetboot01 = new IndexRequest("tabletest").id(strPropertyId).source(str,XContentType.JSON);
// 放入Bulk中
bulkRequest.add(insetboot01);
}
// 将Bulk放入客户端进行执行
restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);
}
结果
matchAll查询
match_all也是查询所有数据
如果不写参数默认就是带着这个参数的
GET 索引/_search
默认ES展示10条数据
查询结果
java操作
/**
* 查询所有
* matchALL
* 将查询结果封装为 对象List集合中
* ES分页操作,展示10条数据
* */
@Test
public void testMatchAll()throws Exception{
// 指定索引。表示查询请求对象
SearchRequest searchRequest = new SearchRequest("property");
// 创建查询条件构造器
SearchSourceBuilder builder = new SearchSourceBuilder();
// ---------------------------------
// 带入分页信息
// from 从0开始去10个
builder.from(0);
builder.size(10);
// ---------------------------------
// 表示查询所有的数据
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
// 将查询条件带入 条件构造器
builder.query(matchAllQueryBuilder);
// 将条件构造器带入 查询请求对象中
searchRequest.source(builder);
// ---------------------------------
// 查询请求对象带入 客户端得到 查询结果
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 通过结果获取,查询的数据结果
SearchHits hits = search.getHits();
// 获取总记录数
long value = hits.getTotalHits().value;
System.out.println("总记录数:"+value);
// 获取所有数据
SearchHit[] hits1 = hits.getHits();
// 循环遍历数据转换,打印
for (SearchHit hit : hits1) {
// source数据转换字符串
String sourceAsString = hit.getSourceAsString();
Property property = JSON.parseObject(sourceAsString, Property.class);
System.out.println("对象的名称:"+property.getPropertyName());
}
}
结果展示
确实做到了分页的功能。并且查询出现
term查询
Kibana的方式
java
@Test
public void testTerm()throws Exception{
// 指定索引。表示查询请求对象
SearchRequest searchRequest = new SearchRequest("property");
// 创建查询条件构造器
SearchSourceBuilder builder = new SearchSourceBuilder();
// 表示查询所有的数据
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("propertyName", "风");
// 将查询条件带入 条件构造器
builder.query(termQueryBuilder);
// 将条件构造器带入 查询请求对象中
searchRequest.source(builder);
// ---------------------------------
// 查询请求对象带入 客户端得到 查询结果
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 通过结果获取,查询的数据结果
SearchHits hits = search.getHits();
// 获取总记录数
long value = hits.getTotalHits().value;
System.out.println("总记录数:"+value);
// 获取所有数据
SearchHit[] hits1 = hits.getHits();
// 循环遍历数据转换,打印
for (SearchHit hit : hits1) {
// source数据转换字符串
String sourceAsString = hit.getSourceAsString();
Property property = JSON.parseObject(sourceAsString, Property.class);
System.out.println("对象的名称:"+property.getPropertyName());
}
}
match查询
match和term在于是否对条件进行分词
kibana
java代码
只需要在条件位置改动即可
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("propertyName", "风格");
// 将查询条件带入 条件构造器
builder.query(matchQueryBuilder);
// 将条件构造器带入 查询请求对象中
searchRequest.source(builder);
模糊查询
wildcard查询
会对查询条件进行分词,还可以使用通配符
- ?:任意单个字符
- *:0或多个字符
示例
java
//wildcard
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("属性", "表达式");
//regexp
PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("属性", "前缀");
//prefix
RegexpQueryBuilder regexpQueryBuilder = QueryBuilders.regexpQuery("属性", "表达式");
regexp查询
正则表达式
示例
java
//wildcard
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("属性", "表达式");
//regexp
PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("属性", "前缀");
//prefix
RegexpQueryBuilder regexpQueryBuilder = QueryBuilders.regexpQuery("属性", "表达式");
prefix查询
前缀查询
示例
java
//wildcard
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("属性", "表达式");
//regexp
PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("属性", "前缀");
//prefix
RegexpQueryBuilder regexpQueryBuilder = QueryBuilders.regexpQuery("属性", "表达式");
范围查询
比如我们需要查询价格区间。可以使用范围查询
对数据类型的数据进行取值范围的操作
示例
java
// 指定索引。表示查询请求对象
SearchRequest searchRequest = new SearchRequest("property");
// 创建查询条件构造器
SearchSourceBuilder builder = new SearchSourceBuilder();
// 指定属性的条件
RangeQueryBuilder range = QueryBuilders.rangeQuery("属性");
// 指定最小
range.gte(2000);
// 指定最大
range.gte(3000);
// 将查询条件带入 条件构造器
builder.query(range);
// 将条件构造器带入 查询请求对象中
searchRequest.source(builder);
排序
我们在操作的时候想要排序。
示例
java
// 指定索引。表示查询请求对象
SearchRequest searchRequest = new SearchRequest("property");
// 创建查询条件构造器
SearchSourceBuilder builder = new SearchSourceBuilder();
// 指定属性的条件
RangeQueryBuilder range = QueryBuilders.rangeQuery("属性");
// 指定最小
range.gte(2000);
// 指定最大
range.gte(3000);
// 将查询条件带入 条件构造器
builder.query(range);
//----------------------排序操作--------------------------
builder.sort("指定属性", SortOrder.ASC);
// 将条件构造器带入 查询请求对象中
searchRequest.source(builder);
QueryString
查询条件可以是多个,进行拼接的形式
示例
queryString:支持连接符
simple_query_string:不支持连接符
java
QueryStringQueryBuilder field = QueryBuilders.queryStringQuery("查询条件").field("属性").field("属性");
布尔查询
将多个查询连接起来,拼接为一个大查询(多条件的查询)
比如多个分类,就需要多个查询进行拼接
示例
聚合查询
- 指标聚合:相当于Mysql的聚合函数。max,min,avg,sum
- 桶聚合:相当于Mysql的group by操作,不要对text类型的数据进行分组。会失败
示例
指标聚合
在使用之后,在kibana的结果最后给出聚合的结果g)
分组聚合
表示根据指定的 属性进行分组。
根据品牌分组。展示前100个
java
添加聚合条件
查询聚合结果
重建索引
随着业务需求,索引的结构可能发生变化
ElasticSearch的索引一旦创建,只允许添加字段,不允许改变索引,因为改变字段,需要重新建立倒排索引,影响内部缓存结构,性能低
此时:需要重新建一个新的索引,将原有索引的数据导入到新的索引中
示例
可以做到将一个索引中的内容传入到另外一个中。
在java代码中的操作。通过指定索引进行操作。当我们改变索引,就需要在代码中也进行改动。
索引别名
我们可以给索引去一个别名,在java中去指定这个别名从而进行操作。