使用 XContentParser 解析“has_parent”查询时的 Elasticsearch 异常,未知字段 [has_parent]

问题描述

ES 7.7.0,得到以下异常,虽然"has_parent"查询有效并且在ES索引中有效,尝试使用ES解析器API解析时出现异常

输出

ssb = {"query":{"term":{"_tenant_id":{"value":"working","boost":1.0}}}}
Exception in thread "main" org.elasticsearch.common.xcontent.XContentParseException: [1:41] [bool] Failed to parse field [must]
    at org.elasticsearch.common.xcontent.ObjectParser.parseValue(ObjectParser.java:510)
    at org.elasticsearch.common.xcontent.ObjectParser.parseArray(ObjectParser.java:502)
    at org.elasticsearch.common.xcontent.ObjectParser.parseSub(ObjectParser.java:534)
    at org.elasticsearch.common.xcontent.ObjectParser.parse(ObjectParser.java:319)
    at org.elasticsearch.common.xcontent.ObjectParser.parse(ObjectParser.java:251)
    at org.elasticsearch.index.query.BoolQueryBuilder.fromXContent(BoolQueryBuilder.java:297)
    at org.elasticsearch.search.SearchModule.lambda$registerQuery$14(SearchModule.java:871)
    at org.elasticsearch.common.xcontent.NamedxcontentRegistry.parseNamedobject(NamedxcontentRegistry.java:140)
    at org.elasticsearch.common.xcontent.support.AbstractXContentParser.namedobject(AbstractXContentParser.java:385)
    at org.elasticsearch.index.query.AbstractQueryBuilder.parseInnerQueryBuilder(AbstractQueryBuilder.java:317)
    at org.elasticsearch.search.builder.SearchSourceBuilder.parseXContent(SearchSourceBuilder.java:1098)
    at org.elasticsearch.search.builder.SearchSourceBuilder.parseXContent(SearchSourceBuilder.java:1036)
    at QMain.main(QMain.java:34)
Caused by: ParsingException[unkNown query [has_parent]]; nested: NamedobjectNotFoundException[[1:41] unkNown field [has_parent]];
    at org.elasticsearch.index.query.AbstractQueryBuilder.parseInnerQueryBuilder(AbstractQueryBuilder.java:321)
    at org.elasticsearch.index.query.BoolQueryBuilder.lambda$static$1(BoolQueryBuilder.java:281)
    at org.elasticsearch.common.xcontent.AbstractObjectParser.lambda$declareObjectArray$10(AbstractObjectParser.java:237)
    at org.elasticsearch.common.xcontent.AbstractObjectParser.lambda$declareFieldArray$16(AbstractObjectParser.java:265)
    at org.elasticsearch.common.xcontent.AbstractObjectParser.parseArray(AbstractObjectParser.java:357)
    at org.elasticsearch.common.xcontent.AbstractObjectParser.lambda$declareFieldArray$17(AbstractObjectParser.java:265)
    at org.elasticsearch.common.xcontent.ObjectParser.lambda$declareField$9(ObjectParser.java:381)
    at org.elasticsearch.common.xcontent.ObjectParser.parseValue(ObjectParser.java:508)
    ... 12 more
Caused by: org.elasticsearch.common.xcontent.NamedobjectNotFoundException: [1:41] unkNown field [has_parent]
    at org.elasticsearch.common.xcontent.NamedxcontentRegistry.parseNamedobject(NamedxcontentRegistry.java:132)
    at org.elasticsearch.common.xcontent.support.AbstractXContentParser.namedobject(AbstractXContentParser.java:385)
    at org.elasticsearch.index.query.AbstractQueryBuilder.parseInnerQueryBuilder(AbstractQueryBuilder.java:317)
    ... 19 more

重现问题的Java代码

        SearchSourceBuilder ssb = new SearchSourceBuilder();
        String query = null;
        String working = "{\"query\":{\"term\":{\"_tenant_id\":\"working\"}}}";
        String notWorking = "{\"query\":{\"bool\":{\"must\":[{\"has_parent\":{\"query\":{\"match_all\":{}},\"parent_type\":\"event_parent\"}}]}}}";

//query = working;
// Not working
        query = notWorking;
        SearchModule searchModule1 = new SearchModule(Settings.EMPTY,false,Collections.emptyList());
        XContentParser parser1 = XContentFactory.xContent(XContentType.JSON).createParser(
                new NamedxcontentRegistry(searchModule1.getNamedxcontents()),DeprecationHandler.THROW_UNSUPPORTED_OPERATION,query);
        ssb.parseXContent(parser1);
        System.out.println("ssb = " + ssb.toString());

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)