Jsem strčil do vytváření dotazu na tento problém. dotaz bude vyhledávání podle klíčových slov spolu s bodování produktů. Mám seznam výrobků
[
{
name: 'pro',
clickCount: 110,
bookingCount: 57,
isPromoted: 0,
},
{
name: 'prod',
clickCount: 13,
bookingCount: 77,
isPromoted: 0,
},
{
name: 'produ',
clickCount: 43,
bookingCount: 10,
isPromoted: 0,
},
{
name: 'produc',
clickCount: 5,
bookingCount: 17,
isPromoted: 0,
},
{
name: 'product',
clickCount: 89,
bookingCount: 67,
isPromoted: 0,
},
{
name: 'products',
clickCount: 1,
bookingCount: 2,
isPromoted: 1,
},
{
name: 'products2',
clickCount: 3,
bookingCount: 4,
isPromoted: 1,
},
]
Já třeba tyhle se do níže uvedené pořadí:
- Produkty s isPromoted=1 bude na vrcholu (pokud existuje více výrobků se stejnými hodnotami, pak ten s MAX(clickCount+bookingCount), bude mít přednost.
- Výrobky s MAX(clickCount+bookingCount), přijde po tom.
Poslední objednávce pro klíčové slovo vyhledávání pro by měl být tento:
[
{
name: 'products2',
clickCount: 3,
bookingCount: 4,
isPromoted: 1,
},
{
name: 'products',
clickCount: 1,
bookingCount: 2,
isPromoted: 1,
},
{
name: 'pro',
clickCount: 110,
bookingCount: 57,
isPromoted: 0,
},
{
name: 'product',
clickCount: 89,
bookingCount: 67,
isPromoted: 0,
},
{
name: 'prod',
clickCount: 13,
bookingCount: 77,
isPromoted: 0,
},
{
name: 'produ',
clickCount: 43,
bookingCount: 10,
isPromoted: 0,
},
{
name: 'produc',
clickCount: 5,
bookingCount: 17,
isPromoted: 0,
},
]
Píši tento dotaz, ale není to dává požadovaný výsledek.
GET /products/_search
{
"query": {
"function_score": {
"query": {
"wildcard": {
"name": "*pro*"
}
},
"functions": [
{
"field_value_factor": {
"field": "clickCount",
"factor": 1.2,
"modifier": "sqrt"
}
},
{
"field_value_factor": {
"field": "clickCount",
"factor": 1,
"modifier": "sqrt"
}
},
{
"field_value_factor": {
"field": "isPromoted",
"factor": 1.5,
"modifier": "sqrt"
},
"weight": 20
}
],
"boost_mode": "sum"
}
}
}