es ik 多字段查询_SpringBoot+ES+Ik查询的问题

本文介绍了如何在SpringBoot中使用Elasticsearch(ES)和IK分词器进行多字段查询,包括精准匹配和模糊匹配。在实际应用中遇到问题,即精准匹配未达到预期效果,而模糊匹配正常。示例代码展示了DisMax查询构造过程,但发现查询结果包含了不期望的类型数据,如产品和C++等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前来说主要是一个字段要精准匹配。一个字段要分词匹配。我现有的查询貌似只能分词匹配。精准匹配的效果没实现。不知道是怎么回事。@Data

@Document(indexName = "interview", type = "blog", useServerConfiguration = true, createIndex = false)

public class ESCoderVo {

@Id

private Long id;

@Field(type = FieldType.Keyword,analyzer = "ik_max_word")

private String title;

@Field(type = FieldType.Keyword,analyzer = "ik_smart")

private String brief;

@Field(type = FieldType.Keyword,analyzer = "ik_smart")

private String label;

@Field(type = FieldType.Keyword,analyzer = "ik_smart")

private String content;

@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")

private String createTime;

@Field(type = FieldType.Keyword,analyzer = "ik_smart")

private String author;

@Field(type = FieldType.Keyword,analyzer = "ik_smart")

private String realUrl;

@Field(type = FieldType.Keyword,analyzer = "ik_smart")

private String txt;

@Field(type = FieldType.Keyword,analyzer = "ik_smart")

private String type;

@Field(type = FieldType.Keyword,analyzer = "ik_smart")

private Integer phaseId;

}

使用的代码@ApiOperation(value = "面经搜索")

@GetMapping(value = "/newcoder/search")

public Page search(@RequestParam(name = "pageNo",required = false) Integer pageNo,

@RequestParam(name = "pageSize",required = false) Integer pageSize,

@RequestParam(name = "keyword",required = false)String keyword

){

if (pageNo == null){

pageNo = 1;

}

if (pageSize==null){

pageSize =10;

}

Pageable pageable = PageRequest.of(pageNo,pageSize);// (当前页, 每页记录数, 排序方式)

//若索引不存在

// coderRepository.deleteAll();

// elasticsearchTemplate.deleteIndex(ESCoderVo.class);

if(!elasticsearchTemplate.indexExists(ESCoderVo.class)){

elasticsearchTemplate.deleteIndex(ESCoderVo.class);

//创建索引

elasticsearchTemplate.createIndex(ESCoderVo.class);

List list = newCoderRepository.findAll();

//将MySQL数据插入到ES

if(!CollectionUtils.isEmpty(list)){

List esList = JSON.parseArray(JSON.toJSONString(list), ESCoderVo.class);

coderRepository.saveAll(esList);

}

}

BoolQueryBuilder builder = QueryBuilders.boolQuery();

//

builder.must(QueryBuilders.termQuery("type","Java"));

SearchQuery searchQuery = new NativeSearchQueryBuilder()

.withQuery(builder)

.withQuery(structureQuery("阿里百度"))

.build();

//builder.should(QueryBuilders.matchQuery("title","阿里百度").boost(6.0f).analyzer("ik_max_word"));

//builder.should(QueryBuilders.matchQuery("label","阿里百度").boost(5.0f).analyzer("ik_smart"));

// builder.should(QueryBuilders.matchQuery("txt","阿里百度").boost(4.0f).analyzer("ik_smart"));

//Page page = coderRepository.search(searchQuery);

//System.out.println(page);

Page page = coderRepository.search(searchQuery);

//Page page = (Page) coderRepository.search(builder,pageable);

return page;

}

public DisMaxQueryBuilder structureQuery(String content) {

//使用dis_max直接取多个query中,分数最高的那一个query的分数即可

DisMaxQueryBuilder disMaxQueryBuilder = QueryBuilders.disMaxQuery();

//boost 设置权重,只搜索匹配name和disrector字段

//QueryBuilder typeQuery = QueryBuilders.termQuery("type","Java");

QueryBuilder ikNameQuery = QueryBuilders.matchQuery("title", content).boost(2f);

QueryBuilder ikBriefQuery = QueryBuilders.matchQuery("label", content).boost(2f);

QueryBuilder ikDirectorQuery = QueryBuilders.matchQuery("txt", content).boost(2f);

disMaxQueryBuilder.add(ikNameQuery);

//disMaxQueryBuilder.add(typeQuery);

disMaxQueryBuilder.add(ikBriefQuery);

disMaxQueryBuilder.add(ikDirectorQuery);

return disMaxQueryBuilder;

}

目前查出来的包含了type为产品和C++类型等其他类型的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值