前言
本篇文字我记录了ES相关的部分查询方法。
提示:以下是本篇文章正文内容,下面案例可供参考
一、分词条件查询(and/or)
代码如下(示例):
controller
/**
* 功能描述: 分词条件查询(and/or)
*
* @param indexName 索引名
* @param queryObjectList
* @return : List<Map<String, String>>
*/
@PostMapping("/participle")
@ApiOperation(value = "分词条件查询", notes = "根据索引名、域名、查询关键字分词查询数据")
public BasePageResponse participleQuery(@RequestParam("indexName") String indexName,
@RequestBody @Validated List<QueryObject> queryObjectList,
@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
@RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize
) throws IOException, SelectException {
return pageOk(esqService.participleQuery(indexName, queryObjectList, page, pageSize));
}
service
public Page participleQuery(String indexName, List<QueryObject> queryObjectList,Integer page,Integer pageSize) throws IOException, SelectException {
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
List<QueryBuilder> should = boolQueryBuilder.should();
HighlightBuilder highlightBuilder = new HighlightBuilder().preTags(Constant.PRESPAN).postTags(Constant.POSTSPAN);
List<HighlightBuilder.Field> fields = highlightBuilder.fields();
for (QueryObject queryObject : queryObjectList) {
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery(queryObject.getField(), queryObject.getData()).operator(queryObject.getChoice() ? Operator.OR : Operator.AND);
should.add(matchQueryBuilder);
fields.add(new HighlightBuilder.Field(queryObject.getField()));
sourceBuilder.highlighter(highlightBuilder);
searchRequest.source(sourceBuilder);
}
sourceBuilder.query(boolQueryBuilder);
sourceBuilder.highlighter(highlightBuilder);
searchRequest.source(sourceBuilder);
sourceBuilder.from(page-1);//从第几条开始(相当于ES 里大括号下的page)
sourceBuilder.size(pageSize);//查询多少条(相当于ES 里大括号下的pageSize)
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
SearchHit[] hitsHits = hits.getHits();
List list = new ArrayList();
for (SearchHit hitsHit : hitsHits) {
String sourceAsString = hitsHit.getSourceAsString();
Map<String, String> map = JSONObject.fromObject(sourceAsString);
// 获取高亮结果,替换goods中的title
Map<String, HighlightField> highlightFields = hitsHit.getHighlightFields();
for (QueryObject queryObject : queryObjectList) {
HighlightField highlightField = highlightFields.get(queryObject.getField());
if (highlightField == null) {
continue;
}
Text[] fragments = highlightField.fragments();
String fieldValue = fragments[0].toString();
map.put(queryObject.getField(), fieldValue);
list.add(JSONObject.fromObject(map).toString());
}
}
Page pages = new Page(page, pageSize);
pages.setTotal(hits.getTotalHits().value);
pages.setRecords(list);
return pages;
}
二、通配符模糊查询 * or ?
代码如下(示例):
controller
/**
* 功能描述: 通配符模糊查询 * or ?
*
* @param indexName 索引名
* @return : java.util.List<java.util.Map<java.lang.String,java.lang.String>>
*/
@PostMapping("/wildcard")
@ApiOperation(value = "模糊通配符查询", notes = "根据*/?查询数据")
public BasePageResponse wildcardQuery(@RequestParam("indexName") String indexName, @Validated @RequestBody List<QueryObject> queryObjectList,
@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
@RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize)
throws SelectException, IOException {
if (queryObjectList == null || queryObjectList.isEmpty()) {
throw new SelectException(ResponseEnum.DATA_NULL);
}
return pageOk(esqService.wildcardQuery(indexName, queryObjectList, page, pageSize));
}
service
public Page wildcardQuery(String indexName, List<QueryObject> queryObjectList,Integer page,Integer pageSize) throws SelectException, IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
List<QueryBuilder> should = boolQueryBuilder.should();
HighlightBuilder highlightBuilder = new HighlightBuilder().preTags(Constant.PRESPAN).postTags(Constant.POSTSPAN);
List<HighlightBuilder.Field> fields = highlightBuilder.fields();
for (QueryObject queryObject : queryObjectList) {
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery(queryObject.getField(), queryObject.getData() + (queryObject.getChoice() ? "*" : "?"));
should.add(wildcardQueryBuilder);
fields.add(new HighlightBuilder.Field(queryObject.getField()));
sourceBuilder.highlighter(highlightBuilder);
searchRequest.source(sourceBuilder);
}
sourceBuilder.query(boolQueryBuilder);
sourceBuilder.highlighter(highlightBuilder);
searchRequest.source(sourceBuilder);
sourceBuilder.from(page-1); //从第几条开始(相当于ES 里大括号下的page)
sourceBuilder.size(pageSize); //查询多少条(相当于ES 里大括号下的pageSize)
SearchResponse searchResponse = restHighLevelClient.search(searchRequest