官方文档: https://www.elastic.co/guide/cn/elasticsearch/guide/current/full-body-search.html
pom文件: <!-- elasticsearch --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
elasticsearchTemplate: BoolQueryBuilder 当多条件查询的时候可以用它来做拼接,它的should和must相当于mysql中的or和and termQueryBuilder 有参构造的参数一:字段名,参数二:值查询,表示查询满足该字段的值的文档 MatchQueryBuilder 有参构造的参数一:字段名,参数二:将用户输入的关键字进行分词然后再去查询
1、termQuery对象进行字符的精确匹配查询 es的termQuery对象构造查询语句,精确查询 type= “bird” 的鸟类信息
QueryBuilders.termQuery("type", "bird"); 相当于sql语句:
select * from biological where type = 'bird';
2、boolQuery查询 构造boolQuery的对象,在boolQuery对象里面添加逻辑判断条件。
boolquery嵌套的条件有以下类型:
(1) must: 条件必须满足,相当于 and
(2) should: 条件可以满足也可以不满足,相当于 or
(3) must_not: 条件不需要满足,相当于 not
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.should(QueryBuilders.termQuery("type", "bird")); boolQuery.should(QueryBuilders.termQuery("type", "plant")); boolQuery.must(QueryBuilders.termQuery("name", "demo")); 相当于sql语句:
select * from biological where (type = 'bird' OR type = 'plant') AND (name = 'demo'); wildcardQuery 相当于 like
boolQuery.must(QueryBuilders.wildcardQuery("scientificname",searchMessage+"*"));
3、嵌套查询 sql语句:
select * from biological where (type = 'bird' AND name = 'test') OR (name = 'demo'); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.should( boolQuery.must.QueryBuilders.termQuery("type", "bird") .must.QueryBuilders.termQuery("name", "test")); boolQuery.should(QueryBuilders.termQuery("name", "demo"));
4、matchQuery用于文本类型字段的搜索 matchQuery会将搜索条件按照标准分词器的规则分词,分完词之后分别搜索匹配项。
public Page<NameDataList> NameDataList(String typeId, String searchMessage, int offset, HttpServletRequest request) { TaxondataQuery query = new TaxondataQuery(); query.setPage(offset/10); query.setQueryString(searchMessage); // 复合查询 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.must(QueryBuilders.termQuery("type", typeId)); //boolQuery.filter(QueryBuilders.rangeQuery("pageSize")); // 以下为查询条件, 使用 must query 进行查询组合 MultiMatchQueryBuilder matchQuery = QueryBuilders.multiMatchQuery(query.getQueryString(), "scientificname", "chinesename"); boolQuery.must(matchQuery); PageRequest pageRequest = PageRequest.of(query.getPage(), query.getSize()); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQuery) .withHighlightFields( new HighlightBuilder.Field("scientificname"), new HighlightBuilder.Field("chinesename")) .withPageable(pageRequest).build(); Page<NameDataList> NameDataLists = elasticsearchTemplate.queryForPage(searchQuery, NameDataList.class, extResultMapper); return NameDataLists; }
5、query与filter query 四种子句:must,filter,should,mustNot
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.must(QueryBuilders.termQuery("chinesename", "云雀")); SearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(boolQuery) .build(); List<NameDataList> NameDataLists = elasticsearchTemplate.queryForList(searchQuery, NameDataList.class); System.out.println(NameDataLists.toString()); filter比query快:
query的时候,会先比较查询条件,然后计算分值,最后返回文档结果; 而filter则是先判断是否满足查询条件,如果不满足,会缓存查询过程(记录该文档不满足结果); 满足的话,就直接缓存结果 综上所述,filter快在两个方面: 1.对结果进行缓存 2.避免计算分值