---
upgrade:
  - |
    The Opensearch custom query syntax changes: the old filter placeholders for ``custom_query`` are no longer supported.
    Replace your custom filter expressions with the new ``${filters}`` placeholder:

    **Old:**
    ```python
      retriever = BM25Retriever(
        custom_query="""
          {
              "query": {
                  "bool": {
                      "should": [{"multi_match": {
                          "query": ${query},
                          "type": "most_fields",
                          "fields": ["content", "title"]}}
                      ],
                      "filter": [
                          {"terms": {"year": ${years}}},
                          {"terms": {"quarter": ${quarters}}},
                          {"range": {"date": {"gte": ${date}}}}
                      ]
                  }
              }
          }
        """
      )

      retriever.retrieve(
          query="What is the meaning of life?",
          filters={"years": [2019, 2020], "quarters": [1, 2, 3], "date": "2019-03-01"}
      )
    ```

    **New:**
    ```python
      retriever = BM25Retriever(
        custom_query="""
          {
              "query": {
                  "bool": {
                      "should": [{"multi_match": {
                          "query": ${query},
                          "type": "most_fields",
                          "fields": ["content", "title"]}}
                      ],
                      "filter": ${filters}
                  }
              }
          }
        """
      )

      retriever.retrieve(
          query="What is the meaning of life?",
          filters={"year": [2019, 2020], "quarter": [1, 2, 3], "date": {"$gte": "2019-03-01"}}
      )
    ```
features:
  - |
    When using ``custom_query`` in ``BM25Retriever`` along with ``OpenSearch``
    or ``Elasticsearch``, we added support for dynamic ``filters``, like in regular queries.
    With this change, you can pass filters at query-time without having to modify the ``custom_query``:
    Instead of defining filter expressions and field placeholders, all you have to do
    is setting the ``${filters}`` placeholder analogous to the ``${query}`` placeholder into
    your ``custom_query``.
    **For example:**
    ```python
      {
          "query": {
              "bool": {
                  "should": [{"multi_match": {
                      "query": ${query},                 // mandatory query placeholder
                      "type": "most_fields",
                      "fields": ["content", "title"]}}
                  ],
                  "filter": ${filters}                 // optional filters placeholder
              }
          }
      }
    ```
