package com.example.demo.service
import com.alibaba.fastjson.JSON
import com.example.demo.User
import com.tdunning.math.stats.Sort
import lombok.extern.slf4j.Slf4j
import org.apache.lucene.search.TotalHits
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.support.WriteRequest
import org.elasticsearch.action.update.UpdateRequest
import org.elasticsearch.action.update.UpdateResponse
import org.elasticsearch.client.RequestOptions
import org.elasticsearch.client.RestHighLevelClient
import org.elasticsearch.common.xcontent.XContentType
import org.elasticsearch.index.query.BoolQueryBuilder
import org.elasticsearch.index.query.QueryBuilders
import org.elasticsearch.search.SearchHit
import org.elasticsearch.search.SearchHits
import org.elasticsearch.search.builder.SearchSourceBuilder
import org.elasticsearch.search.sort.FieldSortBuilder
import org.elasticsearch.search.sort.SortBuilders
import org.elasticsearch.search.sort.SortOrder
import org.springframework.stereotype.Service
import javax.annotation.Resource
import java.util.ArrayList
import java.util.List
/**
* @author zhangjun
* @date 2021/6/21 17:00
*/
@Service
@Slf4j
public class UserServiceImpl<T> implements UserService<T> {
@Resource
private RestHighLevelClient restHighLevelClient
@Override
public Boolean insertUser(User user) {
IndexRequest indexRequest = new IndexRequest("test_es")
indexRequest.id(user.getId().toString())
indexRequest.source(JSON.toJSONString(user), XContentType.JSON)
try {
indexRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
IndexResponse index = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT)
log.info("index:{}", JSON.toJSONString(index))
} catch (Exception e) {
log.error("error:", e)
return false
}
return true
}
@Override
public Boolean updateUser(User user) {
UpdateRequest updateRequest = new UpdateRequest("test_es", user.getId().toString())
updateRequest.doc(JSON.toJSONString(user), XContentType.JSON)
updateRequest.docAsUpsert(true)
try {
updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT)
log.info("update:{}", JSON.toJSONString(update))
} catch (Exception e) {
log.error("error update:", e)
}
return true
}
@Override
public List<T> search(User user, Class<T> clazz) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
boolQueryBuilder.must(QueryBuilders.matchQuery("age", 26))
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
sourceBuilder.query(boolQueryBuilder)
sourceBuilder.from(0)
sourceBuilder.size(5)
sourceBuilder.sort("id",SortOrder.DESC)
SearchRequest searchRequest = new SearchRequest("test_es")
searchRequest.source(sourceBuilder)
List<T> list = new ArrayList<>()
try {
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT)
log.info("search:{}", JSON.toJSONString(search))
SearchHits hits = search.getHits()
long totalHits = hits.getTotalHits().value
log.info("totalHits:{}",totalHits)
SearchHit[] searchHits = hits.getHits()
for(SearchHit searchHit:searchHits){
T t = JSON.parseObject(searchHit.getSourceAsString(), clazz)
list.add(t)
}
} catch (Exception e) {
}
return list
}
}
package com.example.demo.util;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
@Configuration
public class EsConfig {
private static String hosts = "127.0.0.1";
private static int port = 9200;
private static String schema = "http";
private static ArrayList<HttpHost> hostList = null;
private static int connectTimeOut = 1000;
private static int socketTimeOut = 30000;
private static int connectionRequestTimeOut = 500;
private static int maxConnectNum = 100;
private static int maxConnectPerRoute = 100;
static {
hostList = new ArrayList<>();
String[] hostStrs = hosts.split(",");
for (String host : hostStrs) {
hostList.add(new HttpHost(host, port, schema));
}
}
@Bean
public RestHighLevelClient client() {
RestClientBuilder builder = RestClient.builder(hostList.toArray(new HttpHost[0]));
builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
requestConfigBuilder.setConnectTimeout(connectTimeOut);
requestConfigBuilder.setSocketTimeout(socketTimeOut);
requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
return requestConfigBuilder;
}
});
builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.setMaxConnTotal(maxConnectNum);
httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
return httpClientBuilder;
}
});
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
}
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.3.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.3.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.3.1</version>
</dependency>