环境: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();