一、前言
上個版本使用springdata elasticsearch,但是也只是支持到了elasticsearch 2點幾的版本,並不適合繼續深入的挖掘。本次使用elasticsearch6.4.2版本,使用RestHighLevelClient客戶端,吐嘈一下,transport客戶端真的噁心,各種莫名其妙的錯誤,什麼堆棧溢出,找不到節點,反正不好用,個人感覺。
二、配置
1.application.properties
#Elasticserch
elasticsearch.port=9200
elasticsearch.ip=127.0.0.1
elasticsearch.connectTimeOut=1000
elasticsearch.socketTimeOut=30000
elasticsearch.connectionRequestTimeOut=500
elasticsearch.maxConnectNum=100
elasticsearch.maxConnectPerRoute=100
注意:9200,不是9300,9200纔是rest的端口
2.ElasticsearchConfig
private ArrayList<HttpHost> hostList;
@Value(value = "${elasticsearch.port}")
private Integer port;
@Value(value = "${elasticsearch.ip}")
private String hosts;
/** 連接超時時間 */
@Value("${elasticsearch.connectTimeOut}")
private static int connectTimeOut;
/** 連接超時時間 */
@Value("${elasticsearch.socketTimeOut}")
private static int socketTimeOut;
/** 獲取連接的超時時間 */
@Value("${elasticsearch.connectionRequestTimeOut}")
private int connectionRequestTimeOut;
/** 最大連接數 */
@Value("${elasticsearch.maxConnectNum}")
private int maxConnectNum;
/** 最大路由連接數 */
@Value("${elasticsearch.maxConnectPerRoute}")
private int maxConnectPerRoute;
@PostConstruct
public void init() {
hostList = new ArrayList<>();
String[] hostStrs = hosts.split(",");
for (String host : hostStrs) {
// 使用的協議
String schema = "http";
hostList.add(new HttpHost(host, port, schema));
}
}
@Bean
public RestHighLevelClient client() {
RestClientBuilder builder = RestClient.builder(hostList.toArray(new HttpHost[0]));
// 異步httpclient連接延時配置
builder.setRequestConfigCallback(requestConfigBuilder -> {
requestConfigBuilder.setConnectTimeout(connectTimeOut);
requestConfigBuilder.setSocketTimeout(socketTimeOut);
requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
return requestConfigBuilder;
});
// 異步httpclient連接數配置
builder.setHttpClientConfigCallback(httpClientBuilder -> {
httpClientBuilder.setMaxConnTotal(maxConnectNum);
httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
return httpClientBuilder;
});
return new RestHighLevelClient(builder);
}
注意:PostConstruct設置該方法爲init方法
三、es操作工具類
private final RestHighLevelClient restHighLevelClient;
private static final String ES_TYPE = "article";
private static final String ES_INDEX = "article";
@Autowired
public EsUtil(RestHighLevelClient restHighLevelClient) {
this.restHighLevelClient = restHighLevelClient;
}
@PostConstruct
public void init() throws IOException {
if (!existsIndex()) {
CreateIndexRequest request = new CreateIndexRequest("article");
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request,RequestOptions.DEFAULT);
log.info("createIndex: " + JSON.toJSONString(createIndexResponse));
}
}
private boolean existsIndex() throws IOException {
GetIndexRequest request = new GetIndexRequest();
request.indices("article");
boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
log.info("existsIndex: " + exists);
return exists;
}
public void addData(Blog blog, String id) throws IOException {
IndexRequest indexRequest = new IndexRequest(ES_INDEX, ES_TYPE, id);
indexRequest.source(JSONObject.toJSONString(blog), XContentType.JSON);
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.println("add: " + JSON.toJSONString(indexResponse));
}
public void updateDataById(Blog blog, String id) throws IOException {
UpdateRequest request = new UpdateRequest(ES_INDEX, ES_TYPE, id);
request.doc(JSONObject.toJSONString(blog), XContentType.JSON);
UpdateResponse updateResponse = restHighLevelClient.update(request, RequestOptions.DEFAULT);
log.info("update: " + JSON.toJSONString(updateResponse));
}
public void deleteDataById(String id) throws IOException {
DeleteRequest request = new DeleteRequest(ES_INDEX, ES_TYPE, id);
DeleteResponse deleteResponse = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
log.info("delete: "+JSON.toJSONString(deleteResponse));
}
public List<Blog> searchDataPage(int startRow, int size, BoolQueryBuilder queryBuilder) throws IOException {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(queryBuilder);
sourceBuilder.from(startRow);
// 獲取記錄數,默認10
sourceBuilder.size(size);
//設置高亮顯示
HighlightBuilder highlightBuilder = new HighlightBuilder().field("*").requireFieldMatch(false);
highlightBuilder.preTags("<span style=\"color:red\">");
highlightBuilder.postTags("</span>");
sourceBuilder.highlighter(highlightBuilder);
SearchRequest searchRequest = new SearchRequest(ES_INDEX);
searchRequest.types(ES_TYPE);
searchRequest.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//遍歷結果
for(SearchHit hit : response.getHits()){
Map<String, Object> source = hit.getSourceAsMap();
//處理高亮片段
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField nameField = highlightFields.get("title");
if(nameField!=null){
Text[] fragments = nameField.fragments();
StringBuilder nameTmp = new StringBuilder();
for(Text text:fragments){
nameTmp.append(text);
}
//將高亮片段組裝到結果中去
source.put("title", nameTmp.toString());
log.info(source.toString());
}
}
SearchHits hits = response.getHits();
SearchHit[] searchHits = hits.getHits();
List<Blog> blogList = new ArrayList<>();
for (SearchHit hit : searchHits) {
JSONObject jsonObject = new JSONObject(hit.getSourceAsMap());
log.info("search:{}", jsonObject.toJSONString());
blogList.add(JSONObject.toJavaObject(jsonObject, Blog.class));
}
return blogList;
}
四、效果
可以看見title已經有高亮的語法了。
五、github地址
https://github.com/sustly/blog_vue_server
注意:master分支纔是springcloud版本