库中数据有一批老旧的数据,还有最近刚录入的新数据,查询是需要匹配后优先显示最新录入的,最开始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);

最终搜索结果还不错

微信图片_20211223225909.png

最后修改:2021 年 12 月 23 日
如果觉得我的文章对你有用,请随意赞赏