最近项目中需要用到es查询数据,就自己springboot环境集成了elasticsearch,结果使用时候一直出错,直接请求es地址是没问题的,就查了好多资料,现在记录一下
1.遇到的问题
发生ccs_minimize_roundtrips 问题
{“error”:{“root_cause”:[{“type”:“illegal_argument_exception”,“reason”:“request [/logstash-filebeat-label_timely_detail_202105_v1/_search] contains unrecognized parameter: [ccs_minimize_roundtrips]”}],“type”:“illegal_argument_exception”,“reason”:“request [/logstash-filebeat-label_timely_detail_202105_v1/_search] contains unrecognized parameter: [ccs_minimize_roundtrips]”},“status”:400}
查询资料说是版本问题,我的SpringBoot版本是2.3.7.RELEASE,elasticsearch版本默认是7.6.2,需要保持一致,我改了elasticsearch版本为7.6.2,结果还是发生上面那个问题
通过直接请求es,说明es安装上没有问题的,注意es的版本是6.7.0,不能使用7.*版本,所以本地把elasticsearch版本改成了6.4.2,同时需要修改springboot版本,与elasticsearch6.4.2版本对于的是springboot版本2.1.5,重启请求发现不出错了
2.maven配置
springboot
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
elasticsearch
<!-- es -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.4.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.4.2</version>
</dependency>
3.项目中使用
ElasticsearchConfig
@Configuration
public class ElasticsearchConfig {
@Value("${elasticsearch.hostname}")
private String hostname;
@Value("${elasticsearch.port}")
private int port;
/**
* HighLevelRestConfig
*
* @param
* @return org.elasticsearch.client.RestClient
* @author wliduo[i@dolyw.com]
* @date 2019/8/12 18:56
*/
@Bean
public RestHighLevelClient restHighLevelClient() {
// 如果有多个从节点可以持续在内部new多个HttpHost,参数1是IP,参数2是端口,参数3是通信协议
return new RestHighLevelClient(RestClient.builder(new HttpHost(hostname, port, "http")));
}
application.xml
# Elasticsearch配置
elasticsearch.hostname=10.185.**.**
elasticsearch.port=9200
service中使用
@Autowired
private RestHighLevelClient restHighLevelClient;
@Override
public ResponseData sampleSearch(ContentSampleSearchDTO sampleSearchDTO) throws Exception {
String date =DateUtils.format(new Date(),"yyyyMM");
SearchRequest searchRequest = new SearchRequest(String.format(CommonConst.ELASTICSEARCH_CONTENT_INDEX,date));
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//一级标签
if (CheckUtil.isNotBlank(sampleSearchDTO.getFtag())) {
queryBuilder.should(QueryBuilders.matchQuery("columns.level1_tagid", sampleSearchDTO.getFtag()));
}
//二级标签
if (CheckUtil.isNotBlank(sampleSearchDTO.getStag())) {
queryBuilder.should(QueryBuilders.matchQuery("columns.level2_tagid", sampleSearchDTO.getStag()));
}
//三级标签
if (CheckUtil.isNotBlank(sampleSearchDTO.getTag())) {
queryBuilder.should(QueryBuilders.matchQuery("columns.level3_tagid", sampleSearchDTO.getTag()));
}
//mid
if (CheckUtil.isNotBlank(sampleSearchDTO.getMid())) {
String[] mids = sampleSearchDTO.getMid().split(",");
queryBuilder.should(QueryBuilders.termsQuery("columns.mid", mids));
}
//关键词类型
if (CheckUtil.isNotBlank(sampleSearchDTO.getKeywordType())) {
queryBuilder.should(QueryBuilders.matchQuery("columns.keyword_type", sampleSearchDTO.getKeywordType()));
}
//关键词
if (CheckUtil.isNotBlank(sampleSearchDTO.getKeyword())) {
queryBuilder.should(QueryBuilders.matchQuery("columns.keyword", sampleSearchDTO.getKeyword()));
}
//开始时间
if (CheckUtil.isNotBlank(sampleSearchDTO.getStartTime())) {
queryBuilder.should(QueryBuilders.rangeQuery("columns.mark_time").gte(sampleSearchDTO.getStartTime()));
}
//结束时间
if (CheckUtil.isNotBlank(sampleSearchDTO.getEndTime())) {
queryBuilder.should(QueryBuilders.rangeQuery("columns.mark_time").lte(sampleSearchDTO.getStartTime()));
}
sourceBuilder.query(queryBuilder);
sourceBuilder.from(0).size(10);
searchRequest.source(sourceBuilder);
// 查询ES
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] result = searchResponse.getHits().getHits();
// 处理返回数据
JSONArray array = new JSONArray();
for (SearchHit hit :result){
Map<String, Object> map = hit.getSourceAsMap();
JSONObject json = new JSONObject(map);
array.add(json.getJSONObject("columns"));
}
return ResponseData.success().setData(array);
}