Построение запросов Elastic Search динамически с использованием Java API - PullRequest
0 голосов
/ 02 апреля 2019

Представьте себе следующие документы:

[
  { "name" : "deepgreen", "colors" : [
    { "color" : "green" },
    { "color" : "black" }
    ]
  },
  { "name" : "lightblue", "colors" : [
    { "color" : "blue" },
    { "color" : "white" }
    ]
  },
  { "name" : "purple", "colors": [
    { "color" : "red" },
    { "color" : "blue" },
    { "color" : "white" }
    ]
  }
]

Если поле colors имеет тип nested object, это сопоставление является правильным. Например, запрос, который я бы выполнил, чтобы получить фиолетовый цвет:

GET /colors/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "colors",
            "query": {
              "match_phrase": {
                "colors.color": "blue"
              }
            }
          }
        },
        {
          "nested": {
            "path": "colors",
            "query": {
              "match_phrase": {
                "colors.color": "blue"
              }
            }
          }
        },
        {
          "nested": {
            "path": "colors",
            "query": {
              "match_phrase": {
                "colors.color": "blue"
              }
            }
          }
        },
        {
          "match_phrase": {
            "name": "purple"
          }
        }
      ]
    }
  }
}

Как я могу динамически сгенерировать этот запрос, используя ES Java API? То, что я пытаюсь сделать, можно понять, посмотрев на этот псевдокод:

List<QueryBuilders> nestedQueryBuilders = new ArrayList<>();

colors.forEach(color -> {
    nestedQueryBuilders.add(new nestedQuery("colors",
            matchPhraseQuery("colors.color", color)),
            ScoreMode.Avg);
});

BoolQueryBuilder boolQuery = boolQuery()
    .must(matchPhraseQuery("name", "purple"))
    .must(nestedQueryBuilders);

SearchRequest request = new SearchRequest()
    .indices("colors")
    .source(new SearchSourceBuilder()
        .query(boolQuery));

client.search(request, RequestOptions.DEFAULT);

Я еще не сталкивался с методом для динамического добавления "sub" -запросов в запрос must-bool.

Кто-нибудь имеет некоторый опыт в этом и может рассказать мне, как это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...