Представьте себе следующие документы:
[
{ "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.
Кто-нибудь имеет некоторый опыт в этом и может рассказать мне, как это сделать?