特别注意:es的模糊查询,只支持keyword;之前踩过的坑,使用正则的方式模糊查询(QueryBuilders.regexpQuery("name.keyword", ".*" + student.getName() + ".*")),遇到特殊符号比如 \ 斜杠,英文的""引号,则匹配不上。

最终总结如下方法可匹配任意字符的模糊查询,可供参考:

private static final Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
----------------------------------------------------------------

//简单的例子:这里是分页查询,按学生名字模糊查询,然后按添加时间倒序
public NativeSearchQuery getSearchQuery(Student student, Pageable pageRequest){

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();

queryBuilder.filter(QueryBuilders.wildcarQuery("name.keyword", "*" + this.unicodeToString(student.getName()) + "*")));

NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
return  nativeSearchQueryBuilder
         .withQuery(queryBuilder)
         .withSort(SortBuilders.fieldSort("addTime").order(SortOrder.DESC))
         .withPageable(pageRequest)
         .build();  
}
----------------------------------------------------------------
private String unicodeToString (String str){
//将字符串转义
str = StringEscapeUtils.escapeJava(str);
//将Unicode编码格式转化为中文
Match match = pattern.matcher(str);
char ch;
while(matcher.find()){
    ch = (char) Integer.parseInt(matcher.group(2), 16);
    str = str.replace(matcher.group(1), ch + "");
  }
return str;

}

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐