因为我的数据是aaa-bbb-ccc这种有分隔符的,而且在查询时没有使用keyword导致在查询时进行了分词查出的结果与我想要的不符,如下
//name = bs-blc-client-ops-t-6b7567c9c-lrmls
BoolQuery.Builder boolQueryBuilder = QueryBuilders.bool();
if (name != null && name.length() > 0) {
boolQueryBuilder.must(QueryBuilders.match(r -> r
.field("serverName")
.query(name)));
}
上面的代码会导查出很多其他的数据,因为其他数据也会带有bs或者blc这些分词
//得改成下述代码:
//name = bs-blc-client-ops-t-6b7567c9c-lrmls
BoolQuery.Builder boolQueryBuilder = QueryBuilders.bool();
if (name != null && name.length() > 0) {
boolQueryBuilder.must(QueryBuilders.matchPhrase(r -> r
.field("serverName")
.query(name)));
}
//或者
BoolQuery.Builder boolQueryBuilder = QueryBuilders.bool();
if (name != null && name.length() > 0) {
boolQueryBuilder.must(QueryBuilders.match(r -> r
.field("serverName.keyword")
.query(name)));
}
QueryBuilders.match
- 匹配方式:match查询是一种全文检索查询,它会对输入的查询字符串进行分词,然后与目标字段中的内容进行匹配。只要目标字段中包含查询字符串中的任意一个分词,就可以匹配成功。
- 适用场景:match查询适用于需要模糊匹配的场景,例如搜索包含某个关键词的文档。
- 特点:
- 支持分词器对查询字符串进行分词。
- 可以设置operator参数来控制分词之间的布尔关系(如or、and)。
- 匹配结果可能会包含多个分词中的任意一个或多个。
QueryBuilders.matchPhrase
- 匹配方式:matchPhrase查询是一种短语匹配查询,它要求查询字符串中的单词必须按照给定的顺序出现在目标字段中,并且单词之间的相对位置也要保持一致。
- 适用场景:matchPhrase查询适用于需要精确匹配短语或短语的顺序的场景,例如搜索包含特定短语的文档。
keyword的注意事项
- 当查询的字段带有keyword时,默认是不进行分词的,所以可以用match去查,也可以精确匹配,但是如果需要模糊查询,需要使用wildcard,不能使用match和matchPhrase,且在值带上"*"号即可

1838

被折叠的 条评论
为什么被折叠?



