一:文档对象如下
@Data @AllArgsConstructor @NoArgsConstructor @Document(indexName = "items", type = "item",shards = 5, replicas = 1) public class Item implements Serializable { @Id private Long id; /**标题*/ @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word") private String title; /**分类*/ @Field(type = FieldType.Keyword) private String category; /**品牌*/ @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word") private String brand; /**价格*/ @Field(type = FieldType.Double) private Double price; /**图片地址*/ @Field(index = false, type = FieldType.Keyword) private String images; }
二:非聚合复杂查询(这儿展示了非聚合复杂查询的常用流程)
public void listPage(){ //1.创建QueryBuilder(即设置查询条件)这儿创建的是组合查询(也叫多条件查询),后面会介绍更多的查询方法 /*组合查询BoolQueryBuilder * must(QueryBuilders) :AND * mustNot(QueryBuilders):NOT * should: :OR */ BoolQueryBuilder builder = QueryBuilders.boolQuery(); //builder下有must、should以及mustNot 相当于sql中的and、or以及not //设置模糊搜索,博客的简诉中有学习两个字 builder.must(QueryBuilders.fuzzyQuery("category", "一级")); //设置要查询博客的标题中含有关键字 // builder.must(new QueryStringQueryBuilder("title").field("阿迪达斯裤子")); //按照博客的评论数的排序是依次降低 FieldSortBuilder sort = SortBuilders.fieldSort("price").order(SortOrder.DESC); //设置分页(从第一页开始,一页显示10条) //注意开始是从0开始,有点类似sql中的方法limit 的查询 PageRequest page = new PageRequest(0, 10); //2.构建查询 NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); //将搜索条件设置到构建中 nativeSearchQueryBuilder.withQuery(builder); //将分页设置到构建中 nativeSearchQueryBuilder.withPageable(page); //将排序设置到构建中 nativeSearchQueryBuilder.withSort(sort); //生产NativeSearchQuery NativeSearchQuery query = nativeSearchQueryBuilder.build(); //3.执行方法1 Page<Item> itemPage = itemRespository.search(query); //执行方法2:注意,这儿执行的时候还有个方法那就是使用elasticsearchTemplate //执行方法2的时候需要加上注解 //@Autowired //private ElasticsearchTemplate elasticsearchTemplate; List<Item> blogList = elasticsearchTemplate.queryForList(query, Item.class); //4.获取总条数(用于前端分页) int total = (int) itemPage.getTotalElements(); //5.获取查询到的数据内容(返回给前端) List<Item> content = itemPage.getContent(); System.out.println(total); System.out.println(content); }
三:精确查询(必须完全匹配上)
单个匹配termQuery
//不分词查询 参数1: 字段名,参数2:字段查询值,因为不分词,所以汉字只能查询一个字,英语是一个单词. QueryBuilder queryBuilder=QueryBuilders.termQuery("fieldName", "fieldlValue"); //分词查询,采用默认的分词器 QueryBuilder queryBuilder2 = QueryBuilders.matchQuery("fieldName", "fieldlValue");