У меня есть данные об одежде в документе Elasticsearch, как показано ниже.Он содержит название продукта, цвет и информацию о материале
/products/data
{
product_name: "xxxxxx",
color: "C1",
material: "M1"
},
{
product_name: "yyyyyy",
color: "C2",
material: "M2"
},
{
product_name: "zzzzzz",
color: "C1",
material: "M2"
}...
Теперь я хочу получить 10
продукты с color: C1
и material: M2
.Если в этой комбинации недостаточно продуктов, я хочу получить продукты с color: C1
и material: M1
.У меня будет комбинация color
и material
.В этом примере у меня самый высокий приоритет для комбинации C1, M2
, второй самый высокий - C1, M1
, тогда это может быть C2, M3
и так далее.Исходя из приоритета, я хочу повысить результат (в одном запросе).Возможно ли это в Elasticsearch?
Я ожидаю, что возвращенный документ будет выглядеть так:
{
_score: highest_score,
product_name: "xxxxxx",
color: "C1",
material: "M2"
},
{
_score: sencond_highest
product_name: "yyyyyy",
color: "C1",
material: "M1"
},
{
_score: third_highest
product_name: "zzzzzz",
color: "C2",
material: "M3"
}
Образец набора данных для воспроизведения проблемы
POST mat/product
{
"pname": "prod1",
"color": "c1",
"material": "m1"
}
POST mat/product
{
"pname": "prod2",
"color": "c2",
"material": "m2"
}
POST mat/product
{
"pname": "prod3",
"color": "c3",
"material": "m3"
}
POST mat/product
{
"pname": "prod4",
"color": "c1",
"material": "m2"
}
POST mat/product
{
"pname": "prod5",
"color": "c2",
"material": "m2"
}
POST mat/product
{
"pname": "prod6",
"color": "c3",
"material": "m3"
}
GET mat/product/_search
{
"query":{
"bool":{
"minimum_should_match":1,
"should":[
{"bool":{
"boost":181,
"must":[{"match":{"color":"c3"}},{"match":{"material":"m3"}}]
}},
{"bool":{
"boost":180,
"must":[{"match":{"color":"c2"}},{"match":{"material":"m2"}}]
}},
{"bool":{
"boost":179,
"must":[{"match":{"color":"c1"}},{"match":{"material":"m2"}}]
}}
]}},"size":10}