目录
对于基础应用包下载和安装流程,这里大体跳过。需要的可以参考比较老版本的搭建流程
SpringBoot+Mybatis+Elasticsearch-2.X实现高亮分词搜索
这里主要说下高版本7.X跟以前的版本的不同之处
参考借鉴文章:
springboot整合Elasticsearch7.6实现简单查询及高亮分词查询
一、服务端安装搭建
安装下载此处省略,详情可以参看老版本。
启动的时候,进入bin目录, 运行启动 elasticsearch.bat
启动完成后,在浏览器输入 http://localhost:9200/
二、SpringBoot服务搭建
1、依赖配置
与2.X版本依赖不变,版本和配置变动。
7.X版本的配置:
spring:
elasticsearch:
rest:
uris: http://localhost:9200
public class EsConfig {
// @Value("${elasticsearch.url}")
// private String elasticsearchUrl;
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
/**
* 不使用默认配置路径信息,可以使用以下自定义
* localhost:9200 写在配置文件中就可以了
* @return
*/
// @Bean
// public RestHighLevelClient client() {
// ClientConfiguration clientConfiguration = ClientConfiguration.builder()
// .connectedTo(elasticsearchUrl)
// .build();
//
// return RestClients.create(clientConfiguration).rest();
// }
}
2、搜索
实体类
@Document(indexName = "universa_question")
@Data
public class QuestionAnswer implements Serializable {
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String content;
}
对ES注解有疑惑的可以简易参考
spring data elasticsearch的 @Documnet 和 @Field 注解
对应的ES和QuestionAnswer 的数据库连接方法实现类,依旧可参考老版本2.X文章的内容,这里不再二次梳理
3、高亮显示
这边文章主要也是为了介绍版本不同的高亮显示方式,直接上实现
需要注意:
以前的版本使用的是ElasticsearchRestTemplate客户端,新版本使用的是RestHighLevelClient
@Autowired
private RestHighLevelClient client;
public Response<List<QuestionAnswer>> findAnswerByTitle2(String content) {
List<QuestionAnswer> esProductTOS = new ArrayList<>();
//1.构建检索条件
SearchRequest searchRequest = new SearchRequest();
//2.指定要检索的索引库(与实体类定义的索引库同个或是不指定)
searchRequest.indices("universa_question");
//3.指定检索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
sourceBuilder.query(QueryBuilders.multiMatchQuery(content, "content"));
//4.结果高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.requireFieldMatch(true); //如果该属性中有多个关键字 则都高亮
highlightBuilder.field("content");//这里配置的是“content”字段,如有多个,自行添加
highlightBuilder.preTags("<span style='color:red'>");//高亮模式
highlightBuilder.postTags("</span>");
sourceBuilder.highlighter(highlightBuilder);
searchRequest.source(sourceBuilder);
SearchResponse response = null;
try {
response = client.search(searchRequest, EsConfig.COMMON_OPTIONS);
} catch (IOException e) {
e.printStackTrace();
}
org.elasticsearch.search.SearchHit[] hits = response.getHits().getHits();
for (org.elasticsearch.search.SearchHit hit : hits) {
//如果不做高亮,则可以直接转为json,然后转为对象
// String value = hit.getSourceAsString();
// ESProductTO esProductTO = JSON.parseObject(value, ESProductTO.class);
//解析高亮字段
//获取当前命中的对象的高亮的字段
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
log.info("json-hit: " + JSONObject.toJSONString(hit));
//查询精确后的匹配分数值(可以用入参来进行判断做筛选过滤条件)
float score = hit.getScore();
log.info("hit score : " + score);
HighlightField productName = highlightFields.get("content");
String newName = "";
if (productName != null) {
//获取该高亮字段的高亮信息
Text[] fragments = productName.getFragments();
//将前缀、关键词、后缀进行拼接
for (Text fragment : fragments) {
newName += fragment;
}
}
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
//将高亮后的值替换掉旧值(这里就是高亮显示的部分)
sourceAsMap.put("content", newName);
String json = JSONObject.toJSONString(sourceAsMap);
QuestionAnswer esProductTO = JSONObject.parseObject(json, QuestionAnswer.class);
esProductTOS.add(esProductTO);
}
return Response.success(esProductTOS);
}