- ES6.3.2
- Spring Boot 2.0.4
- Maven 3.5.4
首先強(qiáng)調(diào)一點(diǎn):使用Spring框架結(jié)合Maven進(jìn)行ES導(dǎo)入時(shí)捣炬,需要對ES版本號(hào)先行進(jìn)行聲明疗隶,否則Spring默認(rèn)版本和后續(xù)在依賴中的ES版本會(huì)報(bào)沖突
沖突報(bào)錯(cuò):Java API: java.lang.ClassNotFoundException: org.elasticsearch.common.settings.ImmutableSettings
pom修改位置:
與后續(xù)依賴的elasticsearch-rest-high-level-client版本一致。
搜索功能的Java Client
1 創(chuàng)建Client
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
RestClient.builder(new HttpHost(hostName,port,"http"))
)
給Client中配入ES集群的ip箩退,端口。
2 構(gòu)建匹配條件
QueryBuilder queryBuilder = QueryBuilders.termsQuery("model_classification.keyword","需要人工查看","直接推送");
QueryBuilder queryBuilder_title = QueryBuilders.matchQuery("title",keyword).boost(10);
構(gòu)建了兩條匹配條件突想,第一條匹配doc中的model_classification字段沃琅,要求其內(nèi)容需要為"需要人工查看","直接推送"中的任意一條哗咆;第二條匹配doc的title字段,要求其與keyword進(jìn)行比較益眉,并設(shè)置權(quán)重10.
3 組合匹配條件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
首先創(chuàng)建bool匹配條件
boolQueryBuilder.must(queryBuilder);
boolQueryBuilder.should(queryBuilder_title);
將之前構(gòu)造的匹配條件添加到bool條件中晌柬,用must去設(shè)定必須滿足的條件,should去設(shè)置加分項(xiàng)郭脂。
3 創(chuàng)建查詢
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.fetchSource(new String[]{"id","title","abstract","source","date"},null);
sourceBuilder.query(boolQueryBuilder);
…
sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));
sourceBuilder.sort(new FieldSortBuilder("_id").order(SortOrder.DESC));
在創(chuàng)建的查詢中可以設(shè)置需要獲取的字段年碘,需要匹配的條件等。同時(shí)可以設(shè)置排序字段展鸡,為了避免同分造成的排序振蕩現(xiàn)象屿衅,建議設(shè)置兩個(gè)字段。
4 創(chuàng)建搜索Request
SearchRequest request = new SearchRequest(indexName);
request.types(typeName);
request.searchType("dfs_query_then_fetch");
request.source(sourceBuilder);
創(chuàng)建Request莹弊,設(shè)置request針對的index和doc類型涤久,同時(shí)設(shè)定searchType并將上文構(gòu)建的查詢添加其中。
5 解析反饋結(jié)果
SearchResponse response = restHighLevelClient.search(request);
SearchHits hits = response.getHits();
for (SearchHit hit:hits) {
Map tempSource = hit.getSourceAsMap();
…
}
通過Client發(fā)起請求并捕獲response忍弛,從response中捕捉命中响迂,然后解析命中字段,命中字段中的source為doc中的存儲(chǔ)字段细疚,其它為一些ES集群添加的一些功能性字段蔗彤,如_source等。