• springboot整合es客户端操作elasticsearch(五)


    springboot整合es客户端操作elasticsearch的总结:

    客户端可以进行可以对所有文档进行查询,就是不加任何条件:

       SearchRequest searchRequest = new SearchRequest("cxy");
            //指定类型
            searchRequest.types("doc");
            //搜索源构建对象
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            //搜索方式
            //matchAllQuery搜索全部
            searchSourceBuilder.query(QueryBuilders.matchAllQuery());
            //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
            searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
            //向搜索请求对象中设置搜索源
            searchRequest.source(searchSourceBuilder);
            //执行搜索,向ES发起http请求
            SearchResponse searchResponse = client.search(searchRequest);
            //搜索结果
            SearchHits hits = searchResponse.getHits();
            //匹配到的总记录数
            long totalHits = hits.getTotalHits();
            //得到匹配度高的文档
            SearchHit[] searchHits = hits.getHits();

    可以进行分页查询:

     SearchRequest searchRequest = new SearchRequest("cxy");
            //指定类型
            searchRequest.types("doc");
            //搜索源构建对象
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            //设置分页参数
            //页码
            int page = 1;
            //每页记录数
            int size = 1;
            //计算出记录起始下标
            int from  = (page-1)*size;
            searchSourceBuilder.from(from);//起始记录下标,从0开始
            searchSourceBuilder.size(size);//每页显示的记录数
            //搜索方式
            //matchAllQuery搜索全部
            searchSourceBuilder.query(QueryBuilders.matchAllQuery());
            //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
            searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
            //向搜索请求对象中设置搜索源
            searchRequest.source(searchSourceBuilder);
            //执行搜索,向ES发起http请求
            SearchResponse searchResponse = client.search(searchRequest);
            //搜索结果
            SearchHits hits = searchResponse.getHits();
            //匹配到的总记录数
            long totalHits = hits.getTotalHits();
            //得到匹配度高的文档
            SearchHit[] searchHits = hits.getHits();

    可以进行精确查询:

      SearchRequest searchRequest = new SearchRequest("cxy");
            //指定类型
            searchRequest.types("doc");
            //搜索源构建对象
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            //设置分页参数
            //页码
            int page = 1;
            //每页记录数
            int size = 1;
            //计算出记录起始下标
            int from  = (page-1)*size;
            searchSourceBuilder.from(from);//起始记录下标,从0开始
            searchSourceBuilder.size(size);//每页显示的记录数
            //搜索方式
            //termQuery
            searchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));
            //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
            searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
            //向搜索请求对象中设置搜索源
            searchRequest.source(searchSourceBuilder);
            //执行搜索,向ES发起http请求
            SearchResponse searchResponse = client.search(searchRequest);
            //搜索结果
            SearchHits hits = searchResponse.getHits();
            //匹配到的总记录数
            long totalHits = hits.getTotalHits();
            //得到匹配度高的文档
            SearchHit[] searchHits = hits.getHits();

    可以根据id进行精确查询

     SearchRequest searchRequest = new SearchRequest("cxy");
            //指定类型
            searchRequest.types("doc");
            //搜索源构建对象
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            //搜索方式
            //根据id查询
            //定义id
            String[] ids = new String[]{"1","2"};
            searchSourceBuilder.query(QueryBuilders.termsQuery("_id",ids));
            //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
            searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
            //向搜索请求对象中设置搜索源
            searchRequest.source(searchSourceBuilder);
            //执行搜索,向ES发起http请求
            SearchResponse searchResponse = client.search(searchRequest);
            //搜索结果
            SearchHits hits = searchResponse.getHits();
            //匹配到的总记录数
            long totalHits = hits.getTotalHits();
            //得到匹配度高的文档
            SearchHit[] searchHits = hits.getHits();

    也可以进行多字段匹配差选:

    //搜索请求对象
            SearchRequest searchRequest = new SearchRequest("cxy");
            //指定类型
            searchRequest.types("doc");
            //搜索源构建对象
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    
            //搜索方式
            //MultiMatchQuery
            searchSourceBuilder.query(QueryBuilders.multiMatchQuery("spring css","name","description")
                    .minimumShouldMatch("50%")
                    .field("name",10));
            //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
            searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
            //向搜索请求对象中设置搜索源
            searchRequest.source(searchSourceBuilder);
            //执行搜索,向ES发起http请求
            SearchResponse searchResponse = client.search(searchRequest);
            //搜索结果
            SearchHits hits = searchResponse.getHits();
            //匹配到的总记录数
            long totalHits = hits.getTotalHits();
            //得到匹配度高的文档
            SearchHit[] searchHits = hits.getHits();

    也可以添加Boolean要求:

      SearchRequest searchRequest = new SearchRequest("cxy");
            //指定类型
            searchRequest.types("doc");
            //搜索源构建对象
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    
            //boolQuery搜索方式
            //先定义一个MultiMatchQuery
            MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring css", "name", "description")
                    .minimumShouldMatch("50%")
                    .field("name", 10);
            //再定义一个termQuery
            TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("studymodel", "201001");
    
            //定义一个boolQuery
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            boolQueryBuilder.must(multiMatchQueryBuilder);
            boolQueryBuilder.must(termQueryBuilder);
    
            searchSourceBuilder.query(boolQueryBuilder);
            //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
            searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
            //向搜索请求对象中设置搜索源
            searchRequest.source(searchSourceBuilder);
            //执行搜索,向ES发起http请求
            SearchResponse searchResponse = client.search(searchRequest);
            //搜索结果
            SearchHits hits = searchResponse.getHits();
            //匹配到的总记录数
            long totalHits = hits.getTotalHits();
            //得到匹配度高的文档
            SearchHit[] searchHits = hits.getHits();

    也可以添加过滤器:

      SearchRequest searchRequest = new SearchRequest("cxy");
            //指定类型
            searchRequest.types("doc");
            //搜索源构建对象
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    
            //boolQuery搜索方式
            //先定义一个MultiMatchQuery
            MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring css", "name", "description")
                    .minimumShouldMatch("50%")
                    .field("name", 10);
    
            //定义一个boolQuery
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            boolQueryBuilder.must(multiMatchQueryBuilder);
            //定义过虑器
            boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel","201001"));
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(90).lte(100));
    
            searchSourceBuilder.query(boolQueryBuilder);
            //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
            searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
            //向搜索请求对象中设置搜索源
            searchRequest.source(searchSourceBuilder);
            //执行搜索,向ES发起http请求
            SearchResponse searchResponse = client.search(searchRequest);
            //搜索结果
            SearchHits hits = searchResponse.getHits();
            //匹配到的总记录数
            long totalHits = hits.getTotalHits();
            //得到匹配度高的文档
            SearchHit[] searchHits = hits.getHits();
            //日期格式化对象

    也可以进行高亮查询:原理是这样的,给高亮字段添加标签,到时候展示即可:

    //搜索请求对象
            SearchRequest searchRequest = new SearchRequest("cxy");
            //指定类型
            searchRequest.types("doc");
            //搜索源构建对象
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    
            //boolQuery搜索方式
            //先定义一个MultiMatchQuery
            MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("开发框架", "name", "description")
                    .minimumShouldMatch("50%")
                    .field("name", 10);
    
            //定义一个boolQuery
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            boolQueryBuilder.must(multiMatchQueryBuilder);
            //定义过虑器
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));
    
            searchSourceBuilder.query(boolQueryBuilder);
            //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
            searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
    
            //设置高亮
            HighlightBuilder highlightBuilder = new HighlightBuilder();
            highlightBuilder.preTags("<tag>");
            highlightBuilder.postTags("</tag>");
            highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
    //        highlightBuilder.fields().add(new HighlightBuilder.Field("description"));
            searchSourceBuilder.highlighter(highlightBuilder);
    
            //向搜索请求对象中设置搜索源
            searchRequest.source(searchSourceBuilder);
            //执行搜索,向ES发起http请求
            SearchResponse searchResponse = client.search(searchRequest);
            //搜索结果
            SearchHits hits = searchResponse.getHits();
            //匹配到的总记录数
            long totalHits = hits.getTotalHits();
            //得到匹配度高的文档
            SearchHit[] searchHits = hits.getHits();

    取高亮:

      //源文档的name字段内容
                String name = (String) sourceAsMap.get("name");
                //取出高亮字段
                Map<String, HighlightField> highlightFields = hit.getHighlightFields();
                if(highlightFields!=null){
                    //取出name高亮字段
                    HighlightField nameHighlightField = highlightFields.get("name");
                    if(nameHighlightField!=null){
                        Text[] fragments = nameHighlightField.getFragments();
                        StringBuffer stringBuffer = new StringBuffer();
                        for(Text text:fragments){
                            stringBuffer.append(text);
                        }
                        name = stringBuffer.toString();
                    }
                }

    排序查询:

      SearchRequest searchRequest = new SearchRequest("cxy");
            //指定类型
            searchRequest.types("doc");
            //搜索源构建对象
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    
            //boolQuery搜索方式
            //定义一个boolQuery
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            //定义过虑器
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));
    
            searchSourceBuilder.query(boolQueryBuilder);
            //添加排序
            searchSourceBuilder.sort("studymodel", SortOrder.DESC);
            searchSourceBuilder.sort("price", SortOrder.ASC);
            //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
            searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
            //向搜索请求对象中设置搜索源
            searchRequest.source(searchSourceBuilder);
            //执行搜索,向ES发起http请求
            SearchResponse searchResponse = client.search(searchRequest);
            //搜索结果
            SearchHits hits = searchResponse.getHits();
            //匹配到的总记录数
            long totalHits = hits.getTotalHits();
            //得到匹配度高的文档
            SearchHit[] searchHits = hits.getHits();

    keyword可以通过前端传输参数进行

     这个地方,参数是由前端传输进来的。

    返回参数,可以在:

      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            for(SearchHit hit:searchHits){
                //文档的主键
                String id = hit.getId();
                //源文档内容
                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                String name = (String) sourceAsMap.get("name");
                //由于前边设置了源文档字段过虑,这时description是取不到的
                String description = (String) sourceAsMap.get("description");
                //学习模式
                String studymodel = (String) sourceAsMap.get("studymodel");
                //价格
                Double price = (Double) sourceAsMap.get("price");
                //日期
                Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
                System.out.println(name);
                System.out.println(studymodel);
                System.out.println(description);
            }

    在这里构建结果返回给前端

    多数情况开发中,是将这些都会用到。在基础篇中讲到了es的相关概念,在第二篇中解决了各种版本问题,那么es的本身会有什么问题吗,等待下篇继续介绍,脑裂,索引优化等

  • 相关阅读:
    ssm接收界面提交的参数为空
    Servlet[jsp]的Servlet.service()引发了具有根本原因的异常无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]
    Invalid bound statement (not found)
    Data truncation: Incorrect datetime value: '' for column 'create_time' at row 1 问题
    4月29日:毕业设计计划
    4月25日:毕业设计计划
    4月24日:毕业设计计划
    4月23日:毕业设计计划
    2020年寒假学习进度(二)
    2020年寒假学习进度(一)
  • 原文地址:https://www.cnblogs.com/cxyxiaobao/p/12045386.html
Copyright © 2020-2023  润新知