Повышение кортежа в Elasticsearch - PullRequest
0 голосов
/ 30 мая 2018

У меня есть данные об одежде в документе 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}

1 Ответ

0 голосов
/ 30 мая 2018

Да, вы можете использовать bool/should запросов, чтобы придать разный импульс различным парам материала / цвета.

{
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        {
          "bool": {
            "boost": 4,
            "must": [
              {
                "match": {
                  "color": {
                    "value": "C1"
                  }
                }
              },
              {
                "match": {
                  "material": {
                    "value": "M1"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "boost": 2,
            "must": [
              {
                "match": {
                  "color": {
                    "value": "C1"
                  }
                }
              },
              {
                "match": {
                  "material": {
                    "value": "M2"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "boost": 1,
            "must": [
              {
                "match": {
                  "color": {
                    "value": "C2"
                  }
                }
              },
              {
                "match": {
                  "material": {
                    "value": "M3"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}
...