@Override
  public Filter parse(JsonQueryParseContext parseContext)
      throws IOException, QueryParsingException {
    JsonParser jp = parseContext.jp();

    JsonToken token = jp.nextToken();
    assert token == JsonToken.FIELD_NAME;
    String fieldName = jp.getCurrentName();

    jp.nextToken();
    String value = jp.getText();
    // move to the next token (from VALUE)
    jp.nextToken();

    if (value == null) {
      throw new QueryParsingException(index, "No value specified for term filter");
    }

    Filter filter = null;
    MapperService.SmartNameFieldMappers smartNameFieldMappers =
        parseContext.smartFieldMappers(fieldName);
    if (smartNameFieldMappers != null) {
      if (smartNameFieldMappers.hasMapper()) {
        filter = smartNameFieldMappers.mapper().fieldFilter(value);
      }
    }
    if (filter == null) {
      filter = new TermFilter(new Term(fieldName, value));
    }
    filter = parseContext.cacheFilterIfPossible(filter);
    return wrapSmartNameFilter(filter, smartNameFieldMappers, parseContext.indexCache());
  }