Search code examples
pythonelasticsearchelasticsearch-api

Elasticsearch query different fields with different weight


Say I have 3 different fields, A of text type, B of int type, C of date type. I other query conditions for all 3 fields. In addition to this, I want to give more weightage to field C then B then A. ie A is looking for text having word 'xyz' and it haves less priority,say weight of 1 B is looking for values greater than 100 and it have some priority, say weight of 5 and C should have a date greater than June 2022 and it has a higher priority of weight 10.

How do I write an es query to perform this


Solution

  • Here is your query. Please test against your data and check if this query completing your requirement.

    GET index-name/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "function_score": {
                "functions": [
                  {
                    "filter": {
                      "multi_match": {
                        "query": "search-text",
                        "fields": [
                          "field-A"
                        ]
                      }
                    },
                    "weight": 1
                  },
                  {
                    "filter": {
                      "range": {
                        "field-B": {
                          "gt": 100
                        }
                      }
                    },
                    "weight": 5
                  },
                  {
                    
                    "filter": {
                      "range": {
                        "field-C": {
                          "gte": "2022-06-01"
                        }
                      }
                    },
                    "weight": 10
                  }
                ],
                "score_mode": "max",
                "boost_mode": "replace"
              }
            }
          ]
        }
      },
      "_source": ["field-A", "field-B", "field-C"]     ----> if you want verify with limited fields
    }