- 高级 *** 作
- 批量 *** 作-脚本
- 增删改的语法
- 批量 *** 作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 fastjson1.2.4 mysql mysql-connector-java8.0.18 com.baomidou mybatis-plus-boot-starter3.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中去指定这个别名从而进行 *** 作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)