elasticsearch查询

环境:es1.3 、eclipse 、jdk1.8
问题:刚开始用游标查询,再用游标获取数据,查询耗时较慢。
解决办法:不使用游标查询,直接根据条件查询
es查询参考网址:https://www.cnblogs.com/chenyuanbo/p/10296840.html
版本升级问题
https://segmentfault.com/a/1190000015863043?utm_source=tag-newest
游标使用场景:游标更适合搜索结果数据量大的情况
查询指定字段:setFetchSource
不适用游标代码如下

private List<Entry> getEntryListByCpwsId(String s) {
		//term 不支持分词查询
				SearchResponse response = ESUtils.getClient()
						.prepareSearch("c***dsr")
//						.setFetchSource(new String[]{"pname","money"},null)//查询指定字段
						.setQuery(QueryBuilders.boolQuery()
						.must(QueryBuilders.termQuery("c***Id", s))
		//.must(QueryBuilders.queryString("\"" + caseNo+ "\"").field("caseNo"))
		.mustNot(QueryBuilders.termQuery("s**s", 102)))
						.get();
		SearchHits hits = response.getHits();
		List<Entry> entryList = new ArrayList<Entry>();
		if (hits.getTotalHits() < 1) {
			return null;
		}
		for (SearchHit hit : response.getHits()) {
			String json = hit.getSourceAsString();
			String _id = hit.getId();
			String hitType = hit.getType();
			Entry entry = EntryManager.getEntry(hitType, json, _id, false);
			if (entry == null)
				continue;
			entry.setEntryId(_id);
			entryList.add(entry);
		}
		return entryList;
	}

使用游标如下:

private String getScrollId(String weidu) {
		SearchResponse response = ESUtils.getClient().prepareSearch(weidu)// 索引名称
				.setQuery(QueryBuilders.boolQuery()
//						.must(QueryBuilders.queryString("\"" + nameMd5+ "\"").field("midcardNo"))
						.must(QueryBuilders.termQuery("regexFlag", 0))
//						.must(QueryBuilders.termQuery("_id", "c2016411329minchu2497_t20161228"))
						)
				.setSize(2000).setScroll(new TimeValue(600000)).setSearchType(SearchType.SCAN).execute().actionGet();
		String scrollid = response.getScrollId();
		System.out.println("条数:"+response.getHits().getTotalHits());
		return scrollid;
	}


public static Map<String,Object> scanEntryListMap(String scrollId, String highlightedFields) 
	{	
		Map<String,Object> resultMap = new LinkedHashMap<String,Object>();
		Client client = ESUtils.getClient();
		
	    //使用上次的scrollId继续访问
		SearchResponse searchResponse = null;
		while(true)
        {
        	try
        	{
        		 
        		searchResponse = client.prepareSearchScroll(scrollId).setScroll(new TimeValue(600000)).execute().actionGet();
        		 
        		break;
        	}catch (NoNodeAvailableException cont)
        	{
        		try {
					Thread.sleep(5000);
				} catch (Exception ex) {
				}
				continue;
        	}
        }
		if(searchResponse == null)
			return null;
	    //System.out.println("searchResponse=" + searchResponse.getScrollId());
	    List<String> entryList = new ArrayList<String>();
	    for (SearchHit hit : searchResponse.getHits()) {
        	String json = hit.getSourceAsString();
        	 
        	entryList.add(json);
        }
	    
        resultMap.put("scrollId", searchResponse.getScrollId());
        resultMap.put("count", searchResponse.getHits().getHits().length);
        resultMap.put("entryList", entryList);
        return resultMap;
	}   

查询字段missing

		SearchRequestBuilder searchRequestBuilder = ESUtils.getClient().prepareSearch(weidu);
		searchRequestBuilder.setTypes(weidu);
		searchRequestBuilder.setSearchType(SearchType.SCAN);
		searchRequestBuilder.setScroll(TimeValue.timeValueMinutes(8));
		searchRequestBuilder.setSize(400);
		// 条件
		BoolFilterBuilder boolFilterBuilder = FilterBuilders.boolFilter();
		boolFilterBuilder.must(FilterBuilders.existsFilter("entNameOld"));

		searchRequestBuilder.setPostFilter(boolFilterBuilder);

		SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
		String scrollid = searchResponse.getScrollId();
		//根据游标再查

根据id查询

GetResponse actionGet = ESUtils.getClient().prepareGet(index, tpye, id)
				.setFetchSource(new String[] { "field1", "field2" }, null)//指定字段,不指定字段可不加
				.execute().actionGet();
String sourceAsString = actionGet.getSourceAsString();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值