- 高级操作
- 批量操作-脚本
- 增删改的语法
- 批量操作java代码
- 数据导入
- 实现步骤
- 小拓展
- 对应的索引映射
- 具体示例
- 引入依赖
- Mybatis-plus的yaml
- 实体类和数据访问层
- 测试类
- matchAll查询
- 查询结果
- java操作
- term查询
- Kibana的方式
- java
- match查询
- kibana
- java代码
- 模糊查询
- wildcard查询
- 示例
- java
- regexp查询
- 示例
- java
- prefix查询
- 示例
- java
- 范围查询
- 示例
- java
- 排序
- 示例
- java
- QueryString
- 示例
- java
- 布尔查询
- 示例
- 聚合查询
- 示例
- 指标聚合
- 分组聚合
- java
- 添加聚合条件
- 查询聚合结果
- 重建索引
- 示例
- 索引别名
Bulk批量操作是将文档的增删改查一系列操作。通过一次请求全部做完,减少网络传输次数
这一组文档的增删改查命令,其中一个失败,不会影响其他的命令
增删改的语法 批量操作java代码将请求的方式,通过java封装后的代码,来操作
@Test
public void BulkTest()throws Exception{
// 创建BulkRequest对象整合所有操作
BulkRequest bulkRequest = new BulkRequest();
// 删除操作传入Bulk
DeleteRequest deleteboot01 = new DeleteRequest("boot01", "1");
bulkRequest.add(deleteboot01);
// 新增操作传入Bulkbulktest
Map map = new HashMap<>();
map.put("name","6号");
IndexRequest insetboot01 = new IndexRequest("boot01").id("6").source(map);
bulkRequest.add(insetboot01);
// 更新操作传入Bulk
Map 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
- 将数据作为文档放入索引
Mybatis-plus的yamlcom.alibaba fastjson 1.2.4 mysql mysql-connector-java 8.0.18 com.baomidou mybatis-plus-boot-starter 3.3.1
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
@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或多个字符
//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:不支持连接符
javaQueryStringQueryBuilder field = QueryBuilders.queryStringQuery("查询条件").field("属性").field("属性");
布尔查询
将多个查询连接起来,拼接为一个大查询(多条件的查询)
比如多个分类,就需要多个查询进行拼接
示例 聚合查询- 指标聚合:相当于Mysql的聚合函数。max,min,avg,sum
- 桶聚合:相当于Mysql的group by操作,不要对text类型的数据进行分组。会失败
在使用之后,在kibana的结果最后给出聚合的结果g)
分组聚合表示根据指定的 属性进行分组。
根据品牌分组。展示前100个
java 添加聚合条件 查询聚合结果 重建索引随着业务需求,索引的结构可能发生变化
ElasticSearch的索引一旦创建,只允许添加字段,不允许改变索引,因为改变字段,需要重新建立倒排索引,影响内部缓存结构,性能低
此时:需要重新建一个新的索引,将原有索引的数据导入到新的索引中
示例可以做到将一个索引中的内容传入到另外一个中。
在java代码中的操作。通过指定索引进行操作。当我们改变索引,就需要在代码中也进行改动。
索引别名我们可以给索引去一个别名,在java中去指定这个别名从而进行操作。



