• Springboot 整合 Elasticsearch(五):使用RestHighLevelClient操作ES ②


    📁 前情提要:

    Springboot 整合 Elasticsearch(三):使用RestHighLevelClient操作ES ①

    目录

     一、Springboot 整合 Elasticsearch

    1、RestHighLevelClient API介绍

    1.1、全查询 & 分页 & 排序

    1.2、单条件查询

    1.2.1、termQuery

    1.2.2、matchQuery

    1.2.3、短语检索

    1.3、组合查询

    1.4、范围查询

    1.5、模糊查询

    1.6、分组查询


    一、Springboot 整合 Elasticsearch

    1、RestHighLevelClient API介绍

    目前的测试数据有:

    1.1、全查询 & 分页 & 排序

    1. @Test
    2. public void queryAllDoc() {
    3. try {
    4. String indexName = "forest";
    5. SearchRequest request = new SearchRequest();
    6. request.indices(indexName);
    7. // 构建查询的请求体
    8. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    9. sourceBuilder.query(QueryBuilders.matchAllQuery());
    10. // 设置分页
    11. sourceBuilder.from(1);
    12. sourceBuilder.size(3);
    13. // 设置排序
    14. sourceBuilder.sort("price", SortOrder.DESC);
    15. request.source(sourceBuilder);
    16. SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
    17. if (200 != search.status().getStatus()) {
    18. log.error("查询失败");
    19. }
    20. System.out.println("--------查询结果-----------");
    21. SearchHits hits = search.getHits();
    22. for (SearchHit hit : hits) {
    23. System.out.println(hit.getSourceAsString());
    24. }
    25. } catch (IOException e) {
    26. e.printStackTrace();
    27. }
    28. }

    1.2、单条件查询

    1.2.1、termQuery

    term属于精确匹配,而且只能查单个词(一个汉字或者一个英文单词),不会对用户输入的内容进行分词;

    1. @Test
    2. public void queryDocByKey() {
    3. try {
    4. String indexName = "forest";
    5. SearchRequest request = new SearchRequest();
    6. request.indices(indexName);
    7. // 构建查询的请求体
    8. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    9. sourceBuilder.query(QueryBuilders.termQuery("price", "300"));
    10. request.source(sourceBuilder);
    11. SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
    12. if (200 != search.status().getStatus()) {
    13. log.error("查询失败");
    14. }
    15. System.out.println("--------查询结果-----------");
    16. SearchHits hits = search.getHits();
    17. for (SearchHit hit : hits) {
    18. System.out.println(hit.getSourceAsString());
    19. }
    20. } catch (IOException e) {
    21. e.printStackTrace();
    22. }
    23. }

    1.2.2、matchQuery

    match进行搜索的时候,会先进行分词拆分,拆完后,再来匹配;例如输入“枫树”,match会拆分成“枫”,“树”两个字,只要包含其中一个字的都会被查出来。

    1. @Test
    2. public void queryDocByKey() {
    3. try {
    4. String indexName = "forest";
    5. SearchRequest request = new SearchRequest();
    6. request.indices(indexName);
    7. // 构建查询的请求体
    8. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    9. sourceBuilder.query(QueryBuilders.matchQuery("title", "枫树"));
    10. request.source(sourceBuilder);
    11. SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
    12. if (200 != search.status().getStatus()) {
    13. log.error("查询失败");
    14. }
    15. System.out.println("--------查询结果-----------");
    16. SearchHits hits = search.getHits();
    17. for (SearchHit hit : hits) {
    18. System.out.println(hit.getSourceAsString());
    19. }
    20. } catch (IOException e) {
    21. e.printStackTrace();
    22. }
    23. }

    1.2.3、短语检索

    要求所有的分词必须同时出现在文档中,同时位置必须紧邻一致

    1. @Test
    2. public void queryDocByPhraseKey() {
    3. try {
    4. String indexName = "forest";
    5. SearchRequest request = new SearchRequest();
    6. request.indices(indexName);
    7. // 构建查询的请求体
    8. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    9. sourceBuilder.query(QueryBuilders.matchPhraseQuery("title", "枫树"));
    10. request.source(sourceBuilder);
    11. SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
    12. if (200 != search.status().getStatus()) {
    13. log.error("查询失败");
    14. }
    15. System.out.println("--------查询结果-----------");
    16. SearchHits hits = search.getHits();
    17. for (SearchHit hit : hits) {
    18. System.out.println(hit.getSourceAsString());
    19. }
    20. } catch (IOException e) {
    21. e.printStackTrace();
    22. }
    23. }

    1.3、组合查询

    • must:返回的文档必须满足must子句的条件,并且参与计算分值;
    • mustNot:返回的文档必须不满足定义的条件;
    • should:在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回;
    • filter:返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值;
    1. @Test
    2. public void queryByCombinationKey() {
    3. try {
    4. // 声明搜索条件对象
    5. String indexName = "forest";
    6. SearchRequest request = new SearchRequest();
    7. request.indices(indexName);
    8. // 构建查询的请求体
    9. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    10. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    11. boolQueryBuilder.must(QueryBuilders.matchQuery("price", 1000));
    12. boolQueryBuilder.should(QueryBuilders.matchQuery("id", 3));
    13. sourceBuilder.query(boolQueryBuilder);
    14. request.source(sourceBuilder);
    15. SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
    16. if (200 != search.status().getStatus()) {
    17. log.error("查询失败");
    18. }
    19. System.out.println("--------查询结果-----------");
    20. SearchHits hits = search.getHits();
    21. for (SearchHit hit : hits) {
    22. System.out.println(hit.getSourceAsString());
    23. }
    24. } catch (IOException e) {
    25. e.printStackTrace();
    26. }
    27. }

    [注]当使用should查询时,如果包含了must或者filter查询,那么should的查询语句就不是或者的意思了,而是有或者没有都行的含义。

    1.4、范围查询

    • 闭区间查询:QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}).to(${fieldValue2});
    • 开区间查询:QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}, false).to(${fieldValue2}, false);
    • 大于:QueryBuilders.rangeQuery("${fieldName}").gt(${fieldValue});
    • 大于等于:QueryBuilders.rangeQuery("${fieldName}").gte(${fieldValue});
    • 小于:QueryBuilders.rangeQuery("${fieldName}").lt(${fieldValue});
    • 小于等于:QueryBuilders.rangeQuery("${fieldName}").lte(${fieldValue});
    1. @Test
    2. public void queryByCombinationKey() {
    3. try {
    4. // 声明搜索条件对象
    5. String indexName = "forest";
    6. SearchRequest request = new SearchRequest();
    7. request.indices(indexName);
    8. // 构建查询的请求体
    9. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    10. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    11. boolQueryBuilder.must(QueryBuilders.rangeQuery("price").from(300).to(500));
    12. boolQueryBuilder.must(QueryBuilders.rangeQuery("inventory").from(500).to(1000));
    13. sourceBuilder.query(boolQueryBuilder);
    14. request.source(sourceBuilder);
    15. SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
    16. if (200 != search.status().getStatus()) {
    17. log.error("查询失败");
    18. }
    19. System.out.println("--------查询结果-----------");
    20. SearchHits hits = search.getHits();
    21. for (SearchHit hit : hits) {
    22. System.out.println(hit.getSourceAsString());
    23. }
    24. } catch (IOException e) {
    25. e.printStackTrace();
    26. }
    27. }

    1.5、模糊查询

    1. @Test
    2. public void queryFuzzyDocByKey() {
    3. try {
    4. String indexName = "forest";
    5. SearchRequest request = new SearchRequest();
    6. request.indices(indexName);
    7. // 构建查询的请求体
    8. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    9. sourceBuilder.query(QueryBuilders.fuzzyQuery("title", "松").fuzziness(Fuzziness.AUTO));
    10. request.source(sourceBuilder);
    11. SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
    12. if (200 != search.status().getStatus()) {
    13. log.error("查询失败");
    14. }
    15. System.out.println("--------查询结果-----------");
    16. SearchHits hits = search.getHits();
    17. for (SearchHit hit : hits) {
    18. System.out.println(hit.getSourceAsString());
    19. }
    20. } catch (IOException e) {
    21. e.printStackTrace();
    22. }
    23. }

    1.6、分组查询

    按价格分组后求每组的条数

    1. @Test
    2. public void queryGroupByKey() {
    3. try {
    4. // 声明搜索条件对象
    5. String indexName = "forest";
    6. SearchRequest request = new SearchRequest();
    7. request.indices(indexName);
    8. // 构建查询的请求体
    9. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    10. sourceBuilder.aggregation(AggregationBuilders.terms("price_groupBy").field("price"));
    11. request.source(sourceBuilder);
    12. SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
    13. if (200 != search.status().getStatus()) {
    14. log.error("查询失败");
    15. }
    16. List list = new ArrayList<>();
    17. System.out.println("--------查询结果-----------");
    18. Terms terms = search.getAggregations().get("price_groupBy");
    19. Listextends Terms.Bucket> buckets = terms.getBuckets();
    20. for (Terms.Bucket bucket : buckets) {
    21. KeyAndCount keyAndCount = new KeyAndCount();
    22. keyAndCount.setKey(bucket.getKey().toString());
    23. keyAndCount.setCount(bucket.getDocCount());
    24. list.add(keyAndCount);
    25. System.out.println(keyAndCount);
    26. }
    27. } catch (IOException e) {
    28. e.printStackTrace();
    29. }
    30. }


  • 相关阅读:
    RabbitMQ (4)
    计算机毕业设计Java的电影社区网站(源码+系统+mysql数据库+lw文档)
    [C++11] --- 移动语义和完美转发
    文本-图像生成(Text-to-Image Generation)的评价指标介绍——CLIPScore、TISE
    windows下app爬虫环境搭建:python + fiddler + Appium + 夜神模拟器
    x86汇编基础
    LeetCode数组经典题目(一)
    apriori算法python实现
    酷开系统音乐频道,用音乐治愈你!
    java-反射
  • 原文地址:https://blog.csdn.net/ZhangXS9722/article/details/136065587