查询方法
@Override
public Page<Object> queryLoanListFromElasticSearch(QueryDomain queryDomain){
BoolQueryBuilder boolQueryBuilder = getQueryByEntity(queryDomain);
return getSearchRequestResult(boolQueryBuilder, queryDomain, null);
}
查询结果方法
Page<Object> getSearchRequestResult(QueryBuilder queryBuilder, PageDomain queryListDomain, String sortString){
Page<Object> page = new Page<>();
SearchRequest searchRequest = new SearchRequest(index);
searchRequest.types(type);
// TODO 分片
searchRequest.routing();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(queryBuilder);
// sourceBuilder.sort(new FieldSortBuilder("id").order(SortOrder.DESC));
sourceBuilder.sort(new FieldSortBuilder(sortString == null ? "dateCreated" : sortString).order(SortOrder.DESC));
if(queryListDomain == null){
queryListDomain = new PageDomain();
}
sourceBuilder.from((queryListDomain.getPageNo() - 1) * queryListDomain.getPageSize());
sourceBuilder.size(queryListDomain.getPageSize());
sourceBuilder.timeout(new TimeValue(50, TimeUnit.SECONDS));
searchRequest.source(sourceBuilder);
long totalHits = 0;
List<Object> list = null;
try {
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
totalHits = search.getHits().getTotalHits();
list = new ArrayList<>();
for(SearchHit searchHit : search.getHits()){
Object object = JSONObject.parseObject(searchHit.getSourceAsString(), Object.class);
list.add(object);
}
} catch (IOException e) {
log.error("进行 elasticSearch t_loan 表查询异常", e);
}
page.setTotal(totalHits);
page.setRows(list);
return page;
}
封装的查询条件
// 查询条件
BoolQueryBuilder getQueryByEntity(QueryListDomain query){
formatQueryTime(query);
// query 条件
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
// 完全匹配
if(query.getLoanSource().size() > 0){
queryBuilder.must(QueryBuilders.termsQuery("loanSource.keyword", query.getLoanSource()));
}
// 模糊
if(StringUtils.isNotEmpty(query.getCustNo())){
queryBuilder.must(QueryBuilders.matchPhraseQuery("custNo", query.getCustNo()));
}
List<String> address = new ArrayList<>();
if(query.getAddressArr() != null && query.getAddressArr().length > 0){
address.add(StringUtils.join(query.getAddressArr(), ""));
}
if(query.getAddressCensus() != null && query.getAddressCensus().length > 0){
address.add(StringUtils.join(query.getAddressCensus(), ""));
}
// 多个or
if(address.size() > 0) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
address.stream().forEach(str -> {
boolQueryBuilder.should(QueryBuilders.matchPhrasePrefixQuery("address.keyword", str));
});
queryBuilder.must(boolQueryBuilder);
}
// 范围
if(query.getLoanBalMax() != null && query.getLoanBalMin() != null){
// 剩余本金
queryBuilder.must(QueryBuilders.rangeQuery("loanBal").gte(query.getLoanBalMin().doubleValue()).lt(query.getLoanBalMax().doubleValue()));
}else if(query.getLoanBalMin() != null){
queryBuilder.must(QueryBuilders.rangeQuery("loanBal").gte(query.getLoanBalMin().doubleValue()));
}else if(query.getLoanBalMax() != null){
queryBuilder.must(QueryBuilders.rangeQuery("loanBal").lt(query.getLoanBalMax().doubleValue()));
}
// 完全匹配
if(StringUtils.isNotEmpty(query.getSourceName())){
queryBuilder.must(QueryBuilders.termsQuery("sourceName", query.getSourceName()));
}
return queryBuilder;
}
/**
* 转换日期
*/
private void formatQueryTime(QueryListDomain queryDomain) {
// str to date
if (queryDomain.getOverDueDaysMin() != null) {
Date endDate = DateUtils.reduceDay(new Date(), queryDomain.getOverDueDaysMin());
queryDomain.setOverDueDateEnd(DateUtils.getTheDayEnd(endDate));
}
}
es DAO
@Configuration
@Log4j2
public class ElasticSearchConfig{
@Value("${elastic.search.cluster.name:my-app}")
String clusterName;
@Value("${elastic.search.host:localhost:9200}")
String host;
@Value("${elastic.search.username:")
String userName;
@Value("${elastic.search.password:}")
String password;
@PostConstruct
void init(){
System.setProperty("es.set.netty.runtime.available.processors", "false");
}
@Bean
public RestHighLevelClient restHighLevelClient(){
String[] split = host.split(":");
final CredentialsProvider credentialProvider = new BasicCredentialsProvider();
credentialProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost(split[0], Integer.parseInt(split[1])))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
httpAsyncClientBuilder.disableAuthCaching();
return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialProvider);
}
}));
return restHighLevelClient;
}
}
ES搭建可视化图形查询Kibana 界面
1. 下载对应版本 Kibana
2. 解压及访问
ES 创建索引mapping