Springboot - ElasticSearch 查询总结

    技术2023-04-04  82

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

    Processed: 0.008, SQL: 9