elasticsearch+JestResult返回[match_phrase] query does not support zero_terms_query
{"error":{"root_cause":[{"type":"parsing_exception","reason":"[match_phrase] query does not support [zero_terms_query]","line":1,"col":122}],"type":"parsing_exception","reason":"[match_phrase] query does not support [zero_terms_query]","line":1,"col":122},"status":400}
private JestClient jestClient= EsFactory.getJestClient(props);
public void execute(){
String rangeDate=RangeStragy.getTimestamp( props.getInt(Consts.QUERYRANGETYPE,0)).apply(props);
JestResult result=null;
try {
//开始查询
result=jestClient.execute(getSearch(rangeDate));
//返回数据处理
dealResultData(result);
} catch (RuntimeException r){
logger.info(r.getMessage());
System.out.println(r.getMessage());
} catch (Exception e){
logger.info(e.getMessage());
System.out.println(e.getMessage());
}finally {
try {
if (jestClient != null) {
jestClient.close();
}
}catch (Exception e){
System.err.println(e.getMessage());
}
}
}
private RangeQueryBuilder getRangeQueryBuilder(String timestamps){
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(Feilds.RANGE);
rangeQueryBuilder.from(timestamps.split("-")[0]);
rangeQueryBuilder.to(timestamps.split("-")[1]);
return rangeQueryBuilder;
}
private BoolQueryBuilder getBoolQueryBuilder(String timestamps){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
getQueryCondition().forEach((key,value)->{
boolQueryBuilder.must(QueryBuilders.matchPhraseQuery(key, value).zeroTermsQuery(MatchQuery.ZeroTermsQuery.ALL));
});
boolQueryBuilder.must(getRangeQueryBuilder(timestamps));
return boolQueryBuilder;
}
private SearchSourceBuilder getSearchSourceBuilder(String timestamps){
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(getBoolQueryBuilder(timestamps));
builder.size(SIZE);
//设置返回数据字段
builder.fetchSource(props.getString(Consts.FEILDINCLUDE,null).split(","),null);
//
// builder.fetchSource(props.getString(Consts.FEILDINCLUDE,null).split(","),
// props.getString(Consts.FEILDEXCLUDE,null).split(","));
return builder;
}
private Search getSearch(String timestamps){
Search search =null;
//轮播
if (QueryEnum.parseQueryType(props.getInt(Consts.QUERYTYPE,0))){
search = new Search.Builder(getSearchSourceBuilder(timestamps).toString())
.addIndex(props.getString(Consts.TOPICNAME,null))
.addType(Feilds.TYPE)
.setParameter(Parameters.SCROLL,"3m")
.build();
}else {
search = new Search.Builder(getSearchSourceBuilder(timestamps).toString())
.addIndex(props.getString(Consts.TOPICNAME,null))
.addType(Feilds.TYPE)
.build();
}
return search;
}
/**
* 对结果数据做处理并写入文件
* @param result
*/
private void dealResultData(JestResult result){
Set<String> setNumber = Sets.newHashSet();
if(result.isSucceeded()){
String sourceString = result.getSourceAsString();
//sourceString = sourceString.replaceAll(",","\n");
sourceString = sourceString.concat("\n");
setNumber.add(sourceString);
RandomAccessFile raf;
try {
raf = new RandomAccessFile(props.getString(Consts.FILENAME,null), "rw");
for (String num : setNumber) {
raf.write(num.getBytes(StandardCharsets.UTF_8));
}
raf.close();
} catch (Exception e) {
logger.info(e.getMessage());
}
}else {
System.err.println(result.getJsonObject().toString());
}
}
/**
* 获取查询条件,组成map
* @return
*/
private Map<String,String> getQueryCondition(){
String[] conditons=props.getString(Consts.QUERYCONDITION,null).split("&&");
return Arrays.asList(conditons).stream().collect(Collectors.toMap(item->item.split(":")[0],item->item.split(":")[1]));
}