文章目录
SpringBoot整合ElasticSearch
创建项目gulimall-search,选择依赖web
导入依赖
这里的版本要和所安装的ES版本匹配。
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.12.1</version>
</dependency>
在spring-boot-dependencies中所依赖的ES版本位7.15.2,要改掉
<properties>
<java.version>11</java.version>
<elasticsearch.version>7.12.1</elasticsearch.version>
</properties>
请求测试项,比如es添加了安全访问规则,访问es需要添加一个安全头,就可以通过requestOptions设置
官方建议把requestOptions
创建成单实例
@Configuration
public class GuliESConfig {
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
// 注入
@Bean
public RestHighLevelClient esRestClient() {
RestClientBuilder builder = null;
// 可以指定多个es
builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
}
测试
@RunWith(SpringRunner.class) // 解决@Autowired注入为null的问题
@SpringBootTest
class GulimallSearchApplicationTests {
@Autowired
..........
@Test
void contextLoads() {
}
}
保存数据
保存方式分为同步和异步,异步方式多了个listener回调
@Test
public void indexData() throws IOException {
// 设置索引
IndexRequest indexRequest = new IndexRequest ("users");
indexRequest.id("1");
User user = new User();
user.setUserName("张三");
user.setAge(20);
user.setGender("男");
String jsonString = JSON.toJSONString(user);
//设置要保存的内容,指定数据和类型
indexRequest.source(jsonString, XContentType.JSON);
//执行创建索引和保存数据
IndexResponse index = client.index(indexRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
System.out.println(index);
}
获取数据
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-search.html
@Test
public void find() throws IOException {
// 1 创建检索请求
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("bank");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 构造检索条件
// sourceBuilder.query();
// sourceBuilder.from();
// sourceBuilder.size();
// sourceBuilder.aggregation();
sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
System.out.println(sourceBuilder.toString());
searchRequest.source(sourceBuilder);
// 2 执行检索
SearchResponse response = client.search(searchRequest, GuliESConfig.COMMON_OPTIONS);
// 3 分析响应结果
System.out.println(response.toString());
}
{
"took":198,
"timed_out":false,
"_shards": {
"total":1,"successful":1,"skipped":0,"failed":0},
"hits":{
"total":{
"value":4,"relation":"eq"},
"max_score":5.4032025,
"hits":[
{
"_index":"bank",
"_type":"account",
"_id":"970",
"_score":5.4032025,
"_source":{
"account_number":970,"balance":19648,
"firstname":"Forbes","lastname":"Wallace","age":28,
"gender":"M","address":"990 Mill Road","employer":"Pheast",
"email":"forbeswallace@pheast.com","city":"Lopezo","state":"AK"