本次测试 添加和查询
准备测试需要用的东西
yml配置
server:
port: 11000
spring:
application:
name: gulimall-search
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
这里的版本要和所按照的ELK版本匹配。
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>
在spring-boot-dependencies中所依赖的ES版本位6.8.5,要改掉
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.4.2</elasticsearch.version>
</properties>
请求测试项,比如es添加了安全访问规则,访问es需要添加一个安全头,就可以通过requestOptions设置
这里强烈建议在properties下声明一下版本号,我的就在这一直出错
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
<mysql.version>5.1.32</mysql.version>
<elasticsearch.version>7.4.2</elasticsearch.version>
</properties>
EsConfig工具类里面
package com.guli.gulimall.esconfig;
import org.apache.http.HttpHost;
import org.elasticsearch.client.HttpAsyncResponseConsumerFactory;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GuliESConfig {
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
/*builder.addHeader("Authorization", "Bearer " + TOKEN);
builder.setHttpAsyncResponseConsumerFactory(
new HttpAsyncResponseConsumerFactory
.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));*/
COMMON_OPTIONS = builder.build();
}
@Bean
public RestHighLevelClient createRestHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder( new HttpHost("192.168.56.10", 9200, "http")));//因为我连的虚拟机所以就是我虚拟机ip
return client;
}
}
测试类
package com.guli.gulimall;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.guli.gulimall.dto.User;
import com.guli.gulimall.esconfig.GuliESConfig;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.ArrayList;
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
@Autowired
private RestHighLevelClient restHighLevelClient;
@org.junit.Test
public void test1() throws IOException {
//这输出是看那个工具类取没取到
System.out.println(restHighLevelClient);
IndexRequest indexRequest = new IndexRequest("aaa");//aaa是索引 在mysql中这个叫数据库
//这里index 在es中就是添加的意思
User user = new User(3,"小彬","女");//随便定义一个实体类
// 这个id是指定的id可有可无,默认是符号代替
indexRequest.id(user.getId().toString());
//转成json 因为es只能用于json
String json = JSONObject.toJSONString(user);
//设置要保存的内容,指定数据和类型
indexRequest.source(json, XContentType.JSON);
//执行创建索引和保存数据
restHighLevelClient.index(indexRequest, GuliESConfig.COMMON_OPTIONS);
System.out.println("成功");
}
查询方法
@org.junit.Test
public void Test2() throws IOException {
// 1 创建检索请求 Search在es里面代表查询这个都知道吧
SearchRequest searchRequest = new SearchRequest("aaa");
// 创建条件构建器 SearchSourceBuilder
SearchSourceBuilder builder = new SearchSourceBuilder();
// 这里查的所有
builder.query(QueryBuilders.matchAllQuery());
//第二种写法
/* 查询条件
QueryBuilder query = QueryBuilders.matchAllQuery();
指定查询条件
searchSourceBuilder.query(query);*/
//查询条件构建器
searchRequest.source(builder);
//查询,获取结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest,GuliESConfig.COMMON_OPTIONS);
// System.out.println(searchResponse+"查所有");//我们可以看出很多我们不需要的值
//获取命中对象 hits
SearchHits hits = searchResponse.getHits();
//获取hits数组
SearchHit[] hits1 = hits.getHits();
/*我们可以看出有我们想要的值,但是类型不一样
可以创建一个集合存储es的每一条记录
* */
但是查出来的类型不是我们想要的所以要
/* for (SearchHit documentFields : hits1) {
System.out.println(documentFields);
}*/
ArrayList<User> users = new ArrayList<>();
for (SearchHit documentFields : hits1) {
//获取到hits中的每一个asString
String asString = documentFields.getSourceAsString();
//将asString中的数据封装为user对象
User user = JSONObject.parseObject(asString, User.class);//当然你也可以一个一个赋值,我这里就省略了
users.add(user);
}
//输出
for (User user : users) {
System.out.println(user);
}
}
}