【SpringCloud——Elasticsearch(中)】

这篇具有很好参考价值的文章主要介绍了【SpringCloud——Elasticsearch(中)】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、DSL查询语法以及整合JAVA代码使用

以下操作案例均基于上篇的hotel索引库及其数据进行。

【SpringCloud——Elasticsearch(中)】

 1、查询基本语法

GET /indexName/_search
{
  "query": {
    "查询类型":{
      "查询条件":"条件值"
    }
  }
}

2、查询所有

2.1、DSL语句

#查询所有
GET /hotel/_search
{
  "query": {
    "match_all": {
    }
  }
}

2.2、JAVA

    //match_all查询所有
    @Test
    void testMatchAll() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }

注:showResult方法是将返回的响应进行解析,代码如下:

    private void showResult(SearchResponse response){
        //4.解析结果
        SearchHits searchHits = response.getHits();
        //4.1、查询结果总条数
        long value = searchHits.getTotalHits().value;
        System.out.println("共" + value + "条");
        //4.2、查询到的结果数据
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String json = hit.getSourceAsString();
            HotelDoc doc = JSON.parseObject(json,HotelDoc.class);
            System.out.println(doc);
        }
    }

下文操作均使用此方法对响应进行解析。

 3、全文检索查询

全文检索查询会对用户输入的内容进行分词,常用于搜索框搜索。

3.1、DSL语句

#match查询
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "外滩"
    }
  }
}
#multi_match查询
#与match查询类似,只不过允许同时查询多个字段
GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "外滩如家",
      "fields": ["business","name","brand"]
    }
  }
}

3.2、JAVA

    //match查询
    @Test
    void testMatch() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchQuery("all","外滩"));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }
    //multi_match查询
    @Test
    void testMultiMatch() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        String[] fields = {"brand", "business", "name"};
        request.source().query(QueryBuilders.multiMatchQuery("外滩如家",fields));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }

4、精确查询

精确查询一般是查找keyword、数值、日期、boolean等类型字段。

  • term:根据词条精确值查询
  • range:根据值的范围查询

 4.1、DSL语句

#精确查询(term精确值)
GET /hotel/_search
{
  "query": {
    "term": {
      "brand": {
        "value": "7天酒店"
      }
    }
  }
}
#精确查询(range范围)
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 300,
        "lte": 400
      }
    }
  }
}

4.2、JAVA

    //精确查询
    @Test
    void testTerm() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.termQuery("brand","7天酒店"));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }
    //范围查询
    @Test
    void testRange() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.rangeQuery("price").gte(300).lte(400));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }

5、地理查询

  • geo_bounding_box:查询geo_point值落在某个矩形范围内的所有文档。(不常用)
  • geo_distance:查询到指定中心点小于某个距离值的所有文档。(以下操作均针对此查询)

5.1、DSL语句

#地理查询
GET /hotel/_search
{
  "query": {
    "geo_distance":{
      "distance":"3km",
      "location":"31.21,121.5"
    }
  }
}

5.2、JAVA

使用第三方工具获取当前地理位置,发送至后端,后端根据传递的地理位置对酒店距离进行排序后返回。(附近的酒店功能)

            //2.3、距离排序
            if (params.getLocation() != null && !params.getLocation().equals("")){
                request.source().sort(SortBuilders.
                        geoDistanceSort("location",new GeoPoint(params.getLocation()))
                        .order(SortOrder.ASC)
                        .unit(DistanceUnit.KILOMETERS));
            }

6、复合查询

6.1、function score:算分函数查询,可以控制文档相关性算分,控制文档排名。

【SpringCloud——Elasticsearch(中)】

①、DSL语句

#相关性算分(function score查询)
GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "all": "外滩"
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "brand": "如家"
            }
          }
          , "weight": 10
        }
      ],
      "boost_mode": "multiply"
    }
  }
}

②、JAVA案例——对付了广告费的酒店进行排名靠前展示

【SpringCloud——Elasticsearch(中)】

            //2.算分控制
            FunctionScoreQueryBuilder functionScoreQuery =
                    QueryBuilders.functionScoreQuery(
                            //原始查询,相关性算分的查询
                            boolQuery,
                            //function score数组
                            new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                                    //其中的一个function score元素
                                    new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                                            //过滤条件
                                            QueryBuilders.termQuery("isAD",true),
                                            //算分函数
                                            ScoreFunctionBuilders.weightFactorFunction(10)
                                    )
                            });
            request.source().query(functionScoreQuery);

6.2、Boolean Query(复合查询)

【SpringCloud——Elasticsearch(中)】

①、DSL语句

搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店:

#复合查询(Boolean Query)
GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "如家"
          }
        }
      ],
      "must_not": [
        {
          "range": {
            "price": {
              "gt": 400
            }
          }
        }
      ],
      "filter": [
        {
          "geo_distance": {
            "distance": "10km",
            "location": {
              "lat": 31.21,
              "lon": 121.5
            }
          }
        }
      ]
    }
  }
}

②、JAVA

    //复合查询
    @Test
    void testBoolean() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.must(QueryBuilders.matchQuery("name","如家"));
        boolQuery.mustNot(QueryBuilders.rangeQuery("price").gt(400));
        boolQuery.filter(QueryBuilders.geoDistanceQuery("location").distance("10km"));
        request.source().query(boolQuery);
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }

二、搜索结果处理以及整合JAVA代码使用

1、排序

elasticsearch支持对搜索结果排序,默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

1.1、DSL语句

查询所有酒店并按照酒店评分降序排列,评分一致时按照酒店价格升序排列。

#排序
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "score":  "desc"
    },
    {
      "price": "asc"
    }
  ]
}

 地理坐标排序:

#找到108.94647 , 34.34727 周围的酒店,并升序排序
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance": {
        "location": {
          "lat": 34.34727,
          "lon": 108.94647
        },
        "order": "asc",
        "unit": "km"
      }
    }
  ]
}

1.2、JAVA

    //排序
    @Test
    void testSort() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        request.source().sort("score", SortOrder.DESC);
        request.source().sort("price",SortOrder.ASC);
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }

 地理坐标排序:

            //2.3、距离排序
            if (params.getLocation() != null && !params.getLocation().equals("")){
                request.source().sort(SortBuilders.
                        geoDistanceSort("location",new GeoPoint(params.getLocation()))
                        .order(SortOrder.ASC)
                        .unit(DistanceUnit.KILOMETERS));
            }

2、分页

2.1、DSL语句

#分页查询
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price":  "asc"
    }
  ],
  "from": 20,
  "size": 10
}

2.2、JAVA

    //分页
    @Test
    void testLimit() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        request.source().sort("price",SortOrder.ASC);
        request.source().from(20);
        request.source().size(10);
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }

3、高亮

高亮就是在搜索结果中把搜索关键字突出显示。文章来源地址https://www.toymoban.com/news/detail-470268.html

3.1、DSL语句

#高亮查询处理
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家"
    }
  }, 
  "highlight": {
    "fields": {
      "name": {
        "require_field_match": "false"
      }
    }
  }
}

3.2、JAVA

    //高亮
    @Test
    void testLight() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchQuery("all","如家"));
        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析结果
        SearchHits searchHits = response.getHits();
        //4.1、查询结果总条数
        long value = searchHits.getTotalHits().value;
        System.out.println("共" + value + "条");
        //4.2、查询到的结果数据
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String json = hit.getSourceAsString();
            HotelDoc doc = JSON.parseObject(json,HotelDoc.class);
            //获取高亮结果
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if (!CollectionUtils.isEmpty(highlightFields)){
                //根据字段名获取高亮结果
                HighlightField highlightField = highlightFields.get("name");
                if (highlightField != null){
                    //获取高亮值
                    String name = highlightField.getFragments()[0].toString();
                    //覆盖非高亮结果
                    doc.setName(name);
                }
            }
            System.out.println(doc);
        }
    }

到了这里,关于【SpringCloud——Elasticsearch(中)】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch高级查询语法

    当数据写入ES时,数据将会通过“分词”被切分为不同的term,ES将term与其对应的文档列表建立一种映射关系,这种结构就是倒排索引。如下图所示: 为了进一步提升索引的效率,ES在term的基础上利用term的前缀或者后缀构建了term index,用于对term本身进行索引,ES实际的索引结

    2024年01月20日
    浏览(31)
  • Elasticsearch 查询和聚合查询:基本语法和统计数量

    摘要:Elasticsearch是一个强大的分布式搜索和分析引擎,提供了丰富的查询和聚合功能。本文将介绍Elasticsearch的基本查询语法,包括预发查询和聚合查询,以及如何使用聚合功能统计数量。 Elasticsearch是一种开源的分布式搜索和分析引擎,广泛应用于各种场景,包括日志分析、

    2024年02月11日
    浏览(37)
  • SpringCloud(十)——ElasticSearch简单了解(二)DSL查询语句及RestClient查询文档

    查询所有 :查询出所有数据,一般测试用。例如: match_all 全文检索查询 :利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: match_query multi_match_query 精确查询 :根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如: ids range

    2024年02月10日
    浏览(51)
  • Elasticsearch数据结构与查询语法

    Elasticsearch是一个基于Lucene的搜索引擎,它提供了实时、可扩展、可伸缩的搜索功能。Elasticsearch是一个分布式、实时的、多用户的搜索和分析引擎。它是基于Lucene的搜索引擎,用于实时、可扩展、可伸缩的搜索功能。Elasticsearch是一个分布式、实时的、多用户的搜索和分析引擎

    2024年02月21日
    浏览(31)
  • ElasticSearch(三)高级查询语法(DLS)

            1、单词词典:记录所有文档单词,单词到倒排列表的关系;         2、倒排列表:记录了单词对应的文档id;         3、倒排索引项:a 文档id b 词频 c 位置(单词在文本中的位置)d 偏移:单词开始结束位置; mapping映射类似于数据库的字段类型 put /索引名 {   

    2024年01月21日
    浏览(26)
  • elasticsearch的常用查询语法(大全)

    参考文章网址:https://www.cnblogs.com/xiohao/p/12970224.html es查询 修改时,不指定的属性会自动覆盖,只保留指定的属性(不正确的修改指定文档方式) 使用POST命令,在id后面跟_update,要修改的内容放到doc文档(属性)中(正确的修改指定文档方式) 准备数据 查询语句 输出结果 通过观察

    2024年02月05日
    浏览(34)
  • Springboot 整合ElasticSearch 常用的插入查询,模糊查询,范围查询

    repository.deleteById(id); } catch (Exception ex) { ex.printStackTrace(); return false; } return true; } public Dog saveDog(Dog dog) { try { Dog save = repository.save(dog); System.out.println(“结果:”+save.toString()); return save; } catch (Exception ex) { ex.printStackTrace(); return null; } } public Boolean saveDogAll(List dogsList) { try { reposit

    2024年04月22日
    浏览(30)
  • Elasticsearch常用查询语法及RestClient操作

    match查询 :全文检索查询的一种,会对用户内容分词,然后去倒排索引库检索,语法。 multi_match :和match类似,但是它允许多个字段进行查询 解释:在 hotel索引库 中按照 address 和 name 两个字段搜索值 包含北京 的文档 精准查询一般是查找keyword,数值,日期,boolean等 不可分

    2024年04月25日
    浏览(42)
  • ElasticSearch 高级查询语法Query DSL实战

    ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL(Domain Specified Language 领域专用语言) , Query DSL是利用Rest API传递JSON格式的请求体(RequestBody)数据与ES进行交互,这种方式的丰富查询语法让ES检索变得更强大,更简洁。 官方文档:https://www.elastic.co/guide/en/elasti

    2024年02月07日
    浏览(36)
  • 2.ElasticSearch 高级查询语法Query DSL实战

    ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL (Domain Specified Language 领域专用语言 ) , Query DSL是利用Rest API传递JSON格式的请求体(RequestBody)数据与ES进行交互,这种方式的丰富查询语法让ES检索变得更强大,更简洁。 Query DSL | Elasticsearch Guide [7.17] | Elastic 语法

    2024年03月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包