java 操作ElasticSearch进行搜索 遇到的问题记录

由于公司需求,要我通过es去帅选数据,公司也没人会,只好自己慢慢摸索,期间碰到不少坑,现在记录下来:

1:分组查询(比如按字段:orderId)时报:

java.lang.IllegalArgumentException: Fielddata is disabled on text fields by default. Set fielddata=true on [orderid] in order to load fielddata in memory by uninverting the inverted index.

这是因为5.x+版本默认关闭了文本字段,防止占用过多空间,需开启fielddata:

{
  "properties": {
    "interests": { 
      "type":     "text",
      "fielddata": true    //不建议
    }
  }

}

现在我们是用的Java操作,只需在你需要分组的字段后面加上 .keyword 就可以了。如

.addAggregation(AggregationBuilders.terms("orderId_Term").field("orderid.keyword")

2:es默认只显示10条记录的问题

我们查找出的数据默认只显示10条,要想显示所有的呢?1·可以设置size,不灵活。2·通过scroll,即游标。代码如下:

SearchResponse response = client.prepareSearch("responseqrcodes")
      .setScroll(new TimeValue(60000)).get();

也就是说在在1min内保持scroll打开状态,setScroll("1m")参数也可这样写,即1分钟。最后获取的时候就可以:

do {
    for (SearchHit hit : scrollResp.getHits().getHits()) {
        //Handle the hit...
    }
  response = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet();

} while(scrollResp.getHits().getHits().length != 0);  //所有数据读取完毕则退出循环。

---------------------------------------------------------------------------------------------------------------------------

下面贴一段完整代码:

private static void executeSearch(TransportClient client) {

        SearchResponse response = client.prepareSearch("index")
                .setScroll(new TimeValue(60000))
                .setTypes("type")
                .setQuery(QueryBuilders.matchAllQuery())
                .setPostFilter(QueryBuilders.rangeQuery("money").gt(1).lt(100)) //金额大于1小于100
//                .setQuery(QueryBuilders.matchQuery("id", "1"))  //id等于1
                .addAggregation(AggregationBuilders.terms("c_term").field("country.keyword") //按国家分组
//                        .order(Terms.Order.aggregation("moneySum", false))  //按总金额降序排序 true:升序
                        .subAggregation(AggregationBuilders.sum("moneySum").field("money")) //对应的总金额
                        .subAggregation(AggregationBuilders.avg("moneyAvg").field("money")) //平均金额
                )
//                .setFrom(0).setSize(20)  //分页,20                .addSort("id", SortOrder.ASC) //id升序排序
                .get();

        Terms terms = response.getAggregations().get("c_term");
        List<Terms.Bucket> buckets = terms.getBuckets();
        for (Terms.Bucket bucket : buckets) {
            Sum salarySum = bucket.getAggregations().get("moneySum");
            Avg moneyAvg = bucket.getAggregations().get("moneyAvg");
            System.out.println(bucket.getKey() + "----" + salarySum.getValue() + "=======" + moneyAvg.getValue());
            System.out.println(bucket.getKey() + "--->" + bucket.getDocCount());
        }
        SearchHits hits = response.getHits();
        long totalHits = hits.getTotalHits();
        System.out.println("总数:" + totalHits);
        SearchHit[] searchHits = hits.hits();
        do {
            for (SearchHit searchHit : searchHits) {
                System.out.println(searchHit.getSourceAsString());
            }
            response = client.prepareSearchScroll(response.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet();
        } while (response.getHits().getHits().length != 0); //零点击标记滚动结束和while循环。

    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值