精华内容
下载资源
问答
  • es_head中怎么根据查询条件删除数据?除了id那种简单的。
  • es: ```json GET cdr_20200110/_search { "size": 3, "query": { "term": { "customerNumber": "13201646126" } }, "aggs": { "hour_sum": { "terms":{ "field": "hour" }, "aggs": { ...
  • 主要参照官方文档(英文版):https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.6/java-rest-high-search.html 下边是我的学习,并进行翻译,我会对文档进行适当... ES查询,在使用REST Client...

    主要参照官方文档(英文版):https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.6/java-rest-high-search.html

    下边是我的学习,并进行翻译,我会对文档进行适当的修改,达到更容易理解的目的,案例仍然用官网的。

    ES查询文档

    SearchRequest用于具有与搜索文件,汇总,建议做,也要求提供高亮显示所产生的文件的方式中的任何操作。 

       ES 的查询,在使用 REST Client  操作起来并不像我们之前对关系型数据库,写sql来操作(我之前持久层习惯使用SpringDateJPA ,简单的查询通过方法名就可以构造出来了,复杂的查询则通过sql来,这样很方便,不用专门构建查询的对象)。而这里需要我们通过构造查询条件来完成。所有的操作都通过操作对象的方式来操作ES

       

    # #  以最基本的形式,我们可以构造查询:

    SearchRequest searchRequest = new SearchRequest(); 
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 
    searchSourceBuilder.query(QueryBuilders.matchAllQuery()); 
    searchRequest.source(searchSourceBuilder); 
      熟悉关系型数据库的sql的,可以看一下  ,
      其实,这里 SearchRequest 对象就相当于是 select
      
      如果想要添加查询条件,则都是找对应的 SearchBuilder 来完成。看到上边的类似于XXXBuilder不要慌。
     
     
     

    # # 我们首先来看一下一些可选参数SearchRequest

    SearchRequest searchRequest = new SearchRequest("posts"); 

     

    将请求限制为索引

    还有两个其他有趣的可选参数:

    searchRequest.routing("routing");

     

    设置路由参数

    searchRequest.indicesOptions(IndicesOptions.lenientExpandOpen());

     

    设置IndicesOptions控制如何解决不可用的索引以及如何扩展通配符表达式

    searchRequest.preference("_local");

     

    使用首选项参数,例如,执行搜索以偏爱本地碎片。默认设置是随机分片。

     

    # # SearchSourceBuilder (通过这个添加查询条件)

     前边提到过,都是通过XXXBuilder来添加额外的条件的。

    以下是一些常见选项的示例:

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); 
    sourceBuilder.query(QueryBuilders.termQuery("user", "kimchy")); 
    sourceBuilder.from(0); 
    sourceBuilder.size(5); 
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); 

     

    SearchSourceBuilder使用默认选项创建一个。

     

    设置查询。可以是任何类型QueryBuilder

     

    设置from分页开始地址。预设为0。

     

    设置size分页大小。默认为10

     

    设置一个可选的超时时间,以控制允许搜索的时间。

    在此之后,SearchSourceBuilder只需要将添加到 SearchRequest

    SearchRequest searchRequest = new SearchRequest();
    searchRequest.indices("posts");
    searchRequest.source(sourceBuilder);

     

     # # MatchQueryBuilder

     

    搜索查询是使用QueryBuilder对象创建的。一个QueryBuilder存在通过Elasticsearch支持的每一个搜索查询类型查询DSL

    QueryBuilder可以使用其构造函数创建一个:

    MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("user", "kimchy");

     

    这个其实就是:where user="kimchy"

    创建QueryBuilder对象后,该对象将提供方法来配置其创建的搜索查询的选项:

    matchQueryBuilder.fuzziness(Fuzziness.AUTO); 
    matchQueryBuilder.prefixLength(3); 
    matchQueryBuilder.maxExpansions(10);

     

    对匹配查询启用模糊匹配

     

    在匹配查询中设置前缀长度选项

     

    设置最大扩展选项以控制查询的模糊过程

    QueryBuilder也可以使用QueryBuilders实用程序类创建对象。此类提供了一些辅助方法,可以QueryBuilder使用流畅的编程样式来创建对象:

    QueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("user", "kimchy")
                                                    .fuzziness(Fuzziness.AUTO)
                                                    .prefixLength(3)
                                                    .maxExpansions(10);

    无论用于创建它的方法是什么,都QueryBuilder必须将对象添加到SearchSourceBuilder,如下所示:

    searchSourceBuilder.query(matchQueryBuilder);

      https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.6/java-rest-high-query-builders.html 提供了所有可用搜索查询的列表以及它们的相应QueryBuilder对象和QueryBuilders帮助方法。

     

    # # 添加排序

    SearchSourceBuilder允许添加一个或多个SortBuilder实例。有四个特殊的实现(Field-,Score-,GeoDistance-和ScriptSortBuilder)。

    sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC)); 
    sourceBuilder.sort(new FieldSortBuilder("id").order(SortOrder.ASC)); 

     

    根据打分降序排列(默认)

     

    也按_id字段升序排序 

     
     
    # # 过滤查询条件(让查询结果不再评分,可以提升性能)
     

      默认情况下,搜索请求返回文档的内容,_source但是就像在Rest API中一样,您可以覆盖此行为。例如,您可以_source完全关闭检索:

    sourceBuilder.fetchSource(false);

      该方法还接受一个或多个通配符模式的数组,以控制以更细粒度的方式包含或排除哪些字段:

    String[] includeFields = new String[] {"title", "innerObject.*"};
    String[] excludeFields = new String[] {"user"};
    sourceBuilder.fetchSource(includeFields, excludeFields);

     

    # # 高亮显示

     突出显示搜索结果可以通过设置来实现HighlightBuilder的 SearchSourceBuilder。通过向中添加一个或多个HighlightBuilder.Field实例,可以为每个字段定义不同的突出显示行为HighlightBuilder

    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    //添加高亮显示的字段 
    HighlightBuilder.Field highlightTitle =
            new HighlightBuilder.Field("title"); 
    //指定高亮的类型
    highlightTitle.highlighterType("unified");  
    //将高亮的相关配置告诉Builder
    highlightBuilder.field(highlightTitle); 
    //新加一个高亮显示的字段 
    HighlightBuilder.Field highlightUser = new HighlightBuilder.Field("user");
    highlightBuilder.field(highlightUser);
    //将高亮的相关配置告诉上级Builder
    searchSourceBuilder.highlighter(highlightBuilder);
     

      Rest API文档中有许多选项的详细说明。Rest API参数(例如pre_tags)通常由具有相似名称(例如#preTags(String ...))的设置器更改。

    突出显示的文本片段可以以后被检索来自SearchResponse

     

    # # 聚合

      可以通过先创建适当的集合AggregationBuilder,然后将其设置在上,将聚合添加到搜索中SearchSourceBuilder。在以下示例中,我们terms在公司名称上创建一个汇总,并在公司中员工的平均年龄上进行子汇总:

    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    TermsAggregationBuilder aggregation = AggregationBuilders.terms("by_company")
            .field("company.keyword");
    aggregation.subAggregation(AggregationBuilders.avg("average_age")
            .field("age"));
    searchSourceBuilder.aggregation(aggregation);

    Building Aggregations 页面提供了所有可用聚合及其相应AggregationBuilder对象和AggregationBuilders帮助器方法的列表。

    后面我们将看到如何来访问聚合SearchResponse

     

     

    # # Requesting Suggestions

    要将“Suggestions”添加到搜索请求中,请使用SuggestionBuilder可从SuggestBuilders工厂类轻松访问的实现之一。建议使用者需要添加到顶层SuggestBuilder,它本身可以在上设置 SearchSourceBuilder

    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    SuggestionBuilder termSuggestionBuilder =
        SuggestBuilders.termSuggestion("user").text("kmichy"); 
    SuggestBuilder suggestBuilder = new SuggestBuilder();
    suggestBuilder.addSuggestion("suggest_user", termSuggestionBuilder); 
    searchSourceBuilder.suggest(suggestBuilder);

     

    TermSuggestionBuilderuser字段和文本创建一个新的kmichy

     

    添加建议生成器并命名 suggest_user

     

      想要使用 聚合(aggregations),就必须指定下边的为true

    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.profile(true);

     

    # # 返回结果(同步情况下)

    SearchRequest以以下方式执行时,客户端将等待SearchResponse返回,然后继续执行代码:

    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

    IOException如果无法在 high-level REST client 中解析REST响应,请求超时或类似的情况(如果服务器没有响应返回),则同步调用可能会引发错误。

    在服务器返回4xx5xx错误代码的情况下,高级客户端尝试改为解析响应正文错误详细信息,然后引发泛型ElasticsearchException并将原始的ResponseException作为抑制的异常添加到它。

     
    # # 返回结果(异步接收)
     

     执行 SearchRequest也可以异步方式完成,以便客户端可以直接返回。用户需要通过将请求和侦听器传递给异步搜索方法来指定如何处理响应或潜在的失败:

    client.searchAsync(searchRequest, RequestOptions.DEFAULT, listener);

     

    SearchRequest执行和ActionListener对执行完毕时使用

    异步方法不会阻塞并立即返回。完成ActionListener后,onResponse如果执行成功完成,则使用onFailure方法进行调用;如果执行失败,则使用方法进行调用。故障情况和预期的异常与同步执行情况相同。

    典型的侦听器search如下所示:

    ActionListener<SearchResponse> listener = new ActionListener<SearchResponse>() {
        @Override
        public void onResponse(SearchResponse searchResponse) {
          //成功后执行的内容
            
        }
    
        @Override
        public void onFailure(Exception e) {
          //失败后执行的内容    
        }
    };
     
     

     # #  SearchResponse

      在SearchResponse由执行搜索返回提供有关搜索执行本身以及访问返回文档的详细信息。首先,有关于请求执行本身的有用信息,例如HTTP状态代码,执行时间或请求是提前终止还是超时:

    RestStatus status = searchResponse.status();
    TimeValue took = searchResponse.getTook();
    Boolean terminatedEarly = searchResponse.isTerminatedEarly();
    boolean timedOut = searchResponse.isTimedOut();

      其次,响应还提供有关受搜索影响的分片总数以及成功与不成功分片的统计信息,从而提供有关分片级别执行的信息。可能的失败也可以通过遍历数组进行处理, ShardSearchFailures如以下示例所示:

    int totalShards = searchResponse.getTotalShards();
    int successfulShards = searchResponse.getSuccessfulShards();
    int failedShards = searchResponse.getFailedShards();
    for (ShardSearchFailure failure : searchResponse.getShardFailures()) {
        // failures should be handled here
    }

     

    # # 检索SearchHits(返回结果的内容)

    要访问返回的文档,我们需要首先获取SearchHits 响应中包含的内容:

    SearchHits hits = searchResponse.getHits();

    SearchHits提供所有点击全局信息,比如命中总数或最大比分:

    TotalHits totalHits = hits.getTotalHits();
    // the total number of hits, must be interpreted in the context of totalHits.relation
    long numHits = totalHits.value;
    // whether the number of hits is accurate (EQUAL_TO) or a lower bound of the total (GREATER_THAN_OR_EQUAL_TO)
    TotalHits.Relation relation = totalHits.relation;
    float maxScore = hits.getMaxScore();

    嵌套在中的SearchHits是可以迭代的各个搜索结果:

    SearchHit[] searchHits = hits.getHits();
    for (SearchHit hit : searchHits) {
        // do something with the SearchHit
    }

    SearchHit可访问索引一样,文档ID和每个搜索命中的得分基本信息:

    String index = hit.getIndex();
    String id = hit.getId();
    float score = hit.getScore();

    此外,它使您可以以简单的JSON-String或键/值对的映射的形式获取文档源。在此映射中,常规字段由字段名称键入并包含字段值。多值字段以对象列表的形式返回,嵌套对象以另一个键/值映射的形式返回。这些情况需要相应地强制转换:

    String sourceAsString = hit.getSourceAsString();
    Map<String, Object> sourceAsMap = hit.getSourceAsMap();
    String documentTitle = (String) sourceAsMap.get("title");
    List<Object> users = (List<Object>) sourceAsMap.get("user");
    Map<String, Object> innerObject =
            (Map<String, Object>) sourceAsMap.get("innerObject");
     
     # # 高亮显示
     

     如果需要,可以从SearchHit结果中的每个检索出突出显示的文本片段。命中对象提供对HighlightField实例的字段名称映射的访问,每个实例包含一个或多个突出显示的文本片段:

    SearchHits hits = searchResponse.getHits();
    for (SearchHit hit : hits.getHits()) {
        Map<String, HighlightField> highlightFields = hit.getHighlightFields();
        HighlightField highlight = highlightFields.get("title"); 
        Text[] fragments = highlight.fragments();  
        String fragmentString = fragments[0].string();
    }
     

     

     # # 检索聚合

    可以从检索聚合,方法是SearchResponse先获取聚合树的根,Aggregations对象,然后按名称获取聚合。

    Aggregations aggregations = searchResponse.getAggregations();
    Terms byCompanyAggregation = aggregations.get("by_company"); 
    Bucket elasticBucket = byCompanyAggregation.getBucketByKey("Elastic"); 
    Avg averageAge = elasticBucket.getAggregations().get("average_age"); 
    double avg = averageAge.getValue();

     

    获取by_company条款汇总

     

    获取带有密钥的存储桶 Elastic

     

    average_age从该存储桶中获取子聚合

    请注意,如果按名称访问聚合,则需要根据请求的聚合类型指定聚合接口,否则ClassCastException将抛出:

    Range range = aggregations.get("by_company");

     

    这将引发异常,因为“ by_company”是一个terms聚合,但是我们尝试将其作为range聚合进行检索

    也可以将所有聚合作为以聚合名称作为关键字的映射来访问。在这种情况下,必须明确地强制转换为正确的聚合接口:

    Map<String, Aggregation> aggregationMap = aggregations.getAsMap();
    Terms companyAggregation = (Terms) aggregationMap.get("by_company");

    还有一些getter会将所有顶级聚合返回为列表:

    List<Aggregation> aggregationList = aggregations.asList();

     您可以遍历所有聚合,然后例如根据其类型决定如何进一步处理它们:

    for (Aggregation agg : aggregations) {
        String type = agg.getType();
        if (type.equals(TermsAggregationBuilder.NAME)) {
            Bucket elasticBucket = ((Terms) agg).getBucketByKey("Elastic");
            long numberOfDocs = elasticBucket.getDocCount();
        }
    }
        
          
             
            
        
    
     
     # # 聚合结果
     

    要从中获取建议SearchResponse,请使用Suggest对象作为入口点,然后检索嵌套的建议对象:

    Suggest suggest = searchResponse.getSuggest(); 
    TermSuggestion termSuggestion = suggest.getSuggestion("suggest_user"); 
    for (TermSuggestion.Entry entry : termSuggestion.getEntries()) { 
        for (TermSuggestion.Entry.Option option : entry) { 
            String suggestText = option.getText().string();
        }
    }

     

     # # 检索分析结果

    SearchResponse使用getProfileResults()方法从中检索分析结果。该方法为执行中涉及的每个分片返回一个Map包含一个ProfileShardResult对象的对象 SearchRequest。使用唯一地标识配置文件结果所对应的分片的密钥ProfileShardResult存储在其中Map

    以下示例代码显示了如何迭代每个分片的所有分析结果:

    Map<String, ProfileShardResult> profilingResults =
            searchResponse.getProfileResults(); 
    for (Map.Entry<String, ProfileShardResult> profilingResult : profilingResults.entrySet()) { 
        String key = profilingResult.getKey(); 
        ProfileShardResult profileShardResult = profilingResult.getValue(); 
    }

     

    检索MapProfileShardResultSearchResponse

     

    如果知道密钥,则可以通过分片的密钥来检索分析结果,否则,对所有分析结果进行迭代可能会更简单

     

    检索标识ProfileShardResult属于哪个分片的密钥

     

    检索ProfileShardResult给定分片的

    所述ProfileShardResult对象本身包含一个或多个查询简档的结果,一个用于抵靠底层Lucene索引执行的每个查询:

    List<QueryProfileShardResult> queryProfileShardResults =
            profileShardResult.getQueryProfileResults(); 
    for (QueryProfileShardResult queryProfileResult : queryProfileShardResults) { 
    
    }

     

    检索列表 QueryProfileShardResult

     

    遍历每个 QueryProfileShardResult

    每个都QueryProfileShardResult可以访问详细的查询树执行,以ProfileResult对象列表的形式返回:

    for (ProfileResult profileResult : queryProfileResult.getQueryResults()) { 
        String queryName = profileResult.getQueryName(); 
        long queryTimeInMillis = profileResult.getTime(); 
        List<ProfileResult> profiledChildren = profileResult.getProfiledChildren(); 
    }

     

    遍历概要文件结果

     

    检索Lucene查询的名称

     

    检索执行Lucene查询的毫秒数

     

    检索子查询的概要文件结果(如果有)

    Rest API文档包含有关性能分析查询的更多信息,并带有查询性能分析信息的描述。

    QueryProfileShardResult还可以访问了Lucene的收藏家的分析信息:

    CollectorResult collectorResult = queryProfileResult.getCollectorResult();  
    String collectorName = collectorResult.getName();  
    Long collectorTimeInMillis = collectorResult.getTime(); 
    List<CollectorResult> profiledChildren = collectorResult.getProfiledChildren();

     

    检索Lucene收集器的分析结果

     

    检索Lucene收集器的名称

     

    检索执行Lucene收集器所花费的毫秒数

     

    检索子收集器的概要文件结果(如果有)

    Rest API文档包含有关Lucene收集器性能分析信息的更多信息。请参阅分析查询

    通过与查询树执行非常类似的方式,这些QueryProfileShardResult对象可以访问详细的聚合树执行:

    AggregationProfileShardResult aggsProfileResults =
            profileShardResult.getAggregationProfileResults(); 
    for (ProfileResult profileResult : aggsProfileResults.getProfileResults()) { 
        String aggName = profileResult.getQueryName(); 
        long aggTimeInMillis = profileResult.getTime(); 
        List<ProfileResult> profiledChildren = profileResult.getProfiledChildren(); 
    }

     

    检索 AggregationProfileShardResult

     

    遍历聚合配置文件结果

     

    检索聚合的类型(与用于执行聚合的Java类相对应)

     

    检索执行Lucene收集器所花费的毫秒数

     

    检索子聚合的概要文件结果(如果有)

    展开全文
  • [es7]es查询实践示例

    2020-12-03 13:22:19
    文章目录前言插入数据示例一、关键字查询二、筛选...以我的大学课设为例子,总结一下自己在做项目时,怎么使用es查询功能。 插入数据示例 [ { "courseDetailUrl": "https://www.icourse163.org/course/BUAA-890

    前言

    以我的大学课设为例子,总结一下自己在做项目时,怎么使用es的查询功能。





    插入数据示例

    [
      {
        "courseDetailUrl": "https://www.icourse163.org/course/BUAA-89007",
        "courseName": "航空航天概论",
        "courseCoverUrl": "https://img-ph-mirror.nosdn.127.net/nIfa0p6KY_OYswDbNogLGA==/1458603329415573314.png",
        "courseIsFree": 1,
        "courseApplicant": 8472,
        "courseGraderNum": 304,
        "courseScore": 4.8,
        "courseIntroduction": "\n    航空航天是人类拓展和探索大气层及宇宙空间的产物,代表着最先进的科学技术领域。航空航天概论主要讲述了航空航天基本概念、航空航天发展概况、飞行器的飞行原理、动力系统、构造及其机载设备等方面的基本知识、基本原理和常用技术。通过课程的学习,可以使学生对航空航天的基本知识和基本技术有一个比较全面的了解,同时也可以掌握航空航天技术的最新发展动态和发展趋势,是学生了解航空航天知识的重要窗口,也是培养学生对航空航天兴趣和爱好,激发学生热爱航空、献身航空的有效途径。\n",
        "courseSyllabus": "\n\n第一周  航空航天发展概况第一周内容介绍第1讲 航空航天的概念、分类及作用第2讲 世界航空航天技术发展第3讲 中国航空航天技术发展第一周测试第二周  升力与阻力的产生第二周内容介绍第1讲 流体流动基本规律第2讲 飞机的升力第3讲 飞机的阻力第二周测试第三周 飞机气动布局及飞行性能第三周内容介绍第1讲 超声速飞行特点第2讲 飞机飞行性能第3讲 飞机操纵性与稳定性第三周测试第三周作业第四周 直升机飞行原理与航天器飞行原理第四周内容介绍第1讲 直升机的飞行第2讲 直升机的操纵第3讲 航天器飞行原理第四周测试第五周 航空器动力装置第五周内容介绍第1讲 活塞式发动机第2讲 涡轮喷气发动机第3讲 其他航空发动机第五周测试第五周作业第六周 航天器动力装置第六周内容介绍第1讲 液体火箭发动机第2讲 固体火箭发动机第3讲 非常规火箭发动机第六周测试第七周 飞行器导航与制导第七周内容介绍第1讲 导航与飞行控制第2讲 导弹的类型第3讲 导弹的制导第七周测试第八周 飞行器构造第八周内容介绍第1讲 飞机机体构造第2讲 飞机起落架第3讲 航天器构造第八周测试\n\n",
        "School": {
          "schoolLogoUrl": "https://img-ph-mirror.nosdn.127.net/Kv3j_azNQD8sFDvfqRFaHQ==/6597941679379294936.jpg",
          "schoolName": "北京航空航天大学",
          "schoolIntroduction": "https://www.icourse163.org/university/BUAA"
        },
        "Platform": {
          "platformName": "中国大学mooc",
          "platformIntroduction": "中国大学MOOC(慕课) 是国内优质的中文MOOC学习平台,由爱课程网携手网易云课堂打造。平台拥有包括985高校在内提供的千余门课程",
          "platformIndexUrl": "https://www.icourse163.org/",
          "platformId": "zgdxmk"
        },
        "Semester": [
          {
            "semesterStartTime": "2020-02-17",
            "semesterEndTime": "2020-06-30",
            "semesterStatus": 2,
            "semesterReference": "https://www.icourse163.org/course/BUAA-89007/info",
            "Teacher": [
              {
                "teacherName": "杨超",
                "teacherPhotoUrl": "https://img-ph-mirror.nosdn.127.net/CZp5VCnhU9UljP8Vo_FuLw==/776870935821684376.jpg",
                "teacherIntroduction": "教授,课程负责人"
              },
              {
                "teacherName": "贾玉红",
                "teacherPhotoUrl": "https://img-ph-mirror.nosdn.127.net/OMT9wW0HT5pHML_OTdsVJw==/1940488489543555909.jpg",
                "teacherIntroduction": "教授,课程负责人"
              },
              {
                "teacherName": "吴永康",
                "teacherPhotoUrl": "https://img-ph-mirror.nosdn.127.net/wssozG8qHFe6R9mTYlxSrA==/6597351241635531066.jpg",
                "teacherIntroduction": "副教授"
              }
            ],
            "semesterNo": 1
          }
        ],
        "courseId": "course_10001",
        "courseCategory": [
          "工学",
          "国家精品"
        ]
      },
      {
        "courseDetailUrl": "https://www.icourse163.org/course/DLMU-1001979017",
        "courseName": "海上货物运输",
        "courseCoverUrl": "https://edu-image.nosdn.127.net/02666AE0F5AD673B5AD883066FDA814B.jpg?imageView&thumbnail=426y240&quality=100",
        "courseIsFree": 1,
        "courseApplicant": 2159,
        "courseGraderNum": 85,
        "courseScore": 4.9,
        "courseIntroduction": "\n海上货物运输是以船舶为载运工具,以货物为运输对象,通过海路,安全、优质、快速、经济地从始发港运达目的港的行为。《海上货物运输》课程是利用船舶静力学、材料力学、海运货物学、海运法规等知识研究各类海上运输货物的海运特性、各类运输船舶的货运性能、对货物在整个运输过程中的各个环节进行安全操作、有效管理的一门应用学科。其中货物主要包括普通杂货、特殊杂货、固体散货、液体散货、集装化货物,运输环节包括货物受载、配载、装载、积载、运载、卸载。课程的目的和任务是让学生掌握在海上货物运输过程中保证船舶、货物、人员、环境安全、货物完整及提高经济效益的基本原则,培养学生预防事故、正确面对事故和处理事故的能力。\n",
        "courseSyllabus": "\n\n第一章 海运船舶与货物1.1 船舶基础知识1.2 船舶载货能力1.3 船舶性能介绍1.4 货物基础知识海运船舶与货物第一章章测试第二章 包装危险货物运输2.1 包装危险货物分类及危险性2.2 危险货物包装2.3 危险货物标志2.4 危险货物积载2.5 危险货物隔离2.6 国际海运危险货物规则包装危险货物运输第二章章测试第三章 普通杂货运输3.1 杂货分类及特性3.2 杂货船分类及结构特点3.3 普通杂货配装要求3.4 杂货船配载图编制3.5 普通杂货安全装运普通杂货运输第三章 章测试第四章 固体散货运输4.1 固体散货分类及特性4.2 固体散货船分类及结构特点4.3 固体散货装载计划编制4.4 固体散货安全装运4.5 水尺计重固体散货运输第四章 章测试第五章 散装谷物运输5.1 散装谷物海运特性5.2 散装谷物船结构特点及运输规则5.3 散装谷物配装5.4 散装谷物安全装运5.5 散装谷物船稳性核算散装谷物运输第五章章测试第六章 集装箱运输6.1 集装箱分类和标志6.2 集装箱船分类及结构特点6.3 集装箱船配装6.4 集装箱安全装运集装箱运输第六章 章测试第七章 特殊杂货运输7.1 货物单元积载与系固7.2 CSS规则7.3 重大件货物安全运输7.4 木材甲板货安全运输7.5 卷钢货物安全运输特殊杂货运输第七章 章测试第八章 液体散货运输8.1 石油安全运输8.2  石油计量8.3 散装化学品安全运输8.4 液化气体安全运输8.5 LNG安全运输液体散货运输第八章 章测试\n\n",
        "School": {
          "schoolLogoUrl": "https://img-ph-mirror.nosdn.127.net/EC0NQFDOLKHiBlNuAEKK_A==/6630699429303599547.png",
          "schoolName": "大连海事大学",
          "schoolIntroduction": "https://www.icourse163.org/university/DLMU"
        },
        "Platform": {
          "platformName": "中国大学mooc",
          "platformIntroduction": "中国大学MOOC(慕课) 是国内优质的中文MOOC学习平台,由爱课程网携手网易云课堂打造。平台拥有包括985高校在内提供的千余门课程",
          "platformIndexUrl": "https://www.icourse163.org/",
          "platformId": "zgdxmk"
        },
        "Semester": [
          {
            "semesterStartTime": "2020-03-02",
            "semesterEndTime": "2020-06-30",
            "semesterStatus": 2,
            "semesterReference": "https://www.icourse163.org/course/DLMU-1001979017/info",
            "Teacher": [
              {
                "teacherName": "田佰军",
                "teacherPhotoUrl": "https://edu-image.nosdn.127.net/5AE9E42699C566441EBEFF43829319F2.JPG?imageView&amp;thumbnail=180y180&amp;quality=100",
                "teacherIntroduction": "船长 副教授"
              },
              {
                "teacherName": "王文新",
                "teacherPhotoUrl": "https://edu-image.nosdn.127.net/D2559AFEDA5375DFEA5472B4FB8D646D.jpg?imageView&thumbnail=582y582&quality=100",
                "teacherIntroduction": "副教授"
              },
              {
                "teacherName": "姜华",
                "teacherPhotoUrl": "https://edu-image.nosdn.127.net/AFB830FA8DC47BFB219352DDB5484FA8.jpg?imageView&thumbnail=582y582&quality=100",
                "teacherIntroduction": "副教授"
              }
            ],
            "semesterNo": 1
          }
        ],
        "courseId": "course_10002",
        "courseCategory": [
          "工学",
          "国家精品"
        ]
      },
      {
        "courseDetailUrl": "https://www.icourse163.org/course/XZNU-1001754173",
        "courseName": "中国古典诗文朗诵与吟诵",
        "courseCoverUrl": "https://edu-image.nosdn.127.net/CDD4F37D1A7C19947B185CA159E8332E.jpg?imageView&thumbnail=510y288&quality=100",
        "courseIsFree": 1,
        "courseApplicant": 13302,
        "courseGraderNum": 1118,
        "courseScore": 4.8,
        "courseIntroduction": "\n中国,是一个有着数千年文明的国度,一代又一代的人们将自己的心声凝结在诗文之中,使“中国心”成为一种延绵不断的永恒。汉语,是一种具有旋律感的有声语言,一代又一代的人们在诗文朗诵声中拥抱历史和感受当下,将过去、今天和未来华夏大地上的人们凝聚成“中国人”。本课程向你讲述中国诗文朗诵的历史传统,讲解朗诵古代各种文体的基本规则要领,解析和演示古诗文朗诵怎样把握作品的思想内涵和情感基调,怎样处理朗诵的音流节奏和语调语气,从而使古诗文朗诵既有古典风味又有现代审美品质。诗文吟诵,有两千多年传统,是一种独特的汉语声乐形态。近些年来,一度消歇的传统诗文吟诵逐步进入人们的视野,但仍然有不少人觉得传统吟诵既陌生又神秘。本课程向你讲述诗文吟诵的历史传统,展示全国各地老先生们有代表性的吟诵,讲解传统吟诵的基本规则,使你理解什么是真正的传统吟诵;传授古诗文吟诵的具体方法和操作要领,使你学会传统吟诵。古诗文吟诵,其实并不难,只要你有心学一学,进入本课程,你肯定能学会!同学们,传统吟诵之声,将来就靠你们传递下去呢!\n",
        "courseSyllabus": "\n\n第一讲 中国汉语朗诵的传统和功能一、中国古代的诵读传统;二、古代诵读的功能。第一讲 中国汉语朗诵的传统和功能第二讲 古典诗文诵读的基本规则(上)一、古典诗文朗诵的语音;二、怎样处理古今音的差异; 三、古典诗文朗诵的“字声饱满”。第二讲 古典诗文诵读的基本规则(上)第三讲  古典诗文诵读的基本规则(下)一、古典诗文朗诵的“语流”;二、古典诗文朗诵的语调。第三讲 古典诗文诵读的基本规则(下)第四讲  诗意的表现:古典诗歌朗诵的要领(上)一、把握作品的主题和基本情调; 二、感受作品描绘的场景和意境; 三、体味作品的文学品位和人格气质。第四讲 诗意的表现:古典诗歌朗诵的要领(上)第五讲  诗意的表现:古典诗歌朗诵的要领(下)一、《蜀相》赏析及朗诵; 二、《将进酒》赏析及朗诵;三、《无题》赏析及朗诵;四、《游子吟》赏析及朗诵;五、《春江花月夜》赏析及朗诵。第五讲 诗意的表现:古典诗歌朗诵的要领(下)第六讲  《诗经》朗诵一、《诗经》介绍;二、《周颂·天作》赏析及朗诵; 三、《国风·关雎》赏析及朗诵;四、《魏风·伐檀》赏析及朗诵; 五、曹操《观沧海》赏析及朗诵。第六讲 《诗经》朗诵第七讲  楚辞朗诵一、楚辞介绍;二、《橘颂》赏析及朗诵; 三、《九歌·国殇》赏析及朗诵;四、《离骚》(节选)赏析及朗诵;五、刘邦《大风歌》赏析及朗诵;六、蔡琰《悲愤诗》赏析及朗诵。第七讲 楚辞朗诵第八讲   长篇叙事诗的朗诵一、叙事结构;二、叙事视角;三、叙事诗中的场景意境、人物形象、行为动作;四、《琵琶行》赏析及朗诵;五、《石壕吏》赏析及朗诵。第八讲 长篇叙事诗的朗诵第九讲  词体作品朗诵(上)一、词的结构与特点;二、柳永《雨霖铃》赏析及朗诵;三、周邦彦《虞美人》赏析及朗诵;四、陆游《钗头凤》赏析及朗诵;五、苏轼《江城子》赏析及朗诵;六、欧阳修《南歌子》赏析及朗诵。第九讲 词体作品朗诵(上)第十讲  词体作品朗诵(下)一、苏轼《念奴娇》赏析及朗诵;二、苏轼《水调歌头》赏析及朗诵;三、辛弃疾《破阵子》赏析及朗诵;四、辛弃疾《摸鱼儿》赏析及朗诵第十讲 词体作品朗诵(下)第十一讲  曲体作品朗诵一、曲体作品的特点; 二、关汉卿《四块玉》赏析及朗诵; 三、关汉卿《沉醉东风》赏析及朗诵; 四、马致远《夜行船》赏析及朗诵;五、乔吉《水仙子》赏析及朗诵;六、张可久《小桃红》赏析及朗诵第十一讲 曲体作品朗诵第十二讲  古典散文朗诵(上)一、散文的特征; 二、《论语》朗诵示例; 三、《孟子》朗诵示例;四、《庄子》朗诵示例;五、王勃《滕王阁序》(节选)赏析及朗诵; 六、刘禹锡《陋室铭》赏析及朗诵;七、杜牧《阿房宫赋》赏析及朗诵。第十二讲  古典散文朗诵(上)第十三讲  古典散文朗诵(下)一、范仲淹《岳阳楼记》赏析及朗诵;二、苏轼《赤壁赋》赏析及朗诵; 三、归有光《项脊轩志》赏析及朗诵。第十三讲  古典散文朗诵(下)第十四讲  传统的古典诗文吟诵及其当代价值(上)一、古代“吟”“诵”的含义;二、古代吟诵的特点;三、老先生的吟诵示例。第十四讲 传统的古典诗文吟诵及其当代价值(上)第十五讲  传统的古典诗文吟诵及其当代价值(下)一、对待传统吟诵的正确态度;二、全国各地老先生的吟诵示例。第十五讲  传统的古典诗文吟诵及其当代价值(下)第十六讲  传统古典诗文吟诵的基本规则与要领一、什么是传统的“吟诵调”;二、传统吟诵的第一规则:语步诵行; 三、传统吟诵的第二规则:吟腔的程式化与灵活性; 四、传统吟诵句格的几种形式;五、吟诵腔格。第十六讲  传统古典诗文吟诵的基本规则与要领第十七讲  绝句吟诗调与套调一、套调的运用;二、传统吟诵套调的两个注意点。第十七讲 绝句吟诗调与套调第十八讲  套调:不同诗体的吟诵(上)一、以绝套律;二、四言诗的套调吟诵。第十八讲 套调:不同诗体的吟诵(上)第十九讲  套调:不同诗体的吟诵(下)一、套吟《游子吟》;二、《将进酒》的吟诵示范。第十九讲 套调:不同诗体的吟诵(下)第二十讲  套调;词体的吟诵一、长短句的吟诵特点; 二、吟诵的“声情”与“词情”。第二十讲 套调;词体的吟诵\n\n",
        "School": {
          "schoolLogoUrl": "https://edu-image.nosdn.127.net/A53D3664B32C8E02EBEEE1BF4B40C7C3.png?imageView&amp;thumbnail=220y80&amp;quality=100",
          "schoolName": "江苏师范大学",
          "schoolIntroduction": "https://www.icourse163.org/university/XZNU"
        },
        "Platform": {
          "platformName": "中国大学mooc",
          "platformIntroduction": "中国大学MOOC(慕课) 是国内优质的中文MOOC学习平台,由爱课程网携手网易云课堂打造。平台拥有包括985高校在内提供的千余门课程",
          "platformIndexUrl": "https://www.icourse163.org/",
          "platformId": "zgdxmk"
        },
        "Semester": [
          {
            "semesterStartTime": "2020-02-17",
            "semesterEndTime": "2020-06-15",
            "semesterStatus": 3,
            "semesterReference": "https://www.icourse163.org/course/XZNU-1001754173/info",
            "Teacher": [
              {
                "teacherName": "李昌集",
                "teacherPhotoUrl": "https://edu-image.nosdn.127.net/47A58DE84532B34F1433542E072B3012.jpg?imageView&thumbnail=180y180&quality=100",
                "teacherIntroduction": "教授"
              }
            ],
            "semesterNo": 1
          }
        ],
        "courseId": "course_10003",
        "courseCategory": [
          "通识选修类",
          "文学文化",
          "国家精品"
        ]
      }
    ]
    

    一、关键字查询

    在这里插入图片描述
    最基础的查询语句,查询包括所输入关键字的字段,并且以source为返回结果,可以看到返回的查询结果还是较为让人满意的。

    在这里插入图片描述
    (为了在文档里展示方便,在查询语句中增加了一个参数,仅返回课程名称字段。
    在这里插入图片描述




    二、筛选条件

    MOOCGLE在搜索结果页为用户提供结果的筛选功能,用户可以根据自己的需求,选择筛选条件,包括课程所属课程平台、课程状态(即将开始、正在进行、已结束)、课程是否收费等条件进行对搜索结果进行筛选。

    在这里插入图片描述

    课程平台

    在这里插入图片描述

    由于我们所采集的15000多条数据分别来自六个不同的MOOC平台,考虑到不同用户对课程平台的喜好程度以及会员制度、不同平台的课程质量等原因,所以我们为用户提供了课程平台的筛选条件。使用terms过滤,可以做到根据课程平台ID进行不同平台课程的筛选,可以做到多选和单选,也考虑过使用课程平台名称作为terms过滤的条件,也可以做到筛选效果,但是考虑到课程平台后续的增加会导致可能有名称相近等因素,还是选择增加了课程平台ID这一字段作为筛选条件。上图显示为筛选来自中国大学mooc网和edX的课程。

    课程是否免费

    在这里插入图片描述

    现在很多的mooc平台为了维持运营以及收益对部分的课程进行了收费的处理,对于用户来讲,是否收费是个重要的问题,所以MOOCGLE也提供了对课程是否收费的筛选条件,同样是采取了terms过滤,上图显示为筛选免费的课程。

    课程状态

    在这里插入图片描述

    课程状态也是一个很重要的筛选条件,用户可以选择即将开始的课程加入跟随课程进度学习、也可选择已结束的课程进行快速回放学习。最开始,我们根据课程状态这个字段进行terms过滤,但是发现存在一个很严重的问题,就是这样需要数据的更新频率极高,至少要做到一天一次更新,并且更新很不容易,需要对每一个课程进行更新。于是,我们考虑根据课程的开始时间与结束时间使用range过滤来进行筛选。

    在这里插入图片描述

    开始时间在今日之后的课程即为即将开始的课程。

    在这里插入图片描述

    开始时间在今日之前、结束时间在今日之后的课程即为正在进行的课程。

    在这里插入图片描述

    结束时间在今日之前的即为已结束的课程。

    课程时间

    在这里插入图片描述

    同样使用range过滤也可以对不同时间的课程进行筛选,满足用户对不同时段课程的不同需求。

    三、排序条件

    MOOCGLE同样为用户对搜索结果提供不同的排序方式,我们使用sort进行排序,sort只能对数值型和日期型进行排序,所以我们提供了按照课程评分排序、按照课程人气排序和按照课程时间进行排序。

    课程评分

    在这里插入图片描述
    在这里插入图片描述
    其中order参数为排序方式,desc为降序排列,asc为升序排列,我们默认按照课程评分的降序排列。

    课程人气

    在这里插入图片描述

    课程时间

    在这里插入图片描述

    分页搜索

    分页使用了from+size进行浅分页
    在这里插入图片描述
    其中,from定义了目标数据的偏移值,size定义当前返回的数目。

    在这里插入图片描述

    第一页所展示的查询语句from为0,size为10,第二页from为10,size为10,以此类推。
    from+size查询在10000-50000条数据(1000到5000页)以内的时候还是可以的,但是如果数据过多的话,就会出现深分页问题。

    为了解决上面的问题,elasticsearch提出了一个scroll滚动的方式。

    scroll 类似于sql中的cursor,使用scroll,每次只能获取一页的内容,然后会返回一个scroll_id。根据返回的这个scroll_id可以不断地获取下一页的内容,所以scroll并不适用于有跳页的情景。

    在这里插入图片描述

    文本高亮

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    对搜索关键字进行高亮显示,由于筛选过程也是用的查询语句,所以考虑过对筛选条件也进行文本的高亮显示,但是后发现课程平台ID这类字段并不显示在查询结果的页面上,并且筛选过后的所有结果都是同一类型的(也就是说筛选条件均为高亮)没有实际意义,所以后删除了对筛选的高亮。高亮效果如下:

    在这里插入图片描述

    四、自动补全及纠错

    Elasticsearch中的Suggesters API可以提供自动补全以及纠错的功能。 Suggesters基本的运作原理是将输入的文本分解为token,然后在索引的字典里查找相似的term并返回。 根据使用场景的不同,Elasticsearch里设计了4种类别的Suggester,分别是:

    • Term Suggester(纠错补全,输入错误的情况下补全正确的单词)
    • Phrase Suggester(自动补全短语,输入一个单词补全整个短语)
    • Completion Suggester(完成补全单词,输出如前半部分,补全整个单词)
    • Context Suggester(上下文补全)

    由于对于mooc的搜索中短语应用比较少,所以phrase suggester在我们项目中的效果并不是非常理想,所以没有采用phrase suggester。而context suggester作为上下文筛选器,对于我们进行课程的搜索可以说作用较小,并且context suggester的难度也较高,于是也没有采用。所以moocgle使用了term suggester和completion suggester做到了自动补全以及纠错(包括拼音的自动补全)。

    term suggester:纠错

    在这里插入图片描述
    在这里插入图片描述
    可以看到分词和纠错的的效果都是比较优秀的。

    completion suggester:自动补全

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    拼音补全

    在这里插入图片描述

    五、聚合查询

    聚合框架有助于根据搜索查询提供聚合数据。聚合查询是数据库中重要的功能特性,ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。

    指标聚合是对文档进行一些权值计算(比如求所有文档某个字段求最大、最小、和、平均值),输出结果往往是文档的权值,相当于为文档添加了一些统计信息。它基于特定字段(field)或脚本值(generated using scripts),计算聚合中文档的数值权值。

    MOOCGLE只是简单的做到了值计数聚合。计算聚合文档中关于某个keyword的课程的个数,未来考虑再增加一些其他聚合查询的内容。

    在这里插入图片描述

    在这里插入图片描述

    六、分面搜索

    分面搜索支持用户根据自己的需要选取不同的分面进行筛选,而不必按照网站预先设定的单一方式寻找。分面搜索允许用户自己创建搜索路径,并且可以随时扩大和缩小结果范围。它只展现有对应结果的选项,避免了无搜索结果的情况。

    并且一般在搜索前提示用户该选项内包含的结果数量,给用户良好的操作前提示。
    MOOCGLE为用户提供了课程类别的分面搜索,在用户进行查询操作后,动态的根据关键字为用户提供相关的课程类别,同时利用聚合搜索为用户展示每个类别有关的课程的数量。

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • ```@PostMapping("agg") public Page<Item> testAgg(){ NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}...
  • es 查询怎么排除那些只要有一条数据是空的字段 比如我es中的数据是这样的: ``` { "took": 28, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { ...
  • 最近两天一直在学习ES的相关内容。 入门级别; 学习途径:主要是官方文档 这篇文章主要关注使用ES查询...其实不管怎么分类就是查询,就看我们怎么理解,怎么去使用它的特性,去解决问题。 # #先来将一下ES的...

    最近两天一直在学习 ES 的相关内容。

     入门级别;

     学习途径:主要是官方文档

     这篇文章主要关注使用ES做查询

     

    # # 在我的理解看来,查询有不同的分类形式

     第一种分类:基本查询和组合查询

     第二种分类:打分查询和不打分查询

     这个分类只代表我自己的理解。其实不管怎么分类就是查询,就看我们怎么理解,怎么去使用它的特性,去解决问题。

     

    # # 先来将一下 ES 的查询 和 我之前学的SQL查询

      之前习惯使用关系型数据库,所以写查询语句都是: select * from tablename where cloumname="..";

      而在ES 中叫做 DSL(查询表达式),在我的理解看来,其实没什么变化,查询语句还是查询语句,只不过变了一种写法而已,DSL就是一种JSON 格式罢了。不信来看一下:

      这里做一个简单的映射,并不是绝对的说 match 就是 where 

     

    # # 再来看一下我前边提到的分类,基本查询

     所谓的节本查询,其实就是一些查询条件

     match 查询 ,这个相当于是 sql 中的 where 并且加模糊的条件  例如:select * from table where name like"张%"

           这个在es 中的例子,就是上边的图片。

     range 查询  ,这个相当于是 sql 中的 where 后边跟着一个范围查询 例如 select * from table where age>20 and age<30

           这个在es 中的查询语句,就是写成了json格式:

       

     term 查询,这个相当于是 sql 中的 where 并且加精确的条件,例如 select * from table where age = 26

       在es中的查询语句就是:

     

     terms 查询,这个相当于是 sql 中的 where 并且in的条件,例如: select * from table where tag in(search,full_text,nosql)

        而在es中

     exists 和 missing 查询 这与SQL中的 IS_NULL (missing) 和 NOT IS_NULL (exists) 在本质上具有共性,例如 select * from table where title  not  IS_NULL 

     

    # # 再来看一下我前边提到的分类,组合查询

      这个其实就是,将一些条件进行组合,举个例子,select * from table where name="张三" and age in(15,20,30)

      而在es 里边又是另外一种形式,同时ES 对这些查询进行了增强,我们应该知道ES是可以做相关性查询的,这是和关系数据库最大的区别,也是ES最大的优点之一。所以对查询做了增强。

      在ES 中增加了这些字段:

               must : 必须包含查询内容

               must_not :必须不包含查询内容

               should:最好包含查询内容,包含的越多,得分越多,这个得分和打分查询有关系

               filter : 必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献。

     来看一下ES的组合查询的语句是怎么写的:

    {
        "bool": {
            "must":     { "match": { "title": "how to make millions" }},
            "must_not": { "match": { "tag":   "spam" }},
            "should": [
                { "match": { "tag": "starred" }}
            ],
            "filter": {
              "range": { "date": { "gte": "2014-01-01" }} 
            }
        }
    }

      这一块具体介绍,还是看下官方文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/combining-queries-together.html

     

    # #  打分查询和不打分查询

      对于打分不打分这个问题,最主要的还是性能的影响,说白了,不打分查询要比打分查询的性能更好一点。并且对于一些精确查询,其实是完全没有必要打分的。将查询条件移到 filter 语句中,我们将它转成不评分的查询,将不再影响文档的相关性排名。由于它现在是一个不评分的查询,可以使用各种对 filter 查询有效的优化手段来提升性能

      对于打不打分,filter 这个关键字很重要。对于一个组合查询,如果不想打分,则将查询的条件放进 filter 里边即可。

     

      

     

     

    展开全文
  • ES之分布式分页查询

    2018-11-03 14:25:08
    但是当用户分页获取查询结果时,ES又是怎么获得全局的排序并取得分页结果呢? 这不光是ES会遇到的问题,所有的分布式存储数据排序都会有这个问题。 逐步分析 假设我们的索引有5个分片,每个分片上10万个文档数据 ...

    我们知道ES的查询是非常快的,且每个索引的数据是存储在多个分片中的,查询压力负载到多个分片机器上,最后汇合查询结果,减轻了机器压力同时加快了速度。

    但是当用户分页获取查询结果时,ES又是怎么获得全局的排序并取得分页结果呢?

    这不光是ES会遇到的问题,所有的分布式存储数据排序都会有这个问题。

    逐步分析

    假设我们的索引有5个分片,每个分片上10万个文档数据

    获取1~10条

    我们知道单个节点数据都在本地,排序是很方便的。我们很容易将各个节点数据进行排序,分别取排序为1~10的文档数据,然后汇总从5(分片数) * 10(单片文档数)=50 条数据中获得1~10的文档。

    获取11~20条

    一个误区:有人会想当然的认为从上一个步骤中获取的50条数据中,直接取出11~20即为结果。他们觉得这些数据都是各个分区的前10组成,那么组成的结果理所当然的就是所有数据中排名的前50。

    这是不对的。因为你只是取了各分片的前10条数据,它们只在各自分片下排序有用,无法证明这10条就一定比其它分片的11~n条数据大。

    了解了误区,类别第一步,我们很容易知道应该获取5(分片数) * 20(单片文档数)=100条数据,然后整体排序,取得第11~20条数据。

    获取第pageNumber页数据

    由前两步可知: 当我们想获取分页数据时: es需要总共获得: (pageNumber * pageSize * 分片数)条数据,然后汇总排序,再取得所需结果。

    如果pageNumber 和 pageSize 非常大, es每个分片所需获取的数据就会非常多,网络带宽以及后续的汇总会占用很多资源,严重影响性能。

    因此使用es非常不建议进行深分页

    数据汇总

    我们知道es从各个节点总共获取到(pageNumber * pageSize * 分片数)条数据,需要排序取得总排名为1~pageNumber * pageSize的数据,然后再取其最后10条数据。

    如何处理排序呢?

    构建一个长度为(pageNumber * pageSize * 分片数)的数组,然后调用排序算法将整体排序,然后再获取结果即可。

    可以但不可行。但pageNumber或pageSize或分片数,任意一个参数变大时,总数组长度增加的太快,太耗费内存。

    使用优先队列:

    许多时候我们需要处理有序的元素,但不一定要求他们全部有序,或是不一定要一次就将他们排序,这种时候就需要优先队列这种数据结构。

    优先队列需要支持两种操作:删除最大元素插入元素

    效果:可从不间断的输入数据中,始终筛选出当前输入数据中指定长度的最大的(或最小的)元素。

    主分片创建优先队列,将本节点的符合条件的数据存入优先队列中,汇总其它节点数据时,只需将数据一个一个输入到优先队列中,队列会自动完成过滤,非常方便,也无需构建那么长的数组。

    展开全文
  • 做成便于查询的数据结构,以用于添加 es 文档时的快速查询。 例如,映射<人员,部门>可用于查询:人员所属的部门; 例如,映射<部门,标签>可用于查询:部门所贴的标签; 用到了 Guava 的  Multimap ,以达到...
  • // 这是查询 "query": { "bool": { "must": [ { "range": { "catm": { // 这里的时间范围会影响到我们后面的对时间的聚合 ".
  • es在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 问这个问题,是肯定的,说白了,就是看你有没有实际干过es,因为啥?es说白了其实性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条...
  • Java 正则表达式 es查询参数range匹配和替换 目录 匹配和替换es查询参数range 要求: 代码: 整合: 总结: 在es查询的时候,处理了es参数查询中常见的内容。如果是有range的情况,要怎么处理呢? Range是...
  • ES的url方式的查询方法

    万次阅读 2018-11-29 11:23:04
    最近公司在做用户画像,后面搭建es集群,为了实现根据标签查询用户的...后面肯定不是用es原生API的方式进行查询的,那么http方式的查询es怎么样呢? 首先知道es集群的ip地址,默认端口9200。 1.根据id精准查询: ...
  • 查询ES(ElasticSearch)版本

    万次阅读 2020-12-11 19:39:13
    2. 对于没有启动的es怎么查看版本号呢? 进入安装目录执行以下内容即可看到版本: 那么不知道es的安装目录怎么办呢? 看这个链接就知道了:https://blog.csdn.net/fsjwin/article/details/111052081 或者问你的安装...
  • 十亿级别数据量的es查询优化

    千次阅读 2015-08-15 19:40:22
    es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 面试官心理分析 这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别...
  • ES-索引查询机制(三)

    2019-09-23 19:07:07
    ES查询可以分为两大类,一类是Get,一类是Search,下面说一下Es内部是怎么实现的. 一:Get检索 通过ID检索特定的Doc > 查询的时候是先查询内存中的TransLog,如果找到就立即返回 > 如果没找到再查询磁盘上的...
  • es并非只能通过DSL语句来查询数据,其实它也能够用sql来查询。 示例: POST /_sql { "query": "SELECT * FROM library" } 查询结果: 或许你会觉得,这个太丑,不慌,咱们来点熟悉的,只需要在url上加上format=...
  • 我想把下面的es查询语句,使用es的Java api实现,有人知道怎么写吗???? GET /weijian/news/_search { "aggs": { "unique_title": { "terms": { "field": "title", "order": [ { "aggPostTime":...
  • ES大数据量下查询优化

    千次阅读 2020-09-18 10:43:46
    es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 面试官心理分析 这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别...
  • 关于涉及到的表是看各自公司在配置ES数据库的时候是怎么定义的 1.嵌套属性的查询和根属性不一样:查询es表的所有数据 因为是nested类型,所以必须有一个nested的查询语句:下面一定有两个参数,分别是“path”和...
  • es在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 问这个问题,是肯定的,说白了,就是看你有没有实际干过es,因为啥?es说白了其实性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条...
  • 今天看了es的一个问题,一个term filter过滤非空的字段,怎么都出不来结果,但是放到query里就可以: {"from":0,"query":{"filtered":{"filter":{"bool":{"must":[],"must_not":[{"term":{"remark":...
  • 在收索商品后我们要展示两部分,一是品牌,型号,价格区间等查询的分开,二是查询出来的商品要展示,为了减少代码冗余,我们就将所需要的数据进行整合,如图 实体代码: ```java import org.springframework.data....
  • 前言 经常会有人吐槽,Elasticsearch...Elasticsearch的查询慢的问题往往是由多种因素造成的,同时我们也需要遵循Elasticsearch的查询准则:ES适合top N的查询,不适合大数据量返回的查询。 场景1 内存参数配置不合...
  • es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 面试官心理分析 这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别...
  • es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 面试官心理分析 这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 291
精华内容 116
关键字:

es怎么查询