ElasticSearch Java API嵌套查询,具有inner_hits错误

时间:2019-05-21 15:40:35

标签: java rest elasticsearch

我对ElasticSearch Java API有问题。我使用的是5.1.2。版本。

我现在将在下面描述粘贴的代码。我需要通过仅将inner_hits限制为对象id来优化搜索机制。我将InnerHitBuilder与.setFetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE)和.addDocValueField(“ item.id”)一起使用。生成的查询有错误-“ inner_hits”节点内有“ ignore_unmapped”属性。

..."inner_hits": {
    "name": "itemTerms",
    "ignore_unmapped": false,
    "from": 0,
    "size": 2147483647,
    "version": false,
    "explain": false,
    "track_scores": false,
    "_source": false,
    "docvalue_fields": ["item.id"]
}...

执行此类查询结果时出错:

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "[inner_hits] unknown field [ignore_unmapped], parser not found"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "[inner_hits] unknown field [ignore_unmapped], parser not found"
  },
  "status": 400
} 

当我手动从查询中删除该属性时,一切运行顺利。

protected BoolQueryBuilder itemTermQuery(FileTerms terms, boolean withInners) {

    BoolQueryBuilder termsQuery = QueryBuilders.boolQuery();
    for (String term : FileTerms.terms()) {

        if (terms.term(term).isEmpty())
            continue;

        Set<String> fns = terms.term(term).stream().
                map(x -> x.getTerm())
                .filter(y -> !y.isEmpty())
                .collect(Collectors.toSet());
        if (!fns.isEmpty())
            termsQuery = termsQuery.must(
                    QueryBuilders.termsQuery("item.terms." + term + ".term", fns));
    }

    QueryBuilder query = terms.notEmpty() ? termsQuery : QueryBuilders.matchAllQuery();

    TermsQueryBuilder discontinuedQuery = QueryBuilders.termsQuery("item.terms." + FileTerms.Terms.USAGE_IS + ".term",
            new FileTerm("Discontinued", "", "", "", "").getTerm());
    FunctionScoreQueryBuilder.FilterFunctionBuilder[] functionBuilders = {
            new FunctionScoreQueryBuilder.FilterFunctionBuilder(query, ScoreFunctionBuilders.weightFactorFunction(1)),
            new FunctionScoreQueryBuilder.FilterFunctionBuilder(discontinuedQuery, ScoreFunctionBuilders.weightFactorFunction(-1000))
    };
    FunctionScoreQueryBuilder functionScoreQuery = functionScoreQuery(functionBuilders);
    NestedQueryBuilder nested = QueryBuilders.nestedQuery("item", functionScoreQuery.query(), ScoreMode.None);

    if (withInners) nested = nested.innerHit(new InnerHitBuilder()
            .setFetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE)
            .addDocValueField("item.id")
            .setSize(Integer.MAX_VALUE)
            .setName("itemTerms"));

    return QueryBuilders.boolQuery().must(nested);
}

如何在“ inner_hits”节点内不具有不必要属性的情况下构建查询?

编辑: 我使用5.1.2库和5.1.2弹性服务器。

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>5.1.2</version>
</dependency>

  "version": {
    "number": "5.1.2",
    "build_hash": "c8c4c16",
    "build_date": "2017-01-11T20:18:39.146Z",
    "build_snapshot": false,
    "lucene_version": "6.3.0"
  },

0 个答案:

没有答案