springboot与es二三事之自定义权重进行分页高亮查询
1.控制器具体实现
前面的添加依赖、yml中增加es配置、索引实体类、实现Repository操作与springboot与es集成操作-基础篇保持一致。。。。。。
分页查询,高亮查询
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
@Autowired
private ElasticsearchRestTemplate restTemplate;
//使用es 自定义权重进行分页高亮查询
@GetMapping("/listSearch")
public RestResult<ListPageResult<SubstanceSearch>> getSubstanceAndArea(@RequestParam String name,
@RequestParam(defaultValue = "0") Integer pageNumber,
@RequestParam(defaultValue = "10") Integer pageSize) throws Exception {
ListPageResult<SubstanceSearch> result = new ListPageResult<SubstanceSearch>();
//高亮显示
String pre = "<strong>";
String post = "</strong>";
String[] list = null;
Map<String, Float> fields = null;
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//指定要高亮的字段将其加上头尾标签
fields = new HashMap(4);
list = substanceList;
//设置查询字段的权重
fields.put("name", 1f);
fields.put("displayName", 1f);
fields.put("CASNumber", 1f);
fields.put("typeName", 0.9f);
boolQueryBuilder.must(QueryBuilders.multiMatchQuery(name).fields(fields));
//高亮字段信息
HighlightBuilder.Field[] highlightFields = new HighlightBuilder.Field[list.length];
for (int i = 0; i < list.length; i++) {
HighlightBuilder.Field nameHight = new HighlightBuilder.Field(list[i]).preTags(pre).postTags(post).fragmentOffset(50);
highlightFields[i] = nameHight;
}
//构建Search对象
NativeSearchQuery build = new NativeSearchQueryBuilder()
//条件
.withQuery(boolQueryBuilder)
/* .withQuery(QueryBuilders.boolQuery()
.should(QueryBuilders.termQuery("name", name))
.should(QueryBuilders.termQuery("containSubstance", name)))*/
//排序
// .withSort(SortBuilders.fieldSort("controlTime").order(SortOrder.ASC))
//高亮
.withHighlightFields(highlightFields)
//分页
.withPageable(PageRequest.of(pageNumber, pageSize))
//构建
.build();
SearchHits<SubstanceSearch> search = restTemplate.search(build, SubstanceSearch.class);
// 得到查询结果返回的内容
List<SearchHit<SubstanceSearch>> searchHits = search.getSearchHits();
// 设置一个需要返回的实体类集合
List<SubstanceSearch> discussPosts = new ArrayList<>();
// 遍历返回的内容进行处理
for (SearchHit<SubstanceSearch> searchHit : searchHits) {
// 高亮的内容
Map<String, List<String>> highLightFields = searchHit.getHighlightFields();
// 将高亮的内容填充到content中
searchHit.getContent().setName(highLightFields.get("name") == null ? searchHit.getContent().getName() : highLightFields.get("name").get(0));
searchHit.getContent().setDisplayName(highLightFields.get("displayName") == null ? searchHit.getContent().getDisplayName() : highLightFields.get("displayName").get(0));
searchHit.getContent().setContain(highLightFields.get("contain") == null ? searchHit.getContent().getContain() : highLightFields.get("contain").get(0));
searchHit.getContent().setCASNumber(highLightFields.get("CASNumber") == null ? searchHit.getContent().getCASNumber() : highLightFields.get("CASNumber").get(0));
// 放到实体类中
discussPosts.add(searchHit.getContent());
}
//计算分页信息
long pages = search.getTotalHits() == 0 ? 0 : (search.getTotalHits() % pageSize == 0 ? search.getTotalHits() / pageSize : (search.getTotalHits() / pageSize) + 1);
result = new ListPageResult<SubstanceSearch>(pageSize, pageNumber, pages, search.getTotalHits(), discussPosts);
return RestResultHelper.success(result);
}
ListPageResult实体情况
@ApiModel("分页结果")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ListPageResult<Entity> {
@ApiModelProperty(value = "每页记录数", name = "pageSize", dataType = "long", example = "10")
private long pageSize;
@ApiModelProperty(value = "页序", name = "pageNumber", dataType = "long", example = "1")
private long pageNumber;
@ApiModelProperty(value = "总页数", name = "pageCount", dataType = "long", example = "0")
private long pageCount;
@ApiModelProperty(value = "总记录数", name = "recordCount", dataType = "long", example = "0")
private long recordCount;
@ApiModelProperty(value = "记录", name = "list", dataType = "Entity[]", example = "[]")
private List<Entity> list;
}