@Override public Filter parse(QueryParseContext parseContext) throws IOException, QueryParsingException { XContentParser parser = parseContext.parser(); Filter filter = null; boolean cache = true; String currentFieldName = null; XContentParser.Token token; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); } else if (token == XContentParser.Token.START_OBJECT) { if ("filter".equals(currentFieldName)) { filter = parseContext.parseInnerFilter(); } } else if (token.isValue()) { if ("cache".equals(currentFieldName)) { cache = parser.booleanValue(); } } } if (filter == null) { throw new QueryParsingException(index, "filter is required when using `not` filter"); } if (cache) { filter = parseContext.cacheFilterIfPossible(filter); } // no need to cache this one return new NotFilter(filter); }