Добавление конкретного score если есть поле с конкретным значением

Добрый день

есть документ с nested полем

{
  "_id": 111
  "price": 1000
  "properties": [
    { "property_id": 22, "property_value": "газ"}
    { "property_id": 23, "property_value": "зеленый"}
  ]
}

У меня есть запрос который выдает мне ожидаемый score за price (от 1 до 100).
Мне нужно добавить, +30 score если nested документ имеет param_id == 23 AND param_value == "красный". НО при этом, если в документе нет этого nested документа, то все равно возвращать документ, просто без этих +30 score

Пытался делать:

{
  "query": {
    "nested": {
      "path": "properties",
      "query": {
          "function_score": {
            "query": {
              "bool": {           // ищу конкретный nested документ 
                "filter": [
                  { "term": { "properties.property_id": 13 } },
                  { "term": { "properties.property_value": "газированная" } }
                ]
              }
        },
        "script_score": {
          "script": {
            "source": "30"    // за каждый найденный возвращаю 30 score
          }
        }
      }
    }
}
  }
  },
  "sort": {
"_score": {
  "order": "desc"
}
  }
}
Результат: search_phase_execution_exception

Пытался:

{
  "query": {
    "bool": {
      "must": [
        [
          {
            "nested": {
              "path": "properties",
              "query": [
                {
                  "function_score": {
                    "functions": [
                      {
                       "weight": 30   // +30 score за найденный документ
                        "filter": [    // ищу конкретный nested документ
                            {
                              "term": {
                                "properties.property_id": 13
                              }
                            },
                            {
                              "term": {
                                "properties.property_value": "газированная"
                              }
                            }
                        ]
                      }
                    ]
                  }
                }
              ]
            }
          }
        ]
      ]
    }
  },
  "sort": {
    "_score": {
      "order": "desc"
    }
  }
}
Результат: [_na] query malformed, must start with start_object

Пытался:

{
  "query": {
    "bool": {
      "must": [
        [
          {
            "nested": {
              "path": "properties",
              "query": [
                {
                  "constant_score": {
                    "filter": [  // ищем конкретный документ
                      {
                        "term": {
                          "properties.property_id": 117
                        }
                      },
                      {
                        "term": {
                          "properties.property_value": "вода"
                        }
                      }
                    ],
                    "boost": 3  // даем +30 score за найденный результат
                  }
                }
              ]
            }
          }
        ]
      ]
    }
  },
  "sort": {
    "_score": {
      "order": "desc"
    }
  }
}
Результат: возвращает документы где property_id == 117 AND property_value == "вода", но добавляет только 1 score в не зависимости от boost

Заранее благодарен

PUT test
{
  "mappings": {
    "doc": {
      "properties": {
        "properties": {
          "type": "nested",
          "properties": {
            "property_id": {
              "type": "integer"
            },
            "property_value": {
              "type": "keyword"
            }
          }
          
        },
        "price": {
          "type": "integer"
        }
      }
    }
  }  
}

PUT test/doc/111
{
  "price": 1000,
  "properties": [
    { "property_id": 22, "property_value": "газ"},
    { "property_id": 23, "property_value": "зеленый"}
  ]
}

PUT test/doc/112
{
  "price": 1000,
  "properties": [
    { "property_id": 12, "property_value": "вода"},
    { "property_id": 13, "property_value": "газированная"}
  ]
}

GET test/doc/_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "script_score": {
            "script": {
              "source": "30"
            }
          },
          "filter": {
            "nested": {
              "path": "properties",
              "query": {
                "bool": {
                  "filter": [
                    {
                      "term": {
                        "properties.property_id": 13
                      }
                    },
                    {
                      "term": {
                        "properties.property_value": "газированная"
                      }
                    }
                  ]
                }
              }
            }
          }
        },
        {
          "weight": 0
        }
      ],
      "boost_mode": "sum",
      "score_mode": "first"
    }
  },
  "sort": {
    "_score": {
      "order": "desc"
    }
  }
}
1 Like

Вы спасли меня 0_0
Спасибо! )

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.