zoukankan      html  css  js  c++  java
  • Elasticsearch学习之查询去重

    1. 实现查询去重、分页,例如:实现依据qid去重,createTime排序,命令行为:

    GET  /nb_luban_answer/_search
    {
      "query": {
        "match": {
          "status": 1
        }
      },
      "sort": [
        {
          "createTime": {
            "order": "desc"
          }
        }
      ],"aggs": {
        "qid": {
          "terms": {
            "field": "qid",
            "size": 10
          },"aggs": {
            "rated": {
              "top_hits": {
                "sort": [{
                  "createTime": {"order": "desc"}
                }], 
                "size": 1
              }
            }
          }
        }
      }, 
      "size": 0,
      "from": 0
    } 

    JAVA API

    String indexName="nb_luban_answer";
            String typeName="luban_answer";
            AggregationBuilder aggregation =
                    AggregationBuilders
                            .terms("agg").field("qid")
                            .subAggregation(
                                    AggregationBuilders.topHits("top").addSort("createTime",SortOrder.DESC).setSize(1)
                            );
     
            SearchResponse sResponse = Tool.CLIENT.prepareSearch(indexName).setTypes(typeName)
                    .setQuery(QueryBuilders.matchQuery("status",1))
                    .addSort("createTime", SortOrder.DESC)
                    .addAggregation(aggregation)
                    .execute().actionGet();
            Terms agg = sResponse.getAggregations().get("agg");
            for (Terms.Bucket entry : agg.getBuckets()) {
                String key = String.valueOf(entry.getKey()) ;
                long docCount = entry.getDocCount();
                System.out.println("key:"+ key +" doc_count:"+ docCount);
     
                TopHits topHits= entry.getAggregations().get("top");
                for (SearchHit hit : topHits.getHits()){
                    System.out.println(" -> id: "+ hit.getId()+" createTime: "+hit.getSource().get("createTime"));
                }
            }

    2. 取得某个索引中某个字段中的所有出现过的值

    这种操作类似于使用SQL的SELECT UNIQUE语句。当需要获取某个字段上的所有可用值时,可以使用terms聚合查询完成:eg: select distinct street_name from table_name ;

    GET /index_streets/_search?search_type=count
    {
     "aggs": {
       "street_values": {
         "terms": {
           "field": "name.raw",
           "size": 0
         }
       }
     } 
    }

    因为目标是得到name字段上的所有出现过的值,因此search_type被设置为了count,这样在返回的响应中不会出现冗长的hits部分。另外,查询的目标字段的索引类型需要设置为not_analyzed。所以上面的field指定的是name.raw。

    3. 取得某个索引/类型下某个字段中出现的不同值的个数

    这种操作类似于使用SQL的select count( * )  from  (select distinct * from table)语句。当需要获取某个字段上的出现的不同值的个数时,可以使用cardinality聚合查询完成:

    GET /index_streets/_search?search_type=count
    {
      "aggs": {
        "uniq_streets": {
          "cardinality": {
            "field": "name.raw"
          }
        }
      }
    }

    因为目标是得到name字段上的所有出现过的值,因此search_type被设置为了count,这样在返回的响应中不会出现冗长的hits部分。另外,查询的目标字段如果是字符串类型的,那么其索引类型需要设置为not_analyzed。所以上面的field指定的是name.raw。

    转自:https://blog.csdn.net/a422100210/article/details/60959450

  • 相关阅读:
    Cesium中的坐标系及转换
    Cesium Workshop
    window.postMessage 跨窗口,跨iframe javascript 通信
    VUE课程参考---7、跑马灯效果
    VUE课程---9、事件绑定v-on
    VUE课程---8、属性绑定v-bind
    VUE课程---7、解决插值表达式闪烁问题
    小谈chrome调试命令:console.log的使用
    Hadoop平台配置总结
    hadoop 关闭进程时报错no 进程 to stop
  • 原文地址:https://www.cnblogs.com/sunfie/p/9280676.html
Copyright © 2011-2022 走看看