ElasticSearch
Springboot整合ElasticSearch
1.导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.配置es
@Configuration
public class ElasticSearchConfig {
@Bean
RestHighLevelClient restHighLevelClient()
{
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost",9200,"http")));
return client;
}
}
已经把restHighLevelClient给Spring管理了,接下来就可以测试使用ES的API咯
3.测试API
首先创建测试类,并导入RestHighLevelClient
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client;
1.创建Index
/** 创建索引 */
@Test
void createIndexTest() throws IOException {
// 1.创建索引请求
CreateIndexRequest request = new CreateIndexRequest("JD_goods");
// 2.执行请求
CreateIndexResponse indexResponse = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(indexResponse.isAcknowledged());
}
2.删除index
/** 删除索引 */
@Test
void deleteIndexTest() throws IOException {
// 1.创建索引请求
DeleteIndexRequest indexRequest = new DeleteIndexRequest("sean_index1");
// 2.执行请求
AcknowledgedResponse delete = client.indices().delete(indexRequest, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
3.测试index是否存在
/** 测试获取索引 */
@Test
void getIndexTest() throws IOException {
// 1.创建获取索引请求
GetIndexRequest request = new GetIndexRequest("sean_index");
// 2.判断索引是否存在
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
Assertions.assertTrue(exists);
}
4.创建文档document
/** 测试创建Document */
@Test
void createDocumentTest() throws IOException {
// 1.创建User对象
User user = new User(1, "张三", 10);
// 2.创建索引对象
IndexRequest request = new IndexRequest("sean_index");
// 3.把User对象转换成Json字符串存到indexRequest对象中
request.id(String.valueOf(user.getId()));
IndexRequest indexRequest = request.source(JSON.toJSONString(user), XContentType.JSON);
// 4.客户端发送请求
IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
5.文档是否存在
/** 获取文档,判断是否存在 */
@Test
void existDocumentTest() throws IOException {
// 1.创建获取请求对象 get /sean_index/_doc/1
GetRequest getRequest = new GetRequest("sean_index", "1");
// 2.不获取返回的_source的上下文(不会输出具体的内容)
getRequest.fetchSourceContext(new FetchSourceContext(false));
// getRequest.storedFields("_none_");
System.out.println(client.get(getRequest, RequestOptions.DEFAULT).toString());
boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
Assertions.assertTrue(exists);
}
6.获取文档内容
/** 获取文档内容 */
@Test
void getDocumentTest() throws IOException {
GetRequest getRequest = new GetRequest("sean_index", "1");
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString());
}
7.更新文档
/** 更新文档信息 */
@Test
void updateDocumentTest() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("sean_index", "1");
updateRequest.timeout("1s");
// 这样会更新全部字段,没有设置的字段设置成0
User user = new User();
user.setUsername("Lisa");
updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.getResult());
}
8.删除文档
/** 删除document记录 */
@Test
void deleteDocumentTest() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("sean_index", "1");
client.delete(deleteRequest, RequestOptions.DEFAULT);
}
9.批量插入数据
/** 批处理插入大量数据 应用:在实际项目中首次导入数据,数据从数据库查询出来后可以使用此方法批量导入es中 */
@Test
void BulkCreateTest() throws IOException {
BulkRequest bulkRequest = new BulkRequest("sean_index");
bulkRequest.timeout("10s");
List<User> userList = new ArrayList<>();
userList.add(new User(1, "Lisa1", 12));
userList.add(new User(2, "Lisa2", 13));
userList.add(new User(3, "Lisa3", 14));
userList.add(new User(4, "Lisa4", 15));
userList.add(new User(5, "Lisa5", 16));
// 批处理请求
for (int i = 0; i < userList.size(); i++) {
bulkRequest.add(
new IndexRequest("sean_index")
.id(String.valueOf(i + 1))
.source(JSON.toJSONString(userList.get(i)), XContentType.JSON));
}
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());
}
10.搜索数据(关键字高亮)
/** 搜索 search
* searchRequest 搜索请求
* SearchSourceBuilder 搜索条件构造
* HighlightBuilder 高亮构造
* xxx QueryBuilder 对应命令
*/
@Test
void searchDocumentTest() throws IOException {
// 1.创建搜索请求
SearchRequest searchRequest = new SearchRequest("sean_index");
// 2.构建精确查找对象,可以使用QueryBuilders工具类来实现
MatchPhraseQueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery("username", "Lisa1");
/**
* TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("username","Lisa1");
* 使用该方法可能会查询不到结果,可以使用 QueryBuilders.matchPhraseQuery()替换
*/
// 3.创建SearchSourceBuilder
SearchSourceBuilder searchSourceBuilder =
new SearchSourceBuilder().query(queryBuilder).timeout(new TimeValue(60, TimeUnit.SECONDS));
//高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("username");
highlightBuilder.preTags("<span style='color:red'>");
highlightBuilder.postTags("</span>");
searchSourceBuilder.highlighter(highlightBuilder);
// 4.发送请求
SearchResponse searchResponse =
client.search(searchRequest.source(searchSourceBuilder), RequestOptions.DEFAULT);
searchResponse
.getHits()
.forEach(
(searchHit) -> {
System.out.println(searchHit.getSourceAsString());
});
}
参考博客: https://blog.csdn.net/qq_39679997/article/details/106481685
遇到的問題:
參考博客: https://blog.csdn.net/YKenan/article/details/107380538