主要是Elasticsearch使用searchguard后Java连接及安全验证
证书生成方式不同DN不同,要查看DN确保正确(命令可百度查看证书DN)。同时search guard配置文件中要加入该DN账户给该DN以账户和权限。
https://www.jianshu.com/p/91faac8e18cf
https://blog.csdn.net/z1x2c34/article/details/77968955#commentBox
Settings settings = Settings.builder()
.put("searchguard.ssl.transport.enabled", true)
.put("searchguard.ssl.transport.keystore_filepath",xxx)
.put("searchguard.ssl.transport.truststore_filepath",xxx)
.put("searchguard.ssl.transport.keystore_password", "xxx")
.put("searchguard.ssl.transport.truststore_password", "xxx")
.put("searchguard.ssl.http.keystore_password", "xxx")
.put("searchguard.ssl.http.truststore_password", "xxx")
.put("searchguard.ssl.transport.enforce_hostname_verification", false)
.put("client.transport.ignore_cluster_name", true)
.build();
Common passwords
Truststore password: xxx
Admin keystore and private key password: xxx
ObjectMapper mapper = new ObjectMapper();
try {
mapJackson = mapper.writeValueAsString(xcBean);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
//指定index和type
BulkRequestBuilder bulkRequest = esClient.prepareBulk();
bulkRequest.add(esClient.prepareIndex("xingce", "xc").setSource(mapJackson, XContentType.JSON));
if (count % 500 == 0) {
bulkRequest.execute().actionGet();
//此处新建一个bulkRequest,类似于重置效果。避免重复提交
bulkRequest = esClient.prepareBulk();
}
/**
* 拼接查询条件
**/
public QueryBuilder getQb(EsPageRequestBean esPageRequestBean) {
//多条件设置
MatchQueryBuilder mpq1 = QueryBuilders
.matchQuery(ES_TITLE, esPageRequestBean.getQuery());
MatchQueryBuilder mpq2 = QueryBuilders
.matchQuery(ES_QUESTIONS, esPageRequestBean.getQuery());
MatchQueryBuilder mpq3 = QueryBuilders
.matchQuery(ES_MATERIALS, esPageRequestBean.getQuery());
QueryBuilder qb = QueryBuilders.boolQuery()
.should(mpq1)
.should(mpq2)
.should(mpq3);
return qb;
}
/**
* 拼接高亮查询
**/
public HighlightBuilder getHb() {
HighlightBuilder hiBuilder = new HighlightBuilder();
//这里设置包含高亮关键字的标签
hiBuilder.preTags("").postTags("");
//这里fields中设置需要高亮显示的查询字段,名字是Es中的字段名
hiBuilder.field(ES_TITLE).field(ES_QUESTIONS).field(ES_MATERIALS);
return hiBuilder;
}
//查询建立
SearchRequestBuilder responseBuilder = esClient
.prepareSearch("interview").setTypes("iv");
//第一次查询建立获取总条数分页使用
SearchResponse myResponse = responseBuilder
.setQuery(qb)
.setSearchType(SearchType.QUERY_THEN_FETCH)
.setSize(0)
.setExplain(true).execute().actionGet();
//获取总数
long counts = myResponse.getHits().totalHits;
//根据分页信息查询
SearchResponse pageResponse = responseBuilder
.setQuery(qb)
.highlighter(hiBuilder)
.setFrom((esRequestBean.getPage() - 1) * esRequestBean.getPageSize()).setSize(esRequestBean.getPageSize())
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setExplain(true).execute().actionGet();
SearchHits pageHits = pageResponse.getHits();
//循环装配bean
for (SearchHit searchHit : pageHits) {
Map source = searchHit.getSource();
HighlightField titleHighlight = searchHit.getHighlightFields().get(ES_TITLE);
HighlightField questionHighlight = searchHit.getHighlightFields().get(ES_QUESTIONS);
HighlightField materialsHighlight = searchHit.getHighlightFields().get(ES_MATERIALS);
//这里将取出的json数据转成bean再处理
YourBean yourBean = (YourBean) JSONObject.toBean(JSONObject.fromObject(source), YourBean.class, classMap);
.....
.....
}
//对于嵌套数组类型,从Es中读取时需先反射定义好map
Map classMap = new HashMap();
classMap.put("es中字段", 接收该字段Bean.class);
具体相关代码于本人GitHub:https://github.com/liyifan687/Elasticsearch