库中数据有一批老旧的数据,还有最近刚录入的新数据,查询是需要匹配后优先显示最新录入的,最开始i只是用的简单的分词和匹配,但是查询结果一直不如意最后改造了一下!
首先建立索引后进行设置mapping,其中name是我要用ik进行分词的字段,直接建立在建立mapping时增加解析 ik_smart
建立的mapping如下
{
"properties":{
"createTime": {
"type": "date"
},
"fileSize": {
"type": "text"
},
"id": {
"type": "text"
},
"name": {
"type": "text",
"analyzer": "ik_smart"
},
"suffix": {
"type": "keyword"
},
"updateTime": {
"type": "date"
},
"url": {
"type": "text"
}
}
}
在SpringBoot中查询逻辑如下,注意在搜索时需要使用解析器ik_smart进行分词
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder().withPageable(pageable);
BoolQueryBuilder queryBuilders = QueryBuilders.boolQuery();
// 使用IK分词
// 2<70% 如果分词数量小于等于2则全部必须 否则需要配70%左右
// operator(Operator.AND) 分词条件是并且
// boost(10) 分值乘以10
// withMinScore(5f) 最小分值为5分
// 最后按照时间排序
queryBuilders.must(
QueryBuilders.matchQuery("name",eslz.getName())
.analyzer("ik_smart")
.minimumShouldMatch("2<70%")
.operator(Operator.AND)
.boost(10)
);
nativeSearchQueryBuilder
.withMinScore(5f)
.withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC));
// 高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("name");
highlightBuilder.preTags("<span style='color:red'>");
highlightBuilder.postTags("</span>");
nativeSearchQueryBuilder.withHighlightBuilder(highlightBuilder);
NativeSearchQuery searchQuery = nativeSearchQueryBuilder.withQuery(queryBuilders).build();
SearchHits<EsLz> searchHits = elasticsearchRestTemplate.search(searchQuery,EsLz.class);
最终搜索结果还不错