安装ElasticSearch
CSDNhttps://mp.csdn.net/mp_blog/creation/editor/125166176
导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.1.RELEASE</version> </dependency> <dependency> <groupId> com.alibaba.cloud </groupId> <artifactId> spring-cloud-starter-alibaba-nacos-config </artifactId> <version>2.2.1.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.4.2</version> </dependency>
启动类中过滤数据源
新建ElasticSearch配置类
@Configuration public class ElasticSearchConfig { //使用默认配置项 public static RequestOptions COMMON_OPTIONS; static { RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder(); COMMON_OPTIONS = builder.build(); } //注入一个RestHighLevelClient @Bean public RestHighLevelClient esRestClient(){ RestClientBuilder builder = null; builder= RestClient.builder(new HttpHost("192.168.2.20", 9200, "http")); RestHighLevelClient client = new RestHighLevelClient(builder); return client; } }
测试
package com.atguigu.gulimall.search;
import com.alibaba.fastjson.JSON;
import com.atguigu.gulimall.search.config.ElasticSearchConfig;
import com.atguigu.gulimall.search.config.UserInfo;
import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.Request;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.MatchAllQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.naming.directory.SearchResult;
import java.io.IOException;
import java.util.HashMap;
@SpringBootTest
class GulimallSearchApplicationTests {
@Autowired
private RestHighLevelClient restHighLevelClient;
@Test
void contextLoads() throws IOException {
//创建一个 users索引
IndexRequest indexRequest = new IndexRequest("users");
//数据id为1
indexRequest.id("1");
//要保存的数据
HashMap<String, Object> map = new HashMap<>();
map.put("name","zhangsan");
map.put("age",18);
String jsonString = JSON.toJSONString(map);
indexRequest.source(jsonString, XContentType.JSON);
//执行操作
IndexResponse index = restHighLevelClient.index(indexRequest, ElasticSearchConfig.COMMON_OPTIONS);
//响应数据
System.out.println(index);
}
/**
* 新增文档信息
* */
@Test
void addDocument() throws IOException {
//要保存的数据
UserInfo userInfo = new UserInfo();
userInfo.setId("1");
userInfo.setName("张三");
userInfo.setAge("18");
userInfo.setSex("男");
//创建索引请求对象
IndexRequest indexRequest = new IndexRequest("users");
indexRequest.id(userInfo.getId());
//将对象转换成json字符串
String userInfoStr = JSON.toJSONString(userInfo);
//设置文档内容
indexRequest.source(userInfoStr,XContentType.JSON);
//执行增加文档操作
IndexResponse response = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(response.getResult());
}
/**
* 查询文档信息
* */
@Test
void queryDocument() throws IOException {
//new 查询 请求对象
GetRequest getRequest = new GetRequest("users");
getRequest.id("1");
GetResponse response = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
if(response.isExists()){
byte[] sourceAsBytes = response.getSourceAsBytes();
UserInfo userInfo = JSON.parseObject(sourceAsBytes, UserInfo.class);
System.out.println("获取用户信息为" + userInfo.getName());
}
}
/**
* 更新文档信息
* */
@Test
void updateDocument() throws IOException {
//new 更新 请求对象
UpdateRequest updateRequest = new UpdateRequest("users","_doc");
updateRequest.id("1");
//要修改该的对象
UserInfo userInfo = new UserInfo();
userInfo.setAge("22");
//将对象转换成json字符串
String userInfoStr = JSON.toJSONString(userInfo);
updateRequest.doc(userInfoStr,XContentType.JSON);
//执行更新文档
UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
System.out.println("执行结果"+ update.getResult());
}
/**
* 删除文档信息
* */
@Test
void deleteDocument() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("users");
deleteRequest.id("1");
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println("删除状态"+ deleteResponse.getResult());
}
/**
* 精确查询term
* */
@Test
void termQuery() throws IOException {
//创建查询对象
SearchRequest searchRequest = new SearchRequest("students");
//构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("name","wangwu2"));
searchRequest.source(searchSourceBuilder);
//执行查询
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(searchResponse.status());
if (searchResponse.getHits().getTotalHits().value > 0){
SearchHits hits = searchResponse.getHits();
for (SearchHit hit:hits){
String sourceAsString = hit.getSourceAsString();
UserInfo userInfo = JSON.parseObject(sourceAsString, UserInfo.class);
System.out.println("获取用户信息" + userInfo.getName());
}
}
}
/**
* 精确查询term
* 多个内容在一个字段中查询
* */
@Test
void termsQuery() throws IOException {
//创建查询对象
SearchRequest searchRequest = new SearchRequest("students");
//构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termsQuery("name","wangwu2","wangwu3","wangwu1"));
searchRequest.source(searchSourceBuilder);
//执行查询
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(searchResponse.status());
if (searchResponse.getHits().getTotalHits().value > 0){
SearchHits hits = searchResponse.getHits();
for (SearchHit hit:hits){
String sourceAsString = hit.getSourceAsString();
UserInfo userInfo = JSON.parseObject(sourceAsString, UserInfo.class);
System.out.println("获取用户信息" + userInfo.getName());
}
}
}
/**
* 匹配查询符合条件的所有数据,并设置分页
*/
@Test
void matchAllQuery() {
try {
// 构建查询条件
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
// 创建查询源构造器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(matchAllQueryBuilder);
// 设置分页
searchSourceBuilder.from(0);
searchSourceBuilder.size(3);
// 设置排序
searchSourceBuilder.sort("salary", SortOrder.ASC);
// 创建查询请求对象,将查询对象配置到其中
SearchRequest searchRequest = new SearchRequest("mydlq-user");
searchRequest.source(searchSourceBuilder);
// 执行查询,然后处理响应结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 根据状态和数据条数验证是否返回了数据
if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) {
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits) {
// 将 JSON 转换成对象
UserInfo userInfo = JSON.parseObject(hit.getSourceAsString(), UserInfo.class);
// 输出查询信息
System.out.println(userInfo.toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 匹配查询数据
*/
@Test
void matchQuery() {
try {
// 构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("address", "*通州区"));
// 创建查询请求对象,将查询对象配置到其中
SearchRequest searchRequest = new SearchRequest("mydlq-user");
searchRequest.source(searchSourceBuilder);
// 执行查询,然后处理响应结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 根据状态和数据条数验证是否返回了数据
if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) {
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits) {
// 将 JSON 转换成对象
UserInfo userInfo = JSON.parseObject(hit.getSourceAsString(), UserInfo.class);
// 输出查询信息
System.out.println(userInfo.toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 词语匹配查询
*/
@Test
void matchPhraseQuery() {
try {
// 构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchPhraseQuery("address", "北京市通州区"));
// 创建查询请求对象,将查询对象配置到其中
SearchRequest searchRequest = new SearchRequest("mydlq-user");
searchRequest.source(searchSourceBuilder);
// 执行查询,然后处理响应结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 根据状态和数据条数验证是否返回了数据
if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) {
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits) {
// 将 JSON 转换成对象
UserInfo userInfo = JSON.parseObject(hit.getSourceAsString(), UserInfo.class);
// 输出查询信息
System.out.println(userInfo.toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 内容在多字段中进行查询
*/
@Test
void matchMultiQuery() {
try {
// 构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.multiMatchQuery("北京市", "address", "remark"));
// 创建查询请求对象,将查询对象配置到其中
SearchRequest searchRequest = new SearchRequest("mydlq-user");
searchRequest.source(searchSourceBuilder);
// 执行查询,然后处理响应结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 根据状态和数据条数验证是否返回了数据
if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) {
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits) {
// 将 JSON 转换成对象
UserInfo userInfo = JSON.parseObject(hit.getSourceAsString(), UserInfo.class);
// 输出查询信息
System.out.println(userInfo.toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 模糊查询所有以 “三” 结尾的姓名
*/
@Test
void fuzzyQuery() {
try {
// 构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.fuzzyQuery("name", "三").fuzziness(Fuzziness.AUTO));
// 创建查询请求对象,将查询对象配置到其中
SearchRequest searchRequest = new SearchRequest("mydlq-user");
searchRequest.source(searchSourceBuilder);
// 执行查询,然后处理响应结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 根据状态和数据条数验证是否返回了数据
if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) {
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits) {
// 将 JSON 转换成对象
UserInfo userInfo = JSON.parseObject(hit.getSourceAsString(), UserInfo.class);
// 输出查询信息
System.out.println(userInfo.toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 查询岁数 ≥ 30 岁的员工数据
*/
@Test
void rangeQuery() {
try {
// 构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.rangeQuery("age").gte(30));
// 创建查询请求对象,将查询对象配置到其中
SearchRequest searchRequest = new SearchRequest("mydlq-user");
searchRequest.source(searchSourceBuilder);
// 执行查询,然后处理响应结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 根据状态和数据条数验证是否返回了数据
if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) {
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits) {
// 将 JSON 转换成对象
UserInfo userInfo = JSON.parseObject(hit.getSourceAsString(), UserInfo.class);
// 输出查询信息
System.out.println(userInfo.toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 查询距离现在 30 年间的员工数据
* [年(y)、月(M)、星期(w)、天(d)、小时(h)、分钟(m)、秒(s)]
* 例如:
* now-1h 查询一小时内范围
* now-1d 查询一天内时间范围
* now-1y 查询最近一年内的时间范围
*/
@Test
void dateRangeQuery() {
try {
// 构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// includeLower(是否包含下边界)、includeUpper(是否包含上边界)
searchSourceBuilder.query(QueryBuilders.rangeQuery("birthDate")
.gte("now-30y").includeLower(true).includeUpper(true));
// 创建查询请求对象,将查询对象配置到其中
SearchRequest searchRequest = new SearchRequest("mydlq-user");
searchRequest.source(searchSourceBuilder);
// 执行查询,然后处理响应结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 根据状态和数据条数验证是否返回了数据
if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) {
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits) {
// 将 JSON 转换成对象
UserInfo userInfo = JSON.parseObject(hit.getSourceAsString(), UserInfo.class);
// 输出查询信息
System.out.println(userInfo.toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
参考博客elasticsearch 基础介绍及使用 (high-level-client)_JKjiang123的博客-CSDN博客_elasticsearch highlevelclient