Jak zlepšit výsledky na základě hodnoty pole

0

Otázka

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í:

  1. 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.
  2. 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"
    }
  }
}
1

Nejlepší odpověď

0

Za to, co chcete, myslím, že můžeš vypočítat totalCount pole v runtime, která vrací součet se počítá. Pak můžete jednoduše třídit pomocí isPromoted pole jako první, pak totalCount pole:

Mapování:

{
    "mappings": {
        "properties": {
            "name": {
                "type": "text"
            },
            "clickCount": {
                "type": "integer"
            },
            "bookingCount": {
                "type": "integer"
            },
            "isPromoted": {
                "type": "integer"
            }
        }
    }
}

A dotaz:

{
  "runtime_mappings": {
    "totalCount": {
      "type": "long",
      "script": "emit(doc['clickCount'].value + doc['bookingCount'].value);"
    }
  },
  "query": {
        "match_all": {}
  },
    "sort": [
        {"isPromoted": "desc"},
        {"totalCount": "desc"}
    ]
}
2021-10-29 09:26:09

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................