Сочетание оценки сценария и фильтра оценки функции в Java API - PullRequest
0 голосов
/ 26 февраля 2019

Я не могу найти вариант, как объединить фильтры сценариев и оценки функций в эластичном API Java.

У меня есть следующий запрос:

GET index/type/_search
{
  "query": {
    "nested": {
      "path": "field",
      "query": {
        "function_score": {
          "query": {
            "bool": {
              "must": [
                {
                  "match": {
                    "field.name": "NAME"
                  }
                }
              ]
            }
          },
          "functions": [
            {
              "filter": {
                "match": {
                  "field.type":"TYPE"
                }
              },
              "weight": 3
            },
            {
              "script_score": {
                 "script":"doc['field.count'].value"
              }
            }
          ]
        }
      }
    }
  }
}

И попытался написать ElasticSearchQuery

ElasticSearchQuery query = new ElasticSearchQuery(Indexes.NAME, Types.TYPE)
            .setQueryBuilder(QueryBuilders.nestedQuery(FIELD, QueryBuilders.functionScoreQuery(
                    QueryBuilders.boolQuery().must(QueryBuilders.matchQuery(FIELD_NAME, fieldName)),
                    new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                            new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                                    QueryBuilders.matchQuery(FIELD_TYPE, fieldType),
                                    ScoreFunctionBuilders.weightFactorFunction(3.0F)
                            )
                    }), ScoreMode.None));

Но как добавить оценку сценария?

1 Ответ

0 голосов
/ 27 февраля 2019

решение довольно простое:

FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                        QueryBuilders.matchQuery(FIELD_TYPE, fieldType),
                        ScoreFunctionBuilders.weightFactorFunction(3)
                ),
                new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                        ScoreFunctionBuilders.scriptFunction(format("doc['%s'].value", FIELD_COUNT))
                )
        };
...