官方文档:
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.避免计算分值