Update getmeili/meilisearch Docker tag to v1.41.0 #208

Open
renovate wants to merge 1 commit from renovate/getmeili-meilisearch-1.x into main
Collaborator

This PR contains the following updates:

Package Update Change
getmeili/meilisearch minor v1.29.0v1.41.0

⚠️ Warning

Some dependencies could not be looked up. Check the Dependency Dashboard for more information.


Release Notes

meilisearch/meilisearch (getmeili/meilisearch)

v1.41.0: 🏈

Compare Source

Enhancement
  • Support dynamic search rules with pinning by @​YoEight in #​6182
    Introduce the Dynamic Search Rules (DSR) experimental feature, making it easy to promote the right content for the right searches with flexible, condition-based pinning. In this first version, rules can be triggered by query-based conditions such as empty queries or literal substring matches, as well as time windows. Multiple documents can be pinned in a defined order, and pins still work with filtering, pagination, facet distribution, hybrid search, and federated search.

    Rules can be created or updated with PATCH /dynamic-search-rules/{uid} and removed with DELETE /dynamic-search-rules/{uid}. In this first version, a rule can define query- or time-based conditions and pin specific documents at fixed positions in the results list.

    Example of rule creation/update
      // PATCH /dynamic-search-rules/featured-wireless-headphones
      {
        "description": "Promote featured products for wireless headphone searches",
        "active": true,
        "conditions": [
          { "scope": "query", "contains": "headphone" }
        ],
        "actions": [
          {
            "selector": { "indexUid": "products", "id": "featured-headphones-001" },
            "action": { "type": "pin", "position": 0 }
          },
          {
            "selector": { "indexUid": "products", "id": "featured-headphones-002" },
            "action": { "type": "pin", "position": 1 }
          }
        ]
      }
    
    
  • Default to useNetwork: true in sharded instances by @​dureuill in #​6278

    This release contains breaking changes for users of the network experimental feature.

    Search requests now use the network by default when (replicated) sharding is enabled
    § Breaking changes

    When network.leader is set in the instance, useNetwork now defaults to true in search requests when omitted.

    So, when a network is configured, the following:

    Search request without an explicit useNetwork
    // POST /indexes/movies/search
    {
      "q": "Batman dark knight returns 1",
      "filter": "genres IN [Action, Adventure]",
      "facets": ["genres"],
      "limit": 5
      // No `useNetwork` is passed
    }
    

    is now equivalent to a federated search over multiples remotes so that all shards in the network are covered exactly once.

    Equivalent federated search request
    // POST /multi-search
    {
        "federation": {
            "limit": 5,
            "facetsByIndex": {
                "movies": [
                    "genres"
                ]
            },
            "merge": {}
        },
        // assuming 3 remotes 0, 1, 2 and 3 shards a, b, c such that
        // 0 owns a, b
        // 1 owns b, c
        // 2 owns c, a
        "queries": [
            {
                "indexUid": "movies",
                "federationOptions": {
                    "remote": "0"
                },
                "q": "Batman dark knight returns 1",
                "filter": ["genres IN [Action, Adventure]", "_shard = a"]
            },
            {
                "indexUid": "movies",
                "federationOptions": {
                    "remote": "0" // useNetwork picked remote 0 for both shard a and b
                },
                "q": "Batman dark knight returns 1",
    		     "filter": ["genres IN [Action, Adventure]", "_shard = b"]
            },
            {
                "indexUid": "movies",
                "federationOptions": {
                    "remote": "2"
                },
                "q": "Batman dark knight returns 1",
    		     "filter": ["genres IN [Action, Adventure]", "_shard = c"]
            }
        ]
    }
    

    Responding with documents from all the shards:

    Response
    {
      "hits": [
        {
          "id": 123025,
          "title": "Batman: The Dark Knight Returns, Part 1",
          "overview": "Batman has not been seen for ten years. A new breed of criminal ravages Gotham City, forcing 55-year-old Bruce Wayne back into the cape and cowl. But, does he still have what it takes to fight crime in a new era?",
          "genres": [
            "Action",
            "Animation",
            "Mystery"
          ],
          "poster": "https://image.tmdb.org/t/p/w500/kkjTbwV1Xnj8wBL52PjOcXzTbnb.jpg",
          "release_date": 1345507200,
          "_federation": {
            "indexUid": "mieli",
            "queriesPosition": 2,
            "weightedRankingScore": 0.9894586894586894,
            "remote": "2"
          }
        },
        {
          "id": 142061,
          "title": "Batman: The Dark Knight Returns, Part 2",
          "overview": "Batman has stopped the reign of terror that The Mutants had cast upon his city.  Now an old foe wants a reunion and the government wants The Man of Steel to put a stop to Batman.",
          "genres": [
            "Action",
            "Animation",
            "Mystery"
          ],
          "poster": "https://image.tmdb.org/t/p/w500/arEZYd6uMOFTILne9Ux0A8qctMe.jpg",
          "release_date": 1357171200,
          "_federation": {
            "indexUid": "mieli",
            "queriesPosition": 1,
            "weightedRankingScore": 0.9894558963186414,
            "remote": "0"
          }
        },
        {
          "id": 16234,
          "title": "Batman Beyond: Return of the Joker",
          "overview": "The Joker is back with a vengeance, and Gotham's newest Dark Knight needs answers as he stands alone to face Gotham's most infamous Clown Prince of Crime.",
          "genres": [
            "Animation",
            "Family",
            "Action",
            "Science Fiction"
          ],
          "poster": "https://image.tmdb.org/t/p/w500/7RlBs0An83fqAuKfwH5gKMcqgMc.jpg",
          "release_date": 976579200,
          "_federation": {
            "indexUid": "mieli",
            "queriesPosition": 1,
            "weightedRankingScore": 0.9427964918160996,
            "remote": "0"
          }
        },
        {
          "id": 155,
          "title": "The Dark Knight",
          "overview": "Batman raises the stakes in his war on crime. With the help of Lt. Jim Gordon and District Attorney Harvey Dent, Batman sets out to dismantle the remaining criminal organizations that plague the streets. The partnership proves to be effective, but they soon find themselves prey to a reign of chaos unleashed by a rising criminal mastermind known to the terrified citizens of Gotham as the Joker.",
          "genres": [
            "Drama",
            "Action",
            "Crime",
            "Thriller"
          ],
          "poster": "https://image.tmdb.org/t/p/w500/qJ2tW6WMUDux911r6m7haRef0WH.jpg",
          "release_date": 1216166400,
          "_federation": {
            "indexUid": "mieli",
            "queriesPosition": 1,
            "weightedRankingScore": 0.5784178187403994,
            "remote": "0"
          }
        },
        {
          "id": 49026,
          "title": "The Dark Knight Rises",
          "overview": "Following the death of District Attorney Harvey Dent, Batman assumes responsibility for Dent's crimes to protect the late attorney's reputation and is subsequently hunted by the Gotham City Police Department. Eight years later, Batman encounters the mysterious Selina Kyle and the villainous Bane, a new terrorist leader who overwhelms Gotham's finest. The Dark Knight resurfaces to protect a city that has branded him an enemy.",
          "genres": [
            "Action",
            "Crime",
            "Drama",
            "Thriller"
          ],
          "poster": "https://image.tmdb.org/t/p/w500/vzvKcPQ4o7TjWeGIn0aGC9FeVNu.jpg",
          "release_date": 1342396800,
          "_federation": {
            "indexUid": "mieli",
            "queriesPosition": 2,
            "weightedRankingScore": 0.5772657450076805,
            "remote": "2"
          }
        }
      ],
      "query": "Batman dark knight returns 1",
      "processingTimeMs": 173,
      "limit": 5,
      "offset": 0,
      "estimatedTotalHits": 47,
      "facetDistribution": {
        "genres": {
          "Action": 46,
          "Adventure": 15,
          "Animation": 34,
          "Comedy": 3,
          "Crime": 14,
          "Drama": 6,
          "Family": 15,
          "Fantasy": 8,
          "Horror": 1,
          "Mystery": 4,
          "Romance": 1,
          "Science Fiction": 14,
          "TV Movie": 4,
          "Thriller": 4,
          "Western": 1
        }
      },
      "facetStats": {},
      "requestUid": "019bbcf4-a609-7701-8d82-d370611adfb3",
      "remoteErrors": {}
    }
    

    This change allows to naturally query all the documents in a sharded context.
    When network.leader is not present (in particular, when no network was defined), then the behavior is identical to previous versions.

  • useNetwork picks local instance if it owns the shard by @​dureuill in #​6287
    To prevent unnecessary network activity, when deciding which remote to ask for a shard in a search over the network, Meilisearch will now always pick the local instance if it owns the shard.

  • More efficient FST building by @​Kerollmops in #​6279
    It improves the construction of the word FST (word dictionary) by removing the need for a full scan of the word docids database. This should drastically improve the database's performance when inserting a large number of documents, even when inserting only a few.

🪲 Bug fixes
🔩 Miscellaneous

New Contributors

v1.40.0: 🦈

Compare Source

This release introduced support for the distinct attribute in federated search, enabling cross-index distinct attributes with facet distribution support. Additionally, significant performance improvements were delivered, including faster federated search (approximately 100ms faster), optimized JSON document generation for better handling of large documents and a much better memory usage for large workloads.

Enhancement
  • Support distinct in federated search by @​dureuill in #​6214

    The distinct attribute can now be passed to the federation object in federated search to apply a global, cross-index and cross-remote distinct computation to the results.

    Example of a federated search request with distinct
    {
      "federation": {
        "distinct": "genres", // ✨ NEW
        "facetsByIndex": { // recovering facet distribution is also supported with distinct
          "comics": [
            "genres"
          ],
          "movies": [
            "genres"
          ]
        },
        "mergeFacets": {} // merging facet distributions is also supported with distinct
      },
      "queries": [
        {
          "indexUid": "comics",
          "q": "batman",
          "attributesToRetrieve": ["title", "genres"],
          "useNetwork": true // distinct is also supported with network queries
        },
        {
          "indexUid": "movies",
          "q": "superman",
          "attributesToRetrieve": ["title", "genres"],
          "useNetwork": true
        }
      ]
    }
    
    Sample response to a federated search request with distinct
    {
      "hits": [
        {
          "title": "Batman",
          "genres": [
            "Family",
            "Adventure",
            "Comedy",
            "Science Fiction",
            "Crime"
          ],
          "_federation": {
            "indexUid": "comics",
            "queriesPosition": 0,
            "weightedRankingScore": 1.0,
            "remote": "ms2"
          }
        },
        {
          "title": "Batman",
          "genres": [
            "Fantasy",
            "Action"
          ],
          "_federation": {
            "indexUid": "comics",
            "queriesPosition": 0,
            "weightedRankingScore": 1.0,
            "remote": "ms1"
          }
        },
        {
          "title": "Batman & Bill",
          "genres": [
            "Documentary"
          ],
          "_federation": {
            "indexUid": "comics",
            "queriesPosition": 0,
            "weightedRankingScore": 0.9848484848484848,
            "remote": "ms1"
          }
        },
        {
          "title": "Superman: Red Son",
          "genres": [],
          "_federation": {
            "indexUid": "movies",
            "queriesPosition": 1,
            "weightedRankingScore": 0.9848484848484849,
            "remote": "ms0"
          }
        },
        {
          "title": "Superman, Spider-Man or Batman",
          "genres": [
            "Drama"
          ],
          "_federation": {
            "indexUid": "movies",
            "queriesPosition": 1,
            "weightedRankingScore": 0.9848484848484849,
            "remote": "ms0"
          }
        }
      ],
      "processingTimeMs": 15,
      "limit": 5,
      "offset": 0,
      "estimatedTotalHits": 11,
      "facetDistribution": {
        "genres": {
          "Action": 1,
          "Adventure": 1,
          "Comedy": 3,
          "Crime": 2,
          "Documentary": 1,
          "Drama": 1,
          "Family": 1,
          "Fantasy": 1,
          "Horror": 2,
          "Romance": 1,
          "Science Fiction": 1,
          "Thriller": 1,
          "Western": 1
        }
      },
      "facetStats": {},
      "requestUid": "019d05c7-ea65-77a1-8274-22a8ba9e26db",
      "remoteErrors": {}
    }
    

    Note the following to apply the distinct attribute at the federation level:

    1. Applying distinct at the query level at the same time as the federation level is disallowed and will return a HTTP 400 error.
    2. The chosen distinct field will apply to all remotes and indexes, so it must be a filterable attribute for all participating remotes and indexes.
    3. While Meilisearch attempts to compute the most accurate facet distribution, in distributed contexts this cannot be guaranteed as the distinct algorithm is not applied on all of the remote documents.
  • Improve performance of federated search by @​dureuill in #​6229

    Improves performance of federated search: about 100ms faster for all requests. Improves reliability of the HTTP server: the server will no longer be blocked when too many federated search requests are being processed.

  • Optimize the generation of JSON documents by @​Kerollmops in #​6257

    Addresses performance issues that users might encounter when requesting large documents. Additionally, performance is enhanced when users request only a small subset of fields from large documents.

  • Use the latest version of mimalloc to improve memory usage by @​Kerollmops in #​6201

    Updates mimalloc from v2 to v3, improving memory sharing between threads and significantly reducing memory usage on large workloads. It also overrides the allocator to use mimalloc at linking time, allowing LMDB, Meilisearch, and other C libraries to share their allocations for better overall memory efficiency. @​Kerollmops wrote a blog post about the story behind this improvement.

  • Add POST /tasks/compact for task queue compaction by @​YoEight in #​6193

    Compacts the task queue database and reclaim space so new tasks can keep being enqueued, without deleting existing tasks. This feature is behind the taskQueueCompactionRoute experimental feature flag.

[!WARNING]
Once task queue compaction completes, all write operations are blocked until the server is restarted.

🔐 Security
  • Bump rustls-webpki from 0.103.8 to 0.103.10 in #​6273
  • Bump tar from 0.4.44 to 0.4.45 in #​6271
  • Bump actix-web-lab from 0.24.3 to 0.26.0 in #​6218
  • Bump quinn-proto from 0.11.13 to 0.11.14 in #​6217
🪲 Bug fixes
🔩 Miscellaneous

New Contributors

v1.39.0: 🐳

Compare Source

What's Changed

Enhancement

🔬 Cross-index document hydration

Add a new ForeignKeys setting allowing to hydrate documents with documents coming from other indexes.

📓 Note: This implementation doesn't support a remote sharding environment

foreignKeys experimental feature

A new experimental feature, foreignKeys, has been added to the /experimental-feature route that must be set to true to activate the hydration.

curl -X PATCH 'http://127.0.0.1:7700/experimental-features' \
  -H 'Content-Type: application/json' \
  --data-binary '{"foreignKeys": true}'
foreignKeys index setting

A new index setting, foreignKeys, has been added to the /indexes/{index_uid}/settings:

// new setting, an array of foreign keys that allows multiple foreign relationships between indexes
"foreignKeys":  [
	{
		// the path in the JSON document containing foreign document ids
		"fieldName": "actors",
		
		// the UID of the foreign index containing the documents to fetch during hydration
        "foreignIndexUid": "actors"
	}
]
Example

With this new feature, a document shaped as follows:

{
  "id": 1,
  "title": "Forrest Gump",
  // Document IDs in foreign index
  "actors": [
    1
  ]
}

Will be hydrated as follows in a search response:

{
  "id": 1,
  "title": "Forrest Gump",
  "actors": [
	{
	  "id": 1,
	  "name": "Tom",
	  "familyName": "Hanks",
	  "birthDate": "1956-07-09"
	}
  ]
}

By @​ManyTheFish in #​6047

Disable proxy response buffering on Server-Sent Events (SSE)

Add X-Accel-Buffering: no on POST /chats/{workspace_uid}/chat/completions when the streaming mode is activated.
By @​YoEight in #​6228

🪲 Bug fixes

  • Fix a memory leak in the indexation pipeline by @​Kerollmops in #​6212

    We fixed an important memory leak caused by an invalid use of bumpalo. If you've seen Meilisearch using more and more memory over time, this issue is no longer visible in the latest version. If you want to read more about the bumpalo-trap we felt in, here is a good summary. It looks like this leak was introduced in v1.12, so approximately a year ago...

  • Avoid losing tasks by applying deltas on the wtxn view by @​Kerollmops in #​6222

    We addressed a small performance regression introduced in v1.38.1 that affected sending updates to the engine during task deletion. We've restored the task deletion performance to match v1.38.0 levels and ensured no race conditions occur while still allowing updates during deletion.

🔩 Miscellaneous

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.38.0...v1.39.0

v1.38.2: 🐍

Compare Source

Meilisearch v1.38.2 fixes a regression introduced in Meilisearch v1.38.0 where Meilisearch could sometimes stop processing tasks after an automatic task queue cleanup performed while more tasks where being added.

We recommend that all users in v1.38.0 and v1.38.1 migrate to v1.38.2.

Note that the dumpless upgrade process can take up to one minute before the HTTP server becomes available when migrating from a previous v1.38 version.

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.38.1...v1.38.2

v1.38.1: 🐍

Compare Source

Meilisearch v1.38.1 fixes a regression we have seen in task processing, which caused the engine to stop processing tasks.

🪲 Bug fixes

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.38.0...v1.38.1

v1.38.0: 🐍

Compare Source

Meilisearch v1.38 drastically improves indexing performance for embeddings, cleans up the task queue of orphan tasks and batches, ensures they are correctly deleted now, fixes issues users may encounter with OpenAI or VoyageAI when generating embeddings, and improves the tooling for generating routes in the documentation.

Enhancement
  • Embeddings: Use the latest version of hannoy with improved performances by @​Kerollmops in #​6184
    We drastically reduced embedding indexing time by eliminating full database scans. It is more efficient to add a couple of embeddings to a large database now.
  • Tasks: Optimize and fix task deletion by @​Mubelotix and @​kerollmops in #​5828
🪲 Bug fixes
  • Embedders: Fix the intermittent connection reset by peer errors when embedding documents or search queries using a remote embedder. By @​dureuill in #​6191
🔩 Miscellaneous
  • Enforce that routes appear in the reference documentation by @​dureuill and @​manythefish in #​6200
    The reference API is now generated from the source code, but it used to miss some actix-declared routes. It is now mandatory to attach a route when using the newly-provided routes::routes and routes::path macros, which ensures the route is added to the reference. Please refer to the documentation of the individual macros and the many examples throughout the codebase for more details.
  • Chore: remove verbose debug log on list documents by @​StephaneRob in #​6198
  • Add guide to CONTRIBUTING.md to test doc locally by @​curquiza in #​6180
  • Docs: capitalize LangChain and MCP in README by @​24f1000637 in #​6183
  • Docs: improve documentation of the parameters of the search route by @​curquiza in #​6194
New Contributors

v1.37.0

Compare Source

[!IMPORTANT]
This release contains breaking changes for users of the network experimental feature.

Meilisearch v1.37 introduces replicated sharding, removes the vectorStoreSetting experimental feature, stabilizes our new vector store for best performance, adds a security fix and miscellaneous improvements.

Improvements

§ Replicated sharding

[!NOTE]
Replicated sharding requires Meilisearch Enterprise Edition (EE).

  • Users of Meilisearch Cloud, please contact support if you need replicated sharding.
  • Users of the Community Edition, please contact the sales if you want to use replicated sharding in production.
§ Breaking changes
  • network objects sent to the PATCH /network route must now contain at least one shard object containing at least one remote when leader is not null.

Existing databases will be migrated automatically when upgraded with --experimental-dumpless-upgrade when leader is not null, such that for each remote:

  1. A shard with the same name as the remote is created
  2. This shard has exactly one remote in its remotes list: the remote with the same name as the shard.

This change will not cause any document to be resharded.

To be able to upgrade without resharding, the migration uses the same name for remotes and for shards. However, in new configurations, we recommend using different names for shards and remotes.

Example of migration

For instance, the following network object:

{
  "leader": "ms-00",
  "self": "ms-01",
  "remotes": {
    "ms-00": { /* .. */ },
    "ms-01": { /* .. */ }
  }
}

is converted to:

{
  "leader": "ms-00",
  "self": "ms-01",
  "remotes": {
    "ms-00": { /* .. */ },
    "ms-01": { /* .. */ }
  },
  "shards": {  // ✨ NEW
    "ms-00": {  // shard named like the remote
      "remotes": ["ms-00"] // is owned by the remote
    },
    "ms-01": {
      "remotes": ["ms-01"]
    }
  }
}
Addition of network.shards

The network object for routes PATCH /network and GET /network now contains the new field shards, which is an object whose values are shard objects, and keys the name of each shard.

Each shard object contains a single field remotes, which is an array of strings, each string representing the name of an existing remote.

Convenience fields

The shard objects in PATCH /network contain the additional fields addRemotes and removeRemotes meant for convenience:

  • pass an array of remote names to shard.addRemotes to add these remotes to the list of remotes of a shard.
  • pass an array of remote names to shard.removeRemotes to remove these remotes from the list of remotes of a shard.
  • if present and non-null, shard.remotes will completely override the existing list of remotes for a shard.
  • if several of these options are present and non-null, then the order of application is shard.remotes, then shard.addRemotes, then shard.removeShards.
Adding a new shard with some remotes
// PATCH /network
{
  // assuming that remotes `ms-0`, `ms-1`, `ms-2` where sent in a previous call to PATCH /network
  "shards": {
    "s-a": { // new shard
      "remotes": ["ms-0", "ms-1"]
    }
  }
}

Remotes ms-0 and ms-1 own the new shard s-a.

Fully overriding the list of remotes owning a shard
// PATCH /network
{
  // assuming remotes `ms-0`, `ms-1`, `ms-2`
  // assuming shard `s-a`, owned by `ms-0` and `ms-1`
  "shards": {
    "s-a": {
      "remotes": ["ms-2"]
    }
  }
}

ms-2 is now the sole owner of s-a, replacing ms-0 and ms-1.

Adding a remote without overriding the list of remotes owning a shard
// PATCH /network
{
  // assuming remotes `ms-0`, `ms-1`, `ms-2`
  // assuming shard `s-a`, owned by `ms-2`
  "shards": {
    "s-a": {
      "addRemotes": ["ms-0"]
    }
  }
}

ms-0 and ms-2 are now the owners of s-a.

Removing a remote without overriding the list of remotes owning a shard
// PATCH /network
{
  // assuming remotes `ms-0`, `ms-1`, `ms-2`
  // assuming shard `s-a`, owned by `ms-0` and `ms-2`
  "shards": {
    "s-a": {
      "removeRemotes": ["ms-2"]
    }
  }
}

ms-0 is now the sole owner of s-a.

Entirely removing a shard from the list of shards

Set the shard to null:

// PATCH /network
{
  "shards": {
    "s-a": null
  }
}

Or set its remotes list to the empty list:

// PATCH /network
{
  "shards": {
    "s-a": {
      "remotes": []
    }
  }
}
network.shards validity

When network.leader is not null, each shard object in network.shards must:

  1. Only contain remotes that exist in the list of remotes.
  2. Contain at least one remote.

Additionally, network.shards must contain at least one shard.

Failure to meet any of these conditions will cause the PATCH /network route to respond with 400 invalid_network_shards.

Change in sharding logic

Documents are now sharded according to the list of shards declared in the network rather than the list of remotes. All remotes owning a shard will process the documents that belong to this shard, allowing for replication.

Example of replication

The following configuration defines 3 remotes 0, 1 and 2, and 3 shards A, B, C, such that each remote owns two shards, achieving replication (losing one remote does not lose any document).

{
  "leader": "0",
  "self": "0",
  "remotes": {
    "0": { /* .. */ },
    "1": { /* .. */ },
    "2": { /* .. */ }
  },
  "shards": {
    "A": {
      "remotes": ["0", "1"]
    },
    "B": {
      "remotes": ["1", "2"]
    },
    "C": {
      "remotes": ["2", "0"]
    }
  }
}
  • Full replication is supported by having all remotes own all the shards.
  • Unbalanced replication is supported by having some remotes own more shards than other remotes.
  • "Watcher" remotes are supported by having remotes that own no shards. Watcher remotes are not very useful in this release, and might be upgraded in a future release, so that they keep all documents without indexing them, allowing to "respawn" shards for other remotes.
useNetwork takes network.shards into account

When useNetwork: true is passed to a search query, it is expanded to multiple queries such that each shard declared in network.shards appears exactly once, associated with a remote that owns that shard.

This ensures that there is no missing or duplicate documents in the results.

_shard filters

When the network experimental feature is enabled, then it becomes possible to filter documents depending on the shard they belong to.

Given s-a and s-b the names of two shards declared in network.shards, then:

  • _shard = "s-a" in a filter parameter to the search or documents fetch will return the documents that belong to s-a.
  • _shard != "s-a" will return the documents that do not belong to s-a
  • _shard IN ["s-a", "s-b"] will return the documents that belong to s-a or to s-b.

You can use these new filters in manual remote federated search to create a partitioning over all shards in the network.

[!IMPORTANT]
To avoid duplicate or missing documents in results, for manually crafted remote federated search requests, all shards should appear in exactly one query.

[!TIP]
Search requests built with useNetwork: true already build a correct partitioning over shards. They should be preferred to manually crafted remote federated search requests in replicated sharding scenarios.

Update instructions

When updating your Meilisearch network using dumpless upgrade, please observe the following guidelines:

  1. Do not call the PATCH /network route until all remotes of the network are finished updating
  2. If using the search routes with useNetwork: true, call them on un-updated remotes. Calling it on already updated remotes will cause un-updated remotes to fail the search as they don't know about the _shard filters.

By @​dureuill in #​6128

§ Remove vectorStoreSetting experimental feature

The new HNSW vector store (hannoy) has been stabilized and is now the only supported vector store in Meilisearch.

As a result, updating to v1.37.0 will migrate all remaining legacy vector store indexes (using arroy) to hannoy, and the vectorStoreSetting experimental feature is no longer available.

By @​Kerollmops in #​6176

Improve indexing performance for embeddings

We removed a computationally expensive step from vector indexing.

On a DB with 20M documents, this removes 300s per indexing batch of 1100s.

By @​Kerollmops in #​6175

§ 🔒 Security

  • Bump mini-dashboard (local web interface) which
    • now stores API key in RAM instead of in the localStorage
    • bumps dependencies with potential security vulnerabilities

By @​Strift and @​curquiza in #​6186 and #​6172

§ 🔩 Miscellaneous

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.36.0...v1.37.0

v1.36.0: 🐙

Compare Source

Version v1.36.0 introduces an exciting update to the ranking rules to improve the engine's relevance. It's actually the first time we've made such a change since v1.0, and we're really happy about this improvement!

Enhancement
  • Introduce the attributeRank and wordPosition criteria by @​Kerollmops in #​6154, #​6155, and #​6164

    We released two new ranking rules that Meilisearch had already been using internally for the attribute one, which is basically both ranking rules applied one after the other:

    • attributeRank: A document is considered better if the query words match in a higher searchable attribute. It ignores the position of the query words in this attribute.
    • wordPosition: A document is considered better if the query words match closer to the beginning of an attribute. The attribute rank is ignored by this rule.
  • We continue our policy of migrating everyone to use a homemade HNSW by introducing a new dumpless upgrade step that migrates index uses the old annoy vector store to the new Hannoy one. Changing the vector store backend affects the ranking score. This step can take a couple of minutes when the number of embeddings is high, and we recommend changing the vector store backend beforehand to gain more control if needed. To do so, you must enable the vectorStoreSetting experimental feature and set the vectorStore root setting to experimental.

🪲 Bug fixes
  • Fix search failing when using attributesToSearchOn on an empty index by @​zen-zap in #​5944
🔒 Security
🔩 Miscellaneous

[!WARNING]
Breaking change: the meilisearch-openapi-mintlify.json file will not be available in the release assets anymore. If you were using it, please refer to the one that is now available in our public documentation repository.

❤️ Thanks to @​zen-zap for contributing to this release!

v1.35.1

Compare Source

🦋 Bug fixes

Meilisearch v1.35.1 fixes a possible task database corruption issue that would occur when using the S3 streaming snapshot method.

  • Users of the Community Edition do not need to upgrade as this feature is Enterprise Edition only
  • Affected users of the Cloud have been contacted.

Details

While snapshotting the task database, sending a task to Meilisearch could corrupt it. Index DBs were not affected, so manually rebuilding the task database fixes the corruption.

By @​dureuill in #​6160

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.35.0...v1.35.1

v1.35.0

Compare Source

Meilisearch v1.35.0 contains improvements to the observability of the search performance, a breaking change to the recently introduced POST /indexes/<index_uid>/fields route, and other bugfixes and improvements.

🌈 Improvements

Observe the search performance

The search routes accept a new field named showPerformanceDetails. When set to true, the search response contains a performance trace, allowing the user to better
understand what takes time during a search query.

impacted routes:

  • POST /indexes/<index_uid>/search
  • GET /indexes/<index_uid>/search
  • POST /multi-search
  • POST /indexes/<index_uid>/similar
  • GET /indexes/<index_uid>/similar

routes: POST /indexes/<index_uid>/search and GET /indexes/<index_uid>/search

Request

new request parameters:

  • showPerformanceDetails: true/false (boolean)
example
{
	"q": "glass",
	"showPerformanceDetails": true
}
Response

new response field:

  • performanceDetails: {"<span>": "<human_duration>", .. } (map)
example
{
	"hits": [
		// hits ..
	],
	"query": "glass",
	"processingTimeMs": 5,
	"limit": 20,
	"offset": 0,
	"estimatedTotalHits": 1,
	"requestUid": "<uuid>",
	"performanceDetails": {
		"wait for permit": "295.29µs",
		"search > tokenize": "436.67µs",
		"search > resolve universe": "649.00µs",
		"search > keyword search": "515.71µs",
		"search > format": "288.54µs",
		"search": "3.56ms"
	}
}

route: POST /multi-search

Request

new request parameters:

  • queries.showPerformanceDetails: true/false (boolean)
example
"queries": [
	{
		"indexUid": "<index_uid>",
		"q": "glass",
		"showPerformanceDetails": true
	}
]
Response

new response field:

  • results.performanceDetails: {"<span>": "<human_duration>", .. } (map)
example
{
	"results": [
		{
			"indexUid": "<index_uid>",
			"hits": [
				// hits ..
			],
			"query": "glass",
			"processingTimeMs": 5,
			"limit": 20,
			"offset": 0,
			"estimatedTotalHits": 1,
			"requestUid": "<uuid>",
			"performanceDetails": {
				"wait for permit": "295.29µs",
				"search > tokenize": "436.67µs",
				"search > resolve universe": "649.00µs",
				"search > keyword search": "515.71µs",
				"search > format": "288.54µs",
				"search": "3.56ms"
			}
		}
	]
}

route: POST /multi-search

Request

new request parameters:

  • federation.showPerformanceDetails: true/false (boolean)
example
{
	"federation": { "showPerformanceDetails": true },
	"queries": [
		{
			"indexUid": "<index_uid>",
			"q": "glass"
		}
	]
}
Response

new response field:

  • performanceDetails: {"<span>": "<human_duration>", .. } (map)
example
{
	"hits": [
		// hits ..
	],
	"query": "glass",
	"processingTimeMs": 5,
	"limit": 20,
	"offset": 0,
	"estimatedTotalHits": 1,
	"requestUid": "<uuid>",
	"performanceDetails": {
		"wait for permit": "213.83µs",
		"search > tokenize": "171.67µs",
		"search > resolve universe": "257.63µs",
		"search > keyword search": "577.71µs",
		"search > format": "114.96µs",
		"search > federation > wait for remote results": "62.71µs",
		"search > federation > merge results": "120.04µs",
		"search > federation > merge facets": "53.42µs",
		"search > federation": "237.04µs",
		"search": "289.08ms"
	}
}
Similar

routes: POST /indexes/<index_uid>/similar and GET /indexes/<index_uid>/similar

Request

new request parameters:

  • showPerformanceDetails: true/false (boolean)
example
{
	"id": 143,
	"embedder": "manual",
	"showPerformanceDetails": true
}
Response

new response field:

  • performanceDetails: {"<span>": "<human_duration>", .. } (map)
example
{
	"hits": [
		// hits ..
	],
	"id": "143",
	"processingTimeMs": "[duration]",
	"limit": 20,
	"offset": 0,
	"estimatedTotalHits": 4,
	"performanceDetails": {
		"search > format": "244.92µs",
		"search": "1.25ms"
	}
}

By @​ManyTheFish in #​6132

Stabilize multithreaded post-processing of facets and prefixes

Multithreaded post-processing of facets and prefixes speeds-up indexing on multi-core machines.

Before v1.35.0, it could be disabled with an experimental feature.

Meilisearch v1.35.0 removes that experimental feature, resulting in the multithreaded post-processing being always enabled.

Cloud users upgrading to v1.35.0 will benefit from the speed-up.

By @​ManyTheFish in #​6130

🦋 Fixes

Breaking change: return pagination fields in POST /indexes/<index_uid>/fields route

[!WARNING]
Breaking change: The POST /indexes/<index_uid>/fields route now returns an object containing the results, offset, limit, and total fields instead of returning an array of results. This change allows to know how many fields match a given filter

Example: before/after

Before:

[
  // fields ..
]

After:

{
  "results": [
    // [fields .. ]
  ],
  "offset": 0,
  "limit": 20,
  "total": 0
}

By @​ManyTheFish in #​6126

POST /indexes/<index_uid>/fields: Fix pattern filtering when a parent field was matching a child pattern: title was matching the pattern title.to*.

Example: before/after

For the following request:

{
  "filter": {
    "attributePatterns": [
      "title.en"
    ]
  }
}

Before Response, title field is returned:

{
  "results": [
    {
      "name": "title",
      //metadata...
    },
    
  ],
  "offset": 0,
  "limit": 20,
  "total": 1
}

After Response, nothing returned:

{
  "results": [],
  "offset": 0,
  "limit": 20,
  "total": 0
}

By @​ManyTheFish, also in #​6126

🐛 Other fixes

🔩 Miscellaneous

New Contributors

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.34.3...v1.35.0

v1.34.3

Compare Source

🐛 Bug Fixes

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.34.2...v1.34.3

v1.34.2

Compare Source

This patch fixes an accidental breaking change in v1.34.1 where Meilisearch would not start with a configuration file if experimental_allowed_ip_networks was not defined.

  • Meilisearch Cloud users do not need to update as they were not affected by this regression
  • We recommend that OSS users upgrade to v1.34.2

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.34.1...v1.34.2

v1.34.1

Compare Source

In Meilisearch v1.34.1, we released a security fix that affect web queries initiated by Meilisearch.

🔐 Security

  • Cloud users: no action is needed. We found no evidence of exploitation on Meilisearch Cloud and the Cloud is protected at the infrastructure level.
  • Open-source users: if you allow untrusted users to configure webhooks, embedders or network of machines, we recommend you update to Meilisearch v1.34.1

In Meilisearch versions v1.8 to v1.34.0, a user with an API key with write permissions to the configuration of the Meilisearch instance could set up Meilisearch to send POST or GET requests to domains and IPs local to the private network of the Meilisearch instance, effectively bypassing the firewall. The vulnerability has not yet been assigned a CVE number; it has CVE Request 1975471 for CVE ID.

Meilisearch v1.34.1 fixes the vulnerability by forbidding Meilisearch from making any requests to a host resolving to a non-global IP, in the sense of the IANA IPv4 Special-Purpose Address Registry or the IANA IPv6 Special-Purpose Address Registry. If you need this functionality in your Meilisearch instance, you can set private IP networks as allowed with the --experimental-allowed-ip-networks parameter after reviewing the security implications.

This is a breaking change, which is allowed for security reasons.

Allowing non-global IP networks

The --experimental-allowed-ip-networks CLI flag and the MEILI_EXPERIMENTAL_ALLOWED_IP_NETWORKS environment variable control the behavior of Meilisearch with regards to non-global IP networks, with the CLI flag taking precedence over the environment variable when both are specified.

  • When missing, the default is to reject all web requests resolving to a non-global IP.
  • When set to a comma-separated list of CIDR-formatted networks (e.g. 192.168.0.0/16,10.0.0.0), then web requests to the networks from the list will be permitted. Web requests to the non-global IPs not part of the list will still be rejected.
  • When set to any, all web requests will be permitted regardless of the target IP, similar to the behavior of Meilisearch v1.34.0 and lower. Use this option when you control both the machine and the configuration of the deployed Meilisearch instance.

Acknowledgments

Thanks to Gabriel Rodrigues (aka Texugo), for reporting this vulnerability and for helping us improve the security of Meilisearch.

v1.34.0

Compare Source

🌈 Improvements

Easy search over your network of machines

useNetwork field in POST /indexes/{:indexUid}/search

The search query object passed in the body of POST /indexes/{:indexUid}/search now accepts an optional boolean useNetwork. When present and set to true, the search is executed "as-if" it was a remote federated search over all remotes in the network.

That is, the following:

Search request
// POST /indexes/movies/search
{
  "q": "Batman dark knight returns 1",
  "filter": "genres IN [Action, Adventure]",
  "facets": ["genres"],
  "useNetwork": true, // ✨ NEW
  "limit": 5
}

Is executed by Meilisearch as if it was the following, assuming a network of 3 Meilisearch instances with names "0", "1" and "2":

Equivalent multi-search request
// POST /multi-search
{
    "federation": {
        "limit": 5,
        "facetsByIndex": {
            "movies": [
                "genres"
            ]
        },
        "merge": {}
    },
    "queries": [
        {
            "indexUid": "movies",
            "federationOptions": {
                "remote": "0"
            },
            "q": "Batman dark knight returns 1",
            "filter": "genres IN [Action, Adventure]"
        },
        {
            "indexUid": "movies",
            "federationOptions": {
                "remote": "1"
            },
            "q": "Batman dark knight returns 1",
            "filter": "genres IN [Action, Adventure]"
        },
        {
            "indexUid": "movies",
            "federationOptions": {
                "remote": "2"
            },
            "q": "Batman dark knight returns 1",
            "filter": "genres IN [Action, Adventure]"
        }
    ]
}

Resulting in:

Search Response
{
  "hits": [
    {
      "id": 123025,
      "title": "Batman: The Dark Knight Returns, Part 1",
      "overview": "Batman has not been seen for ten years. A new breed of criminal ravages Gotham City, forcing 55-year-old Bruce Wayne back into the cape and cowl. But, does he still have what it takes to fight crime in a new era?",
      "genres": [
        "Action",
        "Animation",
        "Mystery"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/kkjTbwV1Xnj8wBL52PjOcXzTbnb.jpg",
      "release_date": 1345507200,
      "_federation": {
        "indexUid": "mieli",
        "queriesPosition": 2,
        "weightedRankingScore": 0.9894586894586894,
        "remote": "2"
      }
    },
    {
      "id": 142061,
      "title": "Batman: The Dark Knight Returns, Part 2",
      "overview": "Batman has stopped the reign of terror that The Mutants had cast upon his city.  Now an old foe wants a reunion and the government wants The Man of Steel to put a stop to Batman.",
      "genres": [
        "Action",
        "Animation",
        "Mystery"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/arEZYd6uMOFTILne9Ux0A8qctMe.jpg",
      "release_date": 1357171200,
      "_federation": {
        "indexUid": "mieli",
        "queriesPosition": 1,
        "weightedRankingScore": 0.9894558963186414,
        "remote": "1"
      }
    },
    {
      "id": 16234,
      "title": "Batman Beyond: Return of the Joker",
      "overview": "The Joker is back with a vengeance, and Gotham's newest Dark Knight needs answers as he stands alone to face Gotham's most infamous Clown Prince of Crime.",
      "genres": [
        "Animation",
        "Family",
        "Action",
        "Science Fiction"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/7RlBs0An83fqAuKfwH5gKMcqgMc.jpg",
      "release_date": 976579200,
      "_federation": {
        "indexUid": "mieli",
        "queriesPosition": 1,
        "weightedRankingScore": 0.9427964918160996,
        "remote": "1"
      }
    },
    {
      "id": 155,
      "title": "The Dark Knight",
      "overview": "Batman raises the stakes in his war on crime. With the help of Lt. Jim Gordon and District Attorney Harvey Dent, Batman sets out to dismantle the remaining criminal organizations that plague the streets. The partnership proves to be effective, but they soon find themselves prey to a reign of chaos unleashed by a rising criminal mastermind known to the terrified citizens of Gotham as the Joker.",
      "genres": [
        "Drama",
        "Action",
        "Crime",
        "Thriller"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/qJ2tW6WMUDux911r6m7haRef0WH.jpg",
      "release_date": 1216166400,
      "_federation": {
        "indexUid": "mieli",
        "queriesPosition": 1,
        "weightedRankingScore": 0.5784178187403994,
        "remote": "1"
      }
    },
    {
      "id": 49026,
      "title": "The Dark Knight Rises",
      "overview": "Following the death of District Attorney Harvey Dent, Batman assumes responsibility for Dent's crimes to protect the late attorney's reputation and is subsequently hunted by the Gotham City Police Department. Eight years later, Batman encounters the mysterious Selina Kyle and the villainous Bane, a new terrorist leader who overwhelms Gotham's finest. The Dark Knight resurfaces to protect a city that has branded him an enemy.",
      "genres": [
        "Action",
        "Crime",
        "Drama",
        "Thriller"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/vzvKcPQ4o7TjWeGIn0aGC9FeVNu.jpg",
      "release_date": 1342396800,
      "_federation": {
        "indexUid": "mieli",
        "queriesPosition": 2,
        "weightedRankingScore": 0.5772657450076805,
        "remote": "2"
      }
    }
  ],
  "query": "Batman dark knight returns 1",
  "processingTimeMs": 173,
  "limit": 5,
  "offset": 0,
  "estimatedTotalHits": 47,
  "facetDistribution": {
    "genres": {
      "Action": 46,
      "Adventure": 15,
      "Animation": 34,
      "Comedy": 3,
      "Crime": 14,
      "Drama": 6,
      "Family": 15,
      "Fantasy": 8,
      "Horror": 1,
      "Mystery": 4,
      "Romance": 1,
      "Science Fiction": 14,
      "TV Movie": 4,
      "Thriller": 4,
      "Western": 1
    }
  },
  "facetStats": {},
  "requestUid": "019bbcf4-a609-7701-8d82-d370611adfb3",
  "remoteErrors": {}
}

useNetwork requires the network experimental feature to be enabled.

Passing useNetwork=true as a query parameter to GET /indexes/{:indexUid}/search has the same effect as passing useNetwork: true as a field parameter to POST /indexes/{:indexUid}/search

.queries[].useNetwork field in POST /multi-search
  • useNetwork can also be passed as a field of the individual queries inside of a multi-search request.
  • When used on a query in a non-federated search request, it has the same effect as on POST /indexes/{:indexUid}/search for that query
  • When used on a query in a federated search request, the request is executed "as-if" one query per remote of the network had been performed.

Federated search example:

Multi-search request
{
    "federation": {
        "limit": 5
    },
    "queries": [
        {
            "q": "Batman returns",
            "indexUid": "mieli",
            "useNetwork": true
        },
        {
            "q": "Superman returns",
            "indexUid": "mieli",
            "useNetwork": true
        }
    ]
}
Multi-search response
{
  "hits": [
    {
      "id": 364,
      "title": "Batman Returns",
      "overview": "While Batman deals with a deformed man calling himself the Penguin, an employee of a corrupt businessman transforms into the Catwoman.",
      "genres": [
        "Action",
        "Fantasy"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/jKBjeXM7iBBV9UkUcOXx3m7FSHY.jpg",
      "release_date": 708912000,
      "_federation": {
        "indexUid": "mieli",
        "queriesPosition": 0,
        "weightedRankingScore": 1.0,
        "remote": "1"
      }
    },
    {
      "id": 1452,
      "title": "Superman Returns",
      "overview": "Superman returns to discover his 5-year absence has allowed Lex Luthor to walk free, and that those he was closest to felt abandoned and have moved on. Luthor plots his ultimate revenge that could see millions killed and change the face of the planet forever, as well as ridding himself of the Man of Steel.",
      "genres": [
        "Science Fiction",
        "Action",
        "Adventure"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/qIegbn6DSUYmggfwxOBNOVS35q.jpg",
      "release_date": 1151452800,
      "_federation": {
        "indexUid": "mieli",
        "queriesPosition": 1,
        "weightedRankingScore": 1.0,
        "remote": "0"
      }
    },
    {
      "id": 324249,
      "title": "Requiem for Krypton: Making 'Superman Returns'",
      "overview": "A detailed behind-the-scenes documentary on the making of Superman Returns.",
      "genres": [
        "Documentary"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/eC1XKswKSoyDyJXXZszLTuwUHli.jpg",
      "release_date": 1164672000,
      "_federation": {
        "indexUid": "mieli",
        "queriesPosition": 1,
        "weightedRankingScore": 0.9907407407407408,
        "remote": "1"
      }
    },
    {
      "id": 294294,
      "title": "Saltwater",
      "overview": "This American Indie drama follows several endearing characters as they wade through life seeking happiness, peace and ultimately, love. Will (Ronnie Kerr, Vampire Boys 2, Shut Up and Kiss Me) leaves the Navy after many years, soon reunites old friends and begins to start his new civilian life. His friend Rich (Bruce L Hart) tries to set him up with ruggedly handsome Josh (Ian Roberts-a former Australian professional rugby player, actor and model-Cedar Boys, Superman Returns, Little Fish). While there is immense chemistry between the two, timing and certain ideals never seem to align. When a shocking tragedy happens the two are paired up to pick up the pieces and sort through the after effects. Saltwater is a story about men of all ages, finding love, losing friends, navigating their way through life and knowing it's the journey rather then the destination that's important.",
      "genres": [
        "Romance",
        "Drama"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/bDnLdYqpH9abHo4ASMPKiInx8dm.jpg",
      "release_date": 1342310400,
      "_federation": {
        "indexUid": "mieli",
        "queriesPosition": 1,
        "weightedRankingScore": 0.966931216931217,
        "remote": "1"
      }
    },
    {
      "id": 142061,
      "title": "Batman: The Dark Knight Returns, Part 2",
      "overview": "Batman has stopped the reign of terror that The Mutants had cast upon his city.  Now an old foe wants a reunion and the government wants The Man of Steel to put a stop to Batman.",
      "genres": [
        "Action",
        "Animation",
        "Mystery"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/arEZYd6uMOFTILne9Ux0A8qctMe.jpg",
      "release_date": 1357171200,
      "_federation": {
        "indexUid": "mieli",
        "queriesPosition": 0,
        "weightedRankingScore": 0.8697089947089947,
        "remote": "1"
      }
    }
  ],
  "processingTimeMs": 247,
  "limit": 5,
  "offset": 0,
  "estimatedTotalHits": 97,
  "requestUid": "019bbd3a-5106-70e0-94fc-f58b2f0c28c8",
  "remoteErrors": {}
}
Limitations
  • Facet search referencing useNetwork are not supported
  • The chat route cannot use useNetwork at the moment: doing so is not trivial implementation-wise, because chat route expects to be able to open the index (to fetch chat configs), but federated search only opens the indexes once during a short critical section.

By @​dureuill in #​6101

Federated search supports page and hitsPerPage

Pass federation.page and federation.hitsPerPage with the same meaning as in a regular search request to use exhaustive pagination in the federated search

By @​dureuill in #​6101

Speed up settings changes when removing searchable

The settings indexer is more efficient when users are removing searchable attributes from the searchable fields.

By @​VedantMadane in #​6109

🔒 Security

Solves a low-severity timing attack vulnerability on key comparison by using constant-time comparison

By @​curquiza in #​6077

🔩 Maintenance

Remove some unwanted dependencies

New Contributors

❤️ Thanks again @​VedantMadane for the contribution to this release!

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.33.1...v1.34.0

v1.33.1: 🐞

Compare Source

In Meilisearch v1.33.1, we released a security fix that affected the dump import, improvements to vector store relevance in massive databases, and a fix related to ranking scores.

🔐 Security Fix
  • Cloud users: you don't need to do anything. We found no evidence of exploitation of this vulnerability on Meilisearch Cloud.
  • Open-source users: if you allow importing dumps from an untrusted source, we recommend you update to v1.33.1

All versions of Meilisearch before v1.33.0 are vulnerable to a path traversal vulnerability involving the dump import functionality.

Importing a specially crafted dump could result in giving access to the Meilisearch instance to arbitrary, specifically formatted files, present on the file system of the Meilisearch instance.

Enhancements
  • We updated the vector store to trigger linear scanning even on bigger databases, leading to improved performance and so better result quality when the search cutoff is reached. This applies in particular when the number of filtered candidates is small relative to the number of documents in the index by @​Kerollmops in #​6113.
🐛 Bug Fixes
  • We fixed a bug where only the first non-blocking buckets were taken for the non-final ranking rules. This improves the quality of search results when the search cutoff triggers, especially when vector search and a sort are involved by @​Kerollmops in #​6113.

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.33.0...v1.33.1

v1.33.0: 🐞

Compare Source

 Enhancement
  • Add /fields route to get all the fields of an index by @​YoEight in #​6082
    Adds a new POST /indexes/{indexUid}/fields endpoint that returns detailed metadata about all fields in an index. This endpoint provides comprehensive information about each field's configuration, including display, search, filtering, and localization settings.

  • Implement parallel cleanup of old field IDs by @​Kerollmops in #​6100
    We reduce the time required to perform the dumpless upgrade for instances before v1.32.0 by multi-threading database fetches. By doing that, we noticed improvements from 2 hours and 50 minutes to a bit less than 7 minutes.

  • Bump hannoy to 0.1.4-nested-rtxns by @​Kerollmops in #​6103
    We updated our internal vector store to speed up the dumpless upgrade by improving the graph rebuilding and improving the speed and relevance of the search by using the explore factor as a limit to stop document searches rather than the query limit.

🪲 Bug fixes
🔒 Security
🔩 Miscellaneous

Thank you @​Vipul-045 for your first contribution ❤️

v1.32.2: 🐟

Compare Source

🐛 Bug fixes

  • Do not panic when doing a dumpless upgrade on empty indexes with configured embeddings by @​Kerollmops in #​6102

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.32.1...v1.32.2

v1.32.1: 🐟

Compare Source

🌈 Improvements

Skip cleaning up the field-ID-based databases

Introduce a MEILI_EXPERIMENTAL_DISABLE_FID_BASED_DATABASES_CLEANUP env var to opt out of the field ID-based database cleanup when upgrading a Meilisearch from versions inferior to 1.32.0.

by @​ManyTheFish in #​6096

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.32.0...v1.32.1

v1.32.0: 🐟

Compare Source

🌈 Improvements

Log Search performance trace

Introduces comprehensive progress tracking and logging for search operations in Meilisearch. It adds detailed timing information for each step of the search process, enabling better observability and performance analysis.

by @​ManyTheFish in #​6072

Extract document operations from payloads in parallel

We accelerate document indexing by processing a large number of tasks in batches or a large number of records in parallel. We expedited the preparation of the payloads by extracting the various changes and assigning internal IDs in parallel. We achieved a 7x speedup on a four-million-document insertion using four CPUs, and the performance scales with the number of CPUs.

The indexedDocuments field in tasks using skipCreation no longer precisely reflects the number of document operations performed, specifically for POST and PUT operations. This count may be higher than the actual number of operations, but it doesn't affect the computation; only the reported count is impacted. We prioritize speed over perfect accuracy here, and the documents are still correctly indexed as before.

by @​Kerollmops in #​6080

🐛 Bug fixes

Vector sort: Bucket documents with same similarity

Fixed vector sort bucketing so documents with identical similarity scores are grouped together, ensuring subsequent ranking rules are applied correctly.

by @​dureuill in #​6081

Properly Delete Documents from FID-Based Databases

Fixes a bug where changing searchableAttributes from ["*"] to a subset of fields left orphaned data in fid-based databases, causing corruption and warnings during search.

by @​ManyTheFish in #​6076

Bumps hannoy to v0.1.3-nested-rtxns, which fixes graph-related recall issues and adds a method to rebuild graph links to recover previously malformed graphs. Also fixes a minor issue in the dumpless upgrade flow where the upgrade description was not displayed correctly and related operations were not properly associated with the upgrade.

by @​Kerollmops in #​6055

🛠️ Maintenance and Misc.

Update JS SDKs tests to use pnpm instead of yarn

Updated the JavaScript SDK tests to use pnpm instead of yarn in CI workflows, switching the package manager across test configurations to ensure the SDK test suite runs correctly and consistently with the current tooling.

by @​Strift in #​6075

Adapt JS tests in SDK tests CI

Updated the SDK tests CI workflow for the JavaScript SDKs

by @​curquiza in #​6050

Bump lru from 0.16.2 to 0.16.3

Fix Stacked Borrows violation in IterMut.

by @​dependabot[bot] in #​6087

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.31.0...v1.32.0

v1.31.0: 🦃

Compare Source

🌈 Improvements

🗄️ [Enterprise Edition] Make the S3-streaming snapshots an Enterprise Edition feature

The recently introduced S3-streaming snapshots feature is now available as an Enterprise Edition feature. From now on, you'll need a license to use this feature when using Meilisearch as a self-hosted solution. Note that this version introduces a breaking change regarding the S3-streaming snapshot feature, which is no longer available in the Community Edition; however, on-disk snapshots remain accessible. You can read our BUSL license for contact information, if you like. Note that if you are using the Community Edition of Meilisearch between version 1.25 and this release, you can freely use the S3 Streaming feature without an Enterprise Edition license.

by @​Kerollmops in #​6057

🔏 [Enterprise Edition] Support AWS IRSA to authenticate to S3 for snapshotting

We just introduced support for IRSA authentication to do snapshots on AWS. IRSA allows the use of short-lived access and secret keys to upload snapshots through S3. This feature is available under the Enterprise Edition and can be accessed through two experimental CLI parameters.

by @​paulden in #​6044

✍️ Allow strict document update without creating missing documents

Adds an optional skipCreation boolean query parameter to POST and PUT on /indexes/{index}/documents. When set to true, documents that don't exist in the index are silently ignored rather than created. Default is false, preserving existing behavior.

by @​YoEight in #​6053

🐛 Bug fixes

🛠️ Maintenance and Misc.

v1.30.1: 🐸

Compare Source

What's Changed

🐛 Bug Fixes

Fix task attribution during index swap to prevent cross-index task loss by @​YoEight in #​6059

This change fixes the parenting of the tasks when doing an index swap.

Hotfix: log a warning when FieldidsWeightsMap is missing entry by @​ManyTheFish in #​6064

This hotfix avoids the encounter of following error during a search request:

{
  "message": "Inside `<query>`: Index `<index_uid>`: internal: missing <field_id> in the fieldids weights mapping.",
  "code": "internal",
  "type": "internal",
  "link": "https://docs.meilisearch.com/errors#internal"
}

🫂 New Contributors

v1.30.0: 🐸

Compare Source

🌈 Improvements

Up and down network scaling

Since v1.19.0, Meilisearch Enterprise Edition allows the automatic sharding of documents over multiple Meilisearch instances, enabling scaling to more documents than a single instance would accommodate.

Meilisearch v1.30.0 adds the ability to modify the number of participants in sharding, without having to start over sending documents to a new cluster containing the number of desired machines.

To make this possible, Meilisearch v1.30.0 introduces breaking changes. These breaking changes only affect the users of the experimental network feature who enabled automatic sharding (network.sharding = true). Users of the stable features are not affected.

Usage
Setting up the initial network
  1. Pick a leader machine that will receive all tasks. Calling a route that creates a dcument, settings or network-related task on a machine that is not the leader will now return an error.
  2. Send your network topology to the leader by calling PATCH /network:
// PATCH /network
{
  "self": "ms0",
  "leader": "ms0", // must be equal to `self`
  "remotes": {
    "ms0": {
      "url": "URL_OF_MS0",
      "searchApiKey": "SEARCH_API_KEY_OF_MS0",
      "writeApiKey": "WRITE_API_KEY_OF_MS0",
    },
    "ms1": {
      "url": "URL_OF_MS1",
      "searchApiKey": "SEARCH_API_KEY_OF_MS1",
      "writeApiKey": "WRITE_API_KEY_OF_MS1",
    }
  }
}
  1. The network is automatically propagated to other members of the network.
  2. Send settings and documents as usual, but exclusively to the leader. They will be propagated to all participants in the network, and each participant will process a piece of the documents.
Upgrading from v1.29 or earlier
  1. We recommend using the experimental dumpless upgrade feature to go from Meilisearch v1.13+ to Meilisearch v1.29.
  2. When using the experimental dumpless upgrade and the Meilisearch instance already has a network instance with sharding set to true, then the network object will be modified so that the leader is the first remote in alphabetic order. For instance, if you network contains remotes: A, B, C, the leader will be set to A.
Adding a new remote
  1. Call PATCH /network on the leader with the information about the new remote:
{
  "remotes": {
  // add information about the new remote
  "ms2": {
      "url": "URL_OF_MS2",
      "searchApiKey": "SEARCH_API_KEY_OF_MS2",
      "writeApiKey": "WRITE_API_KEY_OF_MS2",
    }
  // information about existing remotes does not need to be repeated
}
  1. The new network will be propagated from the leader to all remotes (including the new remote ms2).
  2. All remotes will register a new networkTopologyChange task that will "rebalance" the documents between the existing remotes and the new remote, that is, ms0 and ms1 will send parts of their documents to ms2
Removing a remote
  1. Call PATCH /network on the leader by setting any removed remote to null:
{
  "remotes": {
  // set removed remote to null
  "ms2": null
  // information about existing remotes does not need to be repeated
}
  1. The new network will be propagated from the leader to all remotes (including to the old remote ms2 that will then no longer participate in the network).
  2. All remotes will register a new networkTopologyChange task that will "rebalance" the documents between the remaining remotes, that is, ms2 will send its documents between ms0 and ms1
List of changes
List of changes, some of which are breaking
  1. Breaking change: The Network object returned or edited by the /network route is modified in the following way:
    • the sharding boolean is removed
    • a leader field is added as an optional string. When it is not null, it has the same effect (and more) than having sharding: true in the previous iteration of the Network object. The leader is used as a check when receiving task creation requests.
    • a version field is added as a UUID, defaulting to the null UUID. The version is used when processing tasks.
  2. Breaking change: When a network.leader is set, calling one of the following routes will fail with not_a_leader error if the target's network.self is not the same as its network.leader:
    • POST /indexes
    • PATCH/DELETE /indexes/{:indexUid}
    • POST/PUT/DELETE /indexes/{:indexUid}/documents
    • POST /indexes/{:indexUid}/documents/delete
    • POST /indexes/{:indexUid}/documents/delete-batch
    • POST /indexes/{:indexUid}/documents/edit
    • PATCH/DELETE /indexes/{:indexUid}/settings and settings sub-routes
    • PATCH /network if the target is the new leader
    • POST /swap-indexes
  3. Breaking change: when a leader is set, PATCH /network no longer returns a Network object. Rather, it spawns a new NetworkTopologyChange task, and returns the summarized task view.
  4. Breaking change: Tasks are duplicated by the leader to the entire network when calling the following routes:
    • POST /indexes (new to this PR)
    • PATCH/DELETE /indexes/{:indexUid} (new to this PR)
    • POST/PUT/DELETE /indexes/{:indexUid}/documents (was already the case before this PR)
    • POST /indexes/{:indexUid}/documents/delete (was already the case before this PR)
    • POST /indexes/{:indexUid}/documents/delete-batch (was already the case before this PR)
    • POST /indexes/{:indexUid}/documents/edit (was already the case before this PR)
    • PATCH/DELETE /indexes/{:indexUid}/settings and settings sub-routes (new to this PR)
    • PATCH /network if the target is the new leader (new to this PR)
    • POST /swap-indexes (new to this PR)
  5. New NetworkTopologyChange tasks that perform the following:
    1. Execute any remaining task to process with a network.version lower than the network task's version
    2. Iterate over all documents in all indexes, determine their new shard, and send the document to the remote that must now have it in the new version , deleting it from the local DB
      • The export route code has been factored and specialized to allow this
      • Should the export to a remote fail, the corresponding documents are kept locally
      • If there are no documents to send for an index, still call the documents addition with an empty payload and appropriate headers containing the expected metadata
      • If there are no documents to send for an entire remote, call the network route with specific headers containing the expected metadata
    3. Wait for and process tasks from the remotes of the previous version of the network.
  6. Breaking change: When importing dumps, we drop the self and leader from the network
  7. Network topology change tasks can be cancelled. In this case the state will be the current one (any moved documents will stay that way). Cancellation needs to happen on all machines.

by @​dureuill in #​6000

🛠️ Maintenance

Asset availability note

🌈 The Meilisearch binary is available again for meilisearch-enterprise-macos-amd64 and meilisearch-macos-amd64. It was not available for Meilisearch v1.29.

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.29.0...v1.30.0


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Renovate Bot.

This PR contains the following updates: | Package | Update | Change | |---|---|---| | [getmeili/meilisearch](https://github.com/meilisearch/meilisearch) | minor | `v1.29.0` → `v1.41.0` | --- > ⚠️ **Warning** > > Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/180) for more information. --- ### Release Notes <details> <summary>meilisearch/meilisearch (getmeili/meilisearch)</summary> ### [`v1.41.0`](https://github.com/meilisearch/meilisearch/releases/tag/v1.41.0): 🏈 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.40.0...v1.41.0) ##### ✨ Enhancement - **Support dynamic search rules with pinning** by [@&#8203;YoEight](https://github.com/YoEight) in [#&#8203;6182](https://github.com/meilisearch/meilisearch/pull/6182) Introduce the Dynamic Search Rules (DSR) experimental feature, making it easy to promote the right content for the right searches with flexible, condition-based pinning. In this first version, rules can be triggered by query-based conditions such as empty queries or literal substring matches, as well as time windows. Multiple documents can be pinned in a defined order, and pins still work with filtering, pagination, facet distribution, hybrid search, and federated search. Rules can be created or updated with `PATCH /dynamic-search-rules/{uid}` and removed with `DELETE /dynamic-search-rules/{uid}`. In this first version, a rule can define query- or time-based conditions and pin specific documents at fixed positions in the results list. <details> <summary>Example of rule creation/update</summary> ``` // PATCH /dynamic-search-rules/featured-wireless-headphones { "description": "Promote featured products for wireless headphone searches", "active": true, "conditions": [ { "scope": "query", "contains": "headphone" } ], "actions": [ { "selector": { "indexUid": "products", "id": "featured-headphones-001" }, "action": { "type": "pin", "position": 0 } }, { "selector": { "indexUid": "products", "id": "featured-headphones-002" }, "action": { "type": "pin", "position": 1 } } ] } ``` </details> - **Default to `useNetwork: true` in sharded instances by** [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6278](https://github.com/meilisearch/meilisearch/pull/6278) > This release contains [**breaking changes**](#search-requests-breaking-changes) for users of the `network` experimental feature. ##### Search requests now use the network by default when (replicated) sharding is enabled ##### <a id="search-requests-breaking-changes">§</a> Breaking changes When `network.leader` is set in the instance, `useNetwork` now defaults to `true` in search requests when omitted. So, when a network is configured, the following: <details> <summary>Search request without an explicit useNetwork</summary> ```jsonc // POST /indexes/movies/search { "q": "Batman dark knight returns 1", "filter": "genres IN [Action, Adventure]", "facets": ["genres"], "limit": 5 // No `useNetwork` is passed } ``` </details> is now equivalent to a federated search over multiples remotes so that all shards in the network are covered exactly once. <details> <summary>Equivalent federated search request</summary> ```jsonc // POST /multi-search { "federation": { "limit": 5, "facetsByIndex": { "movies": [ "genres" ] }, "merge": {} }, // assuming 3 remotes 0, 1, 2 and 3 shards a, b, c such that // 0 owns a, b // 1 owns b, c // 2 owns c, a "queries": [ { "indexUid": "movies", "federationOptions": { "remote": "0" }, "q": "Batman dark knight returns 1", "filter": ["genres IN [Action, Adventure]", "_shard = a"] }, { "indexUid": "movies", "federationOptions": { "remote": "0" // useNetwork picked remote 0 for both shard a and b }, "q": "Batman dark knight returns 1", "filter": ["genres IN [Action, Adventure]", "_shard = b"] }, { "indexUid": "movies", "federationOptions": { "remote": "2" }, "q": "Batman dark knight returns 1", "filter": ["genres IN [Action, Adventure]", "_shard = c"] } ] } ``` </details> Responding with documents from all the shards: <details> <summary>Response</summary> ```jsonc { "hits": [ { "id": 123025, "title": "Batman: The Dark Knight Returns, Part 1", "overview": "Batman has not been seen for ten years. A new breed of criminal ravages Gotham City, forcing 55-year-old Bruce Wayne back into the cape and cowl. But, does he still have what it takes to fight crime in a new era?", "genres": [ "Action", "Animation", "Mystery" ], "poster": "https://image.tmdb.org/t/p/w500/kkjTbwV1Xnj8wBL52PjOcXzTbnb.jpg", "release_date": 1345507200, "_federation": { "indexUid": "mieli", "queriesPosition": 2, "weightedRankingScore": 0.9894586894586894, "remote": "2" } }, { "id": 142061, "title": "Batman: The Dark Knight Returns, Part 2", "overview": "Batman has stopped the reign of terror that The Mutants had cast upon his city. Now an old foe wants a reunion and the government wants The Man of Steel to put a stop to Batman.", "genres": [ "Action", "Animation", "Mystery" ], "poster": "https://image.tmdb.org/t/p/w500/arEZYd6uMOFTILne9Ux0A8qctMe.jpg", "release_date": 1357171200, "_federation": { "indexUid": "mieli", "queriesPosition": 1, "weightedRankingScore": 0.9894558963186414, "remote": "0" } }, { "id": 16234, "title": "Batman Beyond: Return of the Joker", "overview": "The Joker is back with a vengeance, and Gotham's newest Dark Knight needs answers as he stands alone to face Gotham's most infamous Clown Prince of Crime.", "genres": [ "Animation", "Family", "Action", "Science Fiction" ], "poster": "https://image.tmdb.org/t/p/w500/7RlBs0An83fqAuKfwH5gKMcqgMc.jpg", "release_date": 976579200, "_federation": { "indexUid": "mieli", "queriesPosition": 1, "weightedRankingScore": 0.9427964918160996, "remote": "0" } }, { "id": 155, "title": "The Dark Knight", "overview": "Batman raises the stakes in his war on crime. With the help of Lt. Jim Gordon and District Attorney Harvey Dent, Batman sets out to dismantle the remaining criminal organizations that plague the streets. The partnership proves to be effective, but they soon find themselves prey to a reign of chaos unleashed by a rising criminal mastermind known to the terrified citizens of Gotham as the Joker.", "genres": [ "Drama", "Action", "Crime", "Thriller" ], "poster": "https://image.tmdb.org/t/p/w500/qJ2tW6WMUDux911r6m7haRef0WH.jpg", "release_date": 1216166400, "_federation": { "indexUid": "mieli", "queriesPosition": 1, "weightedRankingScore": 0.5784178187403994, "remote": "0" } }, { "id": 49026, "title": "The Dark Knight Rises", "overview": "Following the death of District Attorney Harvey Dent, Batman assumes responsibility for Dent's crimes to protect the late attorney's reputation and is subsequently hunted by the Gotham City Police Department. Eight years later, Batman encounters the mysterious Selina Kyle and the villainous Bane, a new terrorist leader who overwhelms Gotham's finest. The Dark Knight resurfaces to protect a city that has branded him an enemy.", "genres": [ "Action", "Crime", "Drama", "Thriller" ], "poster": "https://image.tmdb.org/t/p/w500/vzvKcPQ4o7TjWeGIn0aGC9FeVNu.jpg", "release_date": 1342396800, "_federation": { "indexUid": "mieli", "queriesPosition": 2, "weightedRankingScore": 0.5772657450076805, "remote": "2" } } ], "query": "Batman dark knight returns 1", "processingTimeMs": 173, "limit": 5, "offset": 0, "estimatedTotalHits": 47, "facetDistribution": { "genres": { "Action": 46, "Adventure": 15, "Animation": 34, "Comedy": 3, "Crime": 14, "Drama": 6, "Family": 15, "Fantasy": 8, "Horror": 1, "Mystery": 4, "Romance": 1, "Science Fiction": 14, "TV Movie": 4, "Thriller": 4, "Western": 1 } }, "facetStats": {}, "requestUid": "019bbcf4-a609-7701-8d82-d370611adfb3", "remoteErrors": {} } ``` </details> This change allows to naturally query all the documents in a sharded context. When `network.leader` is not present (in particular, when no `network` was defined), then the behavior is identical to previous versions. - **`useNetwork` picks local instance if it owns the shard** by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6287](https://github.com/meilisearch/meilisearch/pull/6287) To prevent unnecessary network activity, when deciding which remote to ask for a shard in a search over the network, Meilisearch will now always pick the local instance if it owns the shard. - **More efficient FST building** by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6279](https://github.com/meilisearch/meilisearch/pull/6279) It improves the construction of the word FST (word dictionary) by removing the need for a full scan of the word docids database. This should drastically improve the database's performance when inserting a large number of documents, even when inserting only a few. ##### 🪲 Bug fixes - Handle empty VERSION file as missing by [@&#8203;themavik](https://github.com/themavik) in [#&#8203;6275](https://github.com/meilisearch/meilisearch/pull/6275) ##### 🔩 Miscellaneous - Remap post processing targets for better benchmark readability by [@&#8203;ManyTheFish](https://github.com/ManyTheFish) in [#&#8203;6285](https://github.com/meilisearch/meilisearch/pull/6285) - Update the description of the get task's document payload route by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6284](https://github.com/meilisearch/meilisearch/pull/6284) #### New Contributors - [@&#8203;themavik](https://github.com/themavik) made their first contribution in [#&#8203;6275](https://github.com/meilisearch/meilisearch/pull/6275) ### [`v1.40.0`](https://github.com/meilisearch/meilisearch/releases/tag/v1.40.0): 🦈 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.39.0...v1.40.0) This release introduced support for the `distinct` attribute in federated search, enabling cross-index distinct attributes with facet distribution support. Additionally, significant performance improvements were delivered, including faster federated search (approximately 100ms faster), optimized JSON document generation for better handling of large documents and a much better memory usage for large workloads. ##### ✨ Enhancement - **Support `distinct` in federated search** by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6214](https://github.com/meilisearch/meilisearch/pull/6214) The `distinct` attribute can now be passed to the `federation` object in federated search to apply a global, cross-index and cross-remote distinct computation to the results. <details> <summary>Example of a federated search request with distinct</summary> ```json { "federation": { "distinct": "genres", // ✨ NEW "facetsByIndex": { // recovering facet distribution is also supported with distinct "comics": [ "genres" ], "movies": [ "genres" ] }, "mergeFacets": {} // merging facet distributions is also supported with distinct }, "queries": [ { "indexUid": "comics", "q": "batman", "attributesToRetrieve": ["title", "genres"], "useNetwork": true // distinct is also supported with network queries }, { "indexUid": "movies", "q": "superman", "attributesToRetrieve": ["title", "genres"], "useNetwork": true } ] } ``` </details> <details> <summary>Sample response to a federated search request with distinct</summary> ```json { "hits": [ { "title": "Batman", "genres": [ "Family", "Adventure", "Comedy", "Science Fiction", "Crime" ], "_federation": { "indexUid": "comics", "queriesPosition": 0, "weightedRankingScore": 1.0, "remote": "ms2" } }, { "title": "Batman", "genres": [ "Fantasy", "Action" ], "_federation": { "indexUid": "comics", "queriesPosition": 0, "weightedRankingScore": 1.0, "remote": "ms1" } }, { "title": "Batman & Bill", "genres": [ "Documentary" ], "_federation": { "indexUid": "comics", "queriesPosition": 0, "weightedRankingScore": 0.9848484848484848, "remote": "ms1" } }, { "title": "Superman: Red Son", "genres": [], "_federation": { "indexUid": "movies", "queriesPosition": 1, "weightedRankingScore": 0.9848484848484849, "remote": "ms0" } }, { "title": "Superman, Spider-Man or Batman", "genres": [ "Drama" ], "_federation": { "indexUid": "movies", "queriesPosition": 1, "weightedRankingScore": 0.9848484848484849, "remote": "ms0" } } ], "processingTimeMs": 15, "limit": 5, "offset": 0, "estimatedTotalHits": 11, "facetDistribution": { "genres": { "Action": 1, "Adventure": 1, "Comedy": 3, "Crime": 2, "Documentary": 1, "Drama": 1, "Family": 1, "Fantasy": 1, "Horror": 2, "Romance": 1, "Science Fiction": 1, "Thriller": 1, "Western": 1 } }, "facetStats": {}, "requestUid": "019d05c7-ea65-77a1-8274-22a8ba9e26db", "remoteErrors": {} } ``` </details> Note the following to apply the distinct attribute at the federation level: 1. Applying `distinct` at the query level at the same time as the federation level is disallowed and will return a HTTP 400 error. 2. The chosen distinct field will apply to all remotes and indexes, so it must be a filterable attribute for all participating remotes and indexes. 3. While Meilisearch attempts to compute the most accurate facet distribution, in distributed contexts this cannot be guaranteed as the distinct algorithm is not applied on all of the remote documents. - **Improve performance of federated search** by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6229](https://github.com/meilisearch/meilisearch/pull/6229) Improves performance of federated search: about 100ms faster for all requests. Improves reliability of the HTTP server: the server will no longer be blocked when too many federated search requests are being processed. - **Optimize the generation of JSON documents** by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6257](https://github.com/meilisearch/meilisearch/pull/6257) Addresses performance issues that users might encounter when requesting large documents. Additionally, performance is enhanced when users request only a small subset of fields from large documents. - **Use the latest version of mimalloc to improve memory usage** by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6201](https://github.com/meilisearch/meilisearch/pull/6201) Updates mimalloc from v2 to v3, improving memory sharing between threads and significantly reducing memory usage on large workloads. It also overrides the allocator to use mimalloc at linking time, allowing LMDB, Meilisearch, and other C libraries to share their allocations for better overall memory efficiency. [@&#8203;Kerollmops](https://github.com/Kerollmops) wrote [a blog post about the story behind this improvement](https://blog.kerollmops.com/the-good-the-bad-and-the-leaky-jemalloc-bumpalo-and-mimalloc-in-meilisearch). - **Add `POST /tasks/compact` for task queue compaction** by [@&#8203;YoEight](https://github.com/YoEight) in [#&#8203;6193](https://github.com/meilisearch/meilisearch/pull/6193) Compacts the task queue database and reclaim space so new tasks can keep being enqueued, without deleting existing tasks. This feature is behind the `taskQueueCompactionRoute` experimental feature flag. > \[!WARNING]\ > Once task queue compaction completes, all write operations are blocked until the server is restarted. ##### 🔐 Security - Bump rustls-webpki from 0.103.8 to 0.103.10 in [#&#8203;6273](https://github.com/meilisearch/meilisearch/pull/6273) - Bump tar from 0.4.44 to 0.4.45 in [#&#8203;6271](https://github.com/meilisearch/meilisearch/pull/6271) - Bump actix-web-lab from 0.24.3 to 0.26.0 in [#&#8203;6218](https://github.com/meilisearch/meilisearch/pull/6218) - Bump quinn-proto from 0.11.13 to 0.11.14 in [#&#8203;6217](https://github.com/meilisearch/meilisearch/pull/6217) ##### 🪲 Bug fixes - Check char boundaries when hiding secrets by [@&#8203;ManyTheFish](https://github.com/ManyTheFish) in [#&#8203;6262](https://github.com/meilisearch/meilisearch/pull/6262) - Network fixes by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6255](https://github.com/meilisearch/meilisearch/pull/6255) - Override "default" source base url with the config one to support AWS bedrock OpenAI API by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;5905](https://github.com/meilisearch/meilisearch/pull/5905) - Fix panic on virtiofs filesystem by [@&#8203;itsamine27](https://github.com/itsamine27) in [#&#8203;6261](https://github.com/meilisearch/meilisearch/pull/6261) ##### 🔩 Miscellaneous - Add `X-Accel-Buffering: no` for `/logs/stream` route by [@&#8203;YoEight](https://github.com/YoEight) in [#&#8203;6268](https://github.com/meilisearch/meilisearch/pull/6268) - Add link to documentation on `--experimental-allowed-ip-networks` parameter by [@&#8203;paulden](https://github.com/paulden) in [#&#8203;6263](https://github.com/meilisearch/meilisearch/pull/6263) - Update sysinfo version to `0.38.4` by [@&#8203;GuillaumeGomez](https://github.com/GuillaumeGomez) in [#&#8203;6211](https://github.com/meilisearch/meilisearch/pull/6211) - Add a no-agent [AGENTS.md](http://agents.md/) file to prevent excessive AI-generated PRs by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6256](https://github.com/meilisearch/meilisearch/pull/6256) #### New Contributors - [@&#8203;GuillaumeGomez](https://github.com/GuillaumeGomez) made their first contribution in [#&#8203;6211](https://github.com/meilisearch/meilisearch/pull/6211) - [@&#8203;itsamine27](https://github.com/itsamine27) made their first contribution in [#&#8203;6261](https://github.com/meilisearch/meilisearch/pull/6261) ### [`v1.39.0`](https://github.com/meilisearch/meilisearch/releases/tag/v1.39.0): 🐳​ [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.38.2...v1.39.0) ### What's Changed #### **✨ Enhancement** ##### 🔬 Cross-index document hydration Add a new `ForeignKeys` setting allowing to hydrate documents with documents coming from other indexes. > 📓 Note: This implementation doesn't support a remote sharding environment ##### `foreignKeys` experimental feature A new experimental feature, `foreignKeys`, has been added to the `/experimental-feature` route that must be set to true to activate the hydration. ``` curl -X PATCH 'http://127.0.0.1:7700/experimental-features' \ -H 'Content-Type: application/json' \ --data-binary '{"foreignKeys": true}' ``` ##### `foreignKeys` index setting A new index setting, `foreignKeys`, has been added to the `/indexes/{index_uid}/settings`: ```jsonc // new setting, an array of foreign keys that allows multiple foreign relationships between indexes "foreignKeys": [ { // the path in the JSON document containing foreign document ids "fieldName": "actors", // the UID of the foreign index containing the documents to fetch during hydration "foreignIndexUid": "actors" } ] ``` <details> <summary> ##### Example </summary> With this new feature, a document shaped as follows: ```jsonc { "id": 1, "title": "Forrest Gump", // Document IDs in foreign index "actors": [ 1 ] } ``` Will be hydrated as follows in a search response: ```jsonc { "id": 1, "title": "Forrest Gump", "actors": [ { "id": 1, "name": "Tom", "familyName": "Hanks", "birthDate": "1956-07-09" } ] } ``` </details> By [@&#8203;ManyTheFish](https://github.com/ManyTheFish) in [#&#8203;6047](https://github.com/meilisearch/meilisearch/issues/6047) ##### Disable proxy response buffering on Server-Sent Events (SSE) Add `X-Accel-Buffering: no` on `POST /chats/{workspace_uid}/chat/completions` when the streaming mode is activated. By **[@&#8203;YoEight](https://github.com/YoEight)** in [#&#8203;6228](https://github.com/meilisearch/meilisearch/pull/6228) #### 🪲 Bug fixes - Fix a memory leak in the indexation pipeline by **[@&#8203;Kerollmops](https://github.com/Kerollmops)** in [#&#8203;6212](https://github.com/meilisearch/meilisearch/pull/6212) We fixed an important memory leak caused by an invalid use of bumpalo. If you've seen Meilisearch using more and more memory over time, this issue is no longer visible in the latest version. If you want to read more about the bumpalo-trap we felt in, [here is a good summary](https://docs.rs/bumpalo/latest/bumpalo/#deallocation-en-masse-but-no-drop). It looks like this leak was introduced in v1.12, so approximately a year ago... - Avoid losing tasks by applying deltas on the wtxn view by **[@&#8203;Kerollmops](https://github.com/Kerollmops)** in [#&#8203;6222](https://github.com/meilisearch/meilisearch/pull/6222) We addressed a small performance regression introduced in v1.38.1 that affected sending updates to the engine during task deletion. We've restored the task deletion performance to match v1.38.0 levels and ensured no race conditions occur while still allowing updates during deletion. #### **🔩 Miscellaneous** - Ignore flaky test on windows by **[@&#8203;dureuill](https://github.com/dureuill)** in [#&#8203;6226](https://github.com/meilisearch/meilisearch/pull/6226) - Fix small documentation mistakes by **[@&#8203;ManyTheFish](https://github.com/ManyTheFish)** in [#&#8203;6205](https://github.com/meilisearch/meilisearch/pull/6205) - Improve messaging when field is missing in the settings indexing pipeline by **[@&#8203;Kerollmops](https://github.com/Kerollmops)** in [#&#8203;6213](https://github.com/meilisearch/meilisearch/pull/6213) **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.38.0...v1.39.0> ### [`v1.38.2`](https://github.com/meilisearch/meilisearch/releases/tag/v1.38.2): 🐍 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.38.1...v1.38.2) Meilisearch v1.38.2 fixes a regression introduced in Meilisearch v1.38.0 where Meilisearch could sometimes stop processing tasks after an automatic task queue cleanup performed while more tasks where being added. We recommend that all users in v1.38.0 and v1.38.1 migrate to v1.38.2. Note that the dumpless upgrade process can take up to one minute before the HTTP server becomes available when migrating from a previous v1.38 version. **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.38.1...v1.38.2> ### [`v1.38.1`](https://github.com/meilisearch/meilisearch/releases/tag/v1.38.1): 🐍 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.38.0...v1.38.1) Meilisearch v1.38.1 fixes a regression we have seen in task processing, which caused the engine to stop processing tasks. ##### 🪲 Bug fixes - Revert, optimize, and fix task deletion. By [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6219](https://github.com/meilisearch/meilisearch/pull/6219) **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.38.0...v1.38.1> ### [`v1.38.0`](https://github.com/meilisearch/meilisearch/releases/tag/v1.38.0): 🐍 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.37.0...v1.38.0) Meilisearch v1.38 drastically improves indexing performance for embeddings, cleans up the task queue of orphan tasks and batches, ensures they are correctly deleted now, fixes issues users may encounter with OpenAI or VoyageAI when generating embeddings, and improves the tooling for generating routes in the documentation. ##### **✨ Enhancement** - Embeddings: Use the latest version of hannoy with improved performances by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6184](https://github.com/meilisearch/meilisearch/pull/6184) We drastically reduced embedding indexing time by eliminating full database scans. It is more efficient to add a couple of embeddings to a large database now. - Tasks: Optimize and fix task deletion by [@&#8203;Mubelotix](https://github.com/Mubelotix) and [@&#8203;kerollmops](https://github.com/kerollmops) in [#&#8203;5828](https://github.com/meilisearch/meilisearch/pull/5828) ##### 🪲 Bug fixes - Embedders: Fix the intermittent `connection reset by peer` errors when embedding documents or search queries using a remote embedder. By [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6191](https://github.com/meilisearch/meilisearch/pull/6191) ##### 🔩 Miscellaneous - Enforce that routes appear in the reference documentation by [@&#8203;dureuill](https://github.com/dureuill) and [@&#8203;manythefish](https://github.com/manythefish) in [#&#8203;6200](https://github.com/meilisearch/meilisearch/pull/6200) [The reference API](https://www.meilisearch.com/docs/reference/api/) is now generated from the source code, but it used to miss some actix-declared routes. It is now mandatory to attach a route when using the newly-provided `routes::routes` and `routes::path` macros, which ensures the route is added to the reference. Please refer to the documentation of the individual macros and the many examples throughout the codebase for more details. - Chore: remove verbose debug log on list documents by [@&#8203;StephaneRob](https://github.com/StephaneRob) in [#&#8203;6198](https://github.com/meilisearch/meilisearch/pull/6198) - Add guide to [CONTRIBUTING.md](http://contributing.md/) to test doc locally by [@&#8203;curquiza](https://github.com/curquiza) in [#&#8203;6180](https://github.com/meilisearch/meilisearch/pull/6180) - Docs: capitalize LangChain and MCP in README by [@&#8203;24f1000637](https://github.com/24f1000637) in [#&#8203;6183](https://github.com/meilisearch/meilisearch/pull/6183) - Docs: improve documentation of the parameters of the search route by [@&#8203;curquiza](https://github.com/curquiza) in [#&#8203;6194](https://github.com/meilisearch/meilisearch/pull/6194) ##### New Contributors - [@&#8203;StephaneRob](https://github.com/StephaneRob) made their first contribution in [#&#8203;6198](https://github.com/meilisearch/meilisearch/pull/6198) - [@&#8203;24f1000637](https://github.com/24f1000637) made their first contribution in [#&#8203;6183](https://github.com/meilisearch/meilisearch/pull/6183) ### [`v1.37.0`](https://github.com/meilisearch/meilisearch/releases/tag/v1.37.0) [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.36.0...v1.37.0) > \[!IMPORTANT]\ > This release contains [**breaking changes**](#v137-replicated-sharding-breaking-changes) for users of the `network` experimental feature. Meilisearch v1.37 introduces [replicated sharding](#v137-replicated-sharding), removes the [`vectorStoreSetting` experimental feature](#v137-vector-store), stabilizes our new vector store for best performance, adds a [security fix](#v137-security) and [miscellaneous improvements](#v137-misc). ### ✨ Improvements #### <a id="v137-replicated-sharding" href="#v137-replicated-sharding">§</a> Replicated sharding > \[!NOTE] > Replicated sharding requires Meilisearch Enterprise Edition (EE). > > - Users of Meilisearch Cloud, please contact support if you need replicated sharding. > - Users of the Community Edition, please contact the sales if you want to use replicated sharding in production. ##### <a id="v137-replicated-sharding-breaking-changes" href="#v137-replicated-sharding-breaking-changes">§</a> Breaking changes - `network` objects sent to the `PATCH /network` route must now contain at least one `shard` object containing at least one remote when `leader` is not `null`. Existing databases will be migrated automatically when upgraded with `--experimental-dumpless-upgrade` when `leader` is not `null`, such that for each remote: 1. A shard with the same name as the remote is created 2. This shard has exactly one remote in its `remotes` list: the remote with the same name as the shard. This change will not cause any document to be resharded. To be able to upgrade without resharding, the migration uses the same name for remotes and for shards. However, in new configurations, we recommend using different names for shards and remotes. <details> <summary>Example of migration</summary> For instance, the following network object: ```jsonc { "leader": "ms-00", "self": "ms-01", "remotes": { "ms-00": { /* .. */ }, "ms-01": { /* .. */ } } } ``` is converted to: ```jsonc { "leader": "ms-00", "self": "ms-01", "remotes": { "ms-00": { /* .. */ }, "ms-01": { /* .. */ } }, "shards": { // ✨ NEW "ms-00": { // shard named like the remote "remotes": ["ms-00"] // is owned by the remote }, "ms-01": { "remotes": ["ms-01"] } } } ``` </details> ##### Addition of `network.shards` The `network` object for routes `PATCH /network` and `GET /network` now contains the new field `shards`, which is an object whose values are `shard` objects, and keys the name of each shard. Each `shard` object contains a single field `remotes`, which is an array of strings, each string representing the name of an existing remote. ##### Convenience fields The `shard` objects in `PATCH /network` contain the additional fields `addRemotes` and `removeRemotes` meant for convenience: - pass an array of remote names to `shard.addRemotes` to add these remotes to the list of remotes of a shard. - pass an array of remote names to `shard.removeRemotes` to remove these remotes from the list of remotes of a shard. - if present and non-`null`, `shard.remotes` will completely override the existing list of remotes for a shard. - if several of these options are present and non-`null`, then the order of application is `shard.remotes`, then `shard.addRemotes`, then `shard.removeShards`. <details> <summary>Adding a new shard with some remotes</summary> ```jsonc // PATCH /network { // assuming that remotes `ms-0`, `ms-1`, `ms-2` where sent in a previous call to PATCH /network "shards": { "s-a": { // new shard "remotes": ["ms-0", "ms-1"] } } } ``` Remotes `ms-0` and `ms-1` own the new shard `s-a`. </details> <details> <summary>Fully overriding the list of remotes owning a shard</summary> ```jsonc // PATCH /network { // assuming remotes `ms-0`, `ms-1`, `ms-2` // assuming shard `s-a`, owned by `ms-0` and `ms-1` "shards": { "s-a": { "remotes": ["ms-2"] } } } ``` `ms-2` is now the sole owner of `s-a`, replacing `ms-0` and `ms-1`. </details> <details> <summary>Adding a remote without overriding the list of remotes owning a shard</summary> ```jsonc // PATCH /network { // assuming remotes `ms-0`, `ms-1`, `ms-2` // assuming shard `s-a`, owned by `ms-2` "shards": { "s-a": { "addRemotes": ["ms-0"] } } } ``` `ms-0` and `ms-2` are now the owners of `s-a`. </details> <details> <summary>Removing a remote without overriding the list of remotes owning a shard</summary> ```jsonc // PATCH /network { // assuming remotes `ms-0`, `ms-1`, `ms-2` // assuming shard `s-a`, owned by `ms-0` and `ms-2` "shards": { "s-a": { "removeRemotes": ["ms-2"] } } } ``` `ms-0` is now the sole owner of `s-a`. </details> <details> <summary>Entirely removing a shard from the list of shards</summary> Set the shard to `null`: ```jsonc // PATCH /network { "shards": { "s-a": null } } ``` Or set its `remotes` list to the empty list: ```jsonc // PATCH /network { "shards": { "s-a": { "remotes": [] } } } ``` </details> ##### `network.shards` validity When `network.leader` is not `null`, each `shard` object in `network.shards` must: 1. Only contain `remotes` that exist in the list of `remotes`. 2. Contain at least one remote. Additionally, `network.shards` must contain at least one shard. Failure to meet any of these conditions will cause the `PATCH /network` route to respond with `400 invalid_network_shards`. ##### Change in sharding logic Documents are now sharded according to the list of shards declared in the network rather than the list of remotes. All remotes owning a shard will process the documents that belong to this shard, allowing for replication. <details> <summary>Example of replication</summary> The following configuration defines 3 remotes `0`, `1` and `2`, and 3 shards `A`, `B`, `C`, such that each remote owns two shards, achieving replication (losing one remote does not lose any document). ```jsonc { "leader": "0", "self": "0", "remotes": { "0": { /* .. */ }, "1": { /* .. */ }, "2": { /* .. */ } }, "shards": { "A": { "remotes": ["0", "1"] }, "B": { "remotes": ["1", "2"] }, "C": { "remotes": ["2", "0"] } } } ``` </details> - Full replication is supported by having all remotes own all the shards. - Unbalanced replication is supported by having some remotes own more shards than other remotes. - "Watcher" remotes are supported by having remotes that own no shards. Watcher remotes are not very useful in this release, and might be upgraded in a future release, so that they keep all documents without indexing them, allowing to "respawn" shards for other remotes. ##### `useNetwork` takes `network.shards` into account When `useNetwork: true` is passed to a search query, it is expanded to multiple queries such that each shard declared in `network.shards` appears exactly once, associated with a remote that owns that shard. This ensures that there is no missing or duplicate documents in the results. ##### `_shard` filters When the `network` experimental feature is enabled, then it becomes possible to filter documents depending on the shard they belong to. Given `s-a` and `s-b` the names of two shards declared in `network.shards`, then: - `_shard = "s-a"` in a `filter` parameter to the search or documents fetch will return the documents that belong to `s-a`. - `_shard != "s-a"` will return the documents that do **not** belong to `s-a` - `_shard IN ["s-a", "s-b"]` will return the documents that belong to `s-a` or to `s-b`. You can use these new filters in manual remote federated search to create a partitioning over all shards in the network. > \[!IMPORTANT] > To avoid duplicate or missing documents in results, for manually crafted remote federated search requests, all shards should appear in **exactly one** query. > \[!TIP] > Search requests built with `useNetwork: true` already build a correct partitioning over shards. They should be preferred to manually crafted remote federated search requests in replicated sharding scenarios. ##### Update instructions When updating your Meilisearch network using dumpless upgrade, please observe the following guidelines: 1. Do not call the `PATCH /network` route until all remotes of the network are finished updating 2. If using the search routes with `useNetwork: true`, call them on un-updated remotes. Calling it on already updated remotes will cause un-updated remotes to fail the search as they don't know about the `_shard` filters. By [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6128](https://github.com/meilisearch/meilisearch/pull/6128) #### <a id="v137-vector-store" href="#v137-vector-store">§</a> Remove `vectorStoreSetting` experimental feature The new HNSW vector store ([hannoy](https://github.com/nnethercott/hannoy)) has been stabilized and is now the only supported vector store in Meilisearch. As a result, updating to v1.37.0 will migrate all remaining legacy vector store indexes (using arroy) to hannoy, and the [`vectorStoreSetting` experimental feature](https://github.com/orgs/meilisearch/discussions/860) is no longer available. By [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6176](https://github.com/meilisearch/meilisearch/pull/6176) #### Improve indexing performance for embeddings We removed a computationally expensive step from vector indexing. On a DB with 20M documents, this removes 300s per indexing batch of 1100s. By [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6175](https://github.com/meilisearch/meilisearch/pull/6175) #### <a id="v137-security" href="#v137-security">§</a> 🔒 Security - Bump mini-dashboard (local web interface) which - now stores API key in RAM instead of in the `localStorage` - bumps dependencies with potential security vulnerabilities By [@&#8203;Strift](https://github.com/Strift) and [@&#8203;curquiza](https://github.com/curquiza) in [#&#8203;6186](https://github.com/meilisearch/meilisearch/pull/6186) and [#&#8203;6172](https://github.com/meilisearch/meilisearch/pull/6172) #### <a id="v137-misc" href="#v137-misc">§</a> 🔩 Miscellaneous - Mark Cargo.lock as not linguist-generated by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6181](https://github.com/meilisearch/meilisearch/pull/6181) **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.36.0...v1.37.0> ### [`v1.36.0`](https://github.com/meilisearch/meilisearch/releases/tag/v1.36.0): 🐙 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.35.1...v1.36.0) Version v1.36.0 introduces an exciting update to the ranking rules to improve the engine's relevance. It's actually the first time we've made such a change since v1.0, and we're really happy about this improvement! ##### ✨ Enhancement - Introduce the `attributeRank` and `wordPosition` criteria by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6154](https://github.com/meilisearch/meilisearch/pull/6154), [#&#8203;6155](https://github.com/meilisearch/meilisearch/pull/6155), and [#&#8203;6164](https://github.com/meilisearch/meilisearch/pull/6164) We released two new ranking rules that Meilisearch had already been using internally for the `attribute` one, which is basically both ranking rules applied one after the other: - `attributeRank`: A document is considered better if the query words match in a higher searchable attribute. It ignores the position of the query words in this attribute. - `wordPosition`: A document is considered better if the query words match closer to the beginning of an attribute. The attribute rank is ignored by this rule. - We continue our policy of migrating everyone to use a homemade HNSW by introducing a new dumpless upgrade step that migrates index uses the old annoy vector store to the new Hannoy one. Changing the vector store backend affects the ranking score. This step can take a couple of minutes when the number of embeddings is high, and we recommend changing the vector store backend beforehand to gain more control if needed. To do so, you must enable the `vectorStoreSetting` experimental feature and set the `vectorStore` root setting to `experimental`. ##### 🪲 Bug fixes - Fix search failing when using `attributesToSearchOn` on an empty index by [@&#8203;zen-zap](https://github.com/zen-zap) in [#&#8203;5944](https://github.com/meilisearch/meilisearch/pull/5944) ##### 🔒 Security - Bump bytes from 1.11.0 to 1.11.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;6142](https://github.com/meilisearch/meilisearch/pull/6142) - Bump jsonwebtoken from 9.3.1 to 10.3.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;6141](https://github.com/meilisearch/meilisearch/pull/6141) - Bump time from 0.3.44 to 0.3.47 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;6144](https://github.com/meilisearch/meilisearch/pull/6144) - Bump rsa from 0.9.9 to 0.9.10 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;6149](https://github.com/meilisearch/meilisearch/pull/6149) ##### 🔩 Miscellaneous - Improve OpenAPI docs and CIs to improve documentation experience by [@&#8203;curquiza](https://github.com/curquiza) in [#&#8203;6145](https://github.com/meilisearch/meilisearch/pull/6145) > \[!WARNING] > Breaking change: the `meilisearch-openapi-mintlify.json` file will not be available in the release assets anymore. If you were using it, please refer to the one that is now available [in our public documentation repository](https://github.com/meilisearch/documentation/blob/main/assets/open-api/meilisearch-openapi-mintlify.json). - GenAI contributing and PR template changes by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6140](https://github.com/meilisearch/meilisearch/pull/6140) - Fix "test with almost all features" by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6139](https://github.com/meilisearch/meilisearch/pull/6139) and [#&#8203;6148](https://github.com/meilisearch/meilisearch/pull/6148) - Allow any IP for SDK tests by [@&#8203;Strift](https://github.com/Strift) in [#&#8203;6151](https://github.com/meilisearch/meilisearch/pull/6151) - Improve output of the declarative tests, also in [#&#8203;6164](https://github.com/meilisearch/meilisearch/pull/6164) ❤️ Thanks to [@&#8203;zen-zap](https://github.com/zen-zap) for contributing to this release! ### [`v1.35.1`](https://github.com/meilisearch/meilisearch/releases/tag/v1.35.1) [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.35.0...v1.35.1) ### 🦋 Bug fixes Meilisearch v1.35.1 fixes a possible task database corruption issue that would occur when using the S3 streaming snapshot method. - Users of the Community Edition do not need to upgrade as this feature is Enterprise Edition only - Affected users of the Cloud have been contacted. #### Details While snapshotting the task database, sending a task to Meilisearch could corrupt it. Index DBs were not affected, so manually rebuilding the task database fixes the corruption. By [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6160](https://github.com/meilisearch/meilisearch/issues/6160) **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.35.0...v1.35.1> ### [`v1.35.0`](https://github.com/meilisearch/meilisearch/releases/tag/v1.35.0) [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.34.3...v1.35.0) Meilisearch v1.35.0 contains improvements to the observability of the search performance, a breaking change to the recently introduced `POST /indexes/<index_uid>/fields` route, and other bugfixes and improvements. ### 🌈 Improvements #### Observe the search performance The search routes accept a new field named `showPerformanceDetails`. When set to `true`, the search response contains a performance trace, allowing the user to better understand what takes time during a search query. **impacted routes:** - `POST /indexes/<index_uid>/search` - `GET /indexes/<index_uid>/search` - `POST /multi-search` - `POST /indexes/<index_uid>/similar` - `GET /indexes/<index_uid>/similar` ##### Search routes: `POST /indexes/<index_uid>/search` and `GET /indexes/<index_uid>/search` ##### Request new request parameters: - `showPerformanceDetails`: `true`/`false` (boolean) <details> <summary>example</summary> ```jsonc { "q": "glass", "showPerformanceDetails": true } ``` </details> ##### Response new response field: - `performanceDetails`: `{"<span>": "<human_duration>", .. }` (map) <details> <summary>example</summary> ```jsonc { "hits": [ // hits .. ], "query": "glass", "processingTimeMs": 5, "limit": 20, "offset": 0, "estimatedTotalHits": 1, "requestUid": "<uuid>", "performanceDetails": { "wait for permit": "295.29µs", "search > tokenize": "436.67µs", "search > resolve universe": "649.00µs", "search > keyword search": "515.71µs", "search > format": "288.54µs", "search": "3.56ms" } } ``` </details> ##### Multi-search route: `POST /multi-search` ##### Request new request parameters: - `queries.showPerformanceDetails`: `true`/`false` (boolean) <details> <summary>example</summary> ```jsonc "queries": [ { "indexUid": "<index_uid>", "q": "glass", "showPerformanceDetails": true } ] ``` </details> ##### Response new response field: - `results.performanceDetails`: `{"<span>": "<human_duration>", .. }` (map) <details> <summary>example</summary> ```jsonc { "results": [ { "indexUid": "<index_uid>", "hits": [ // hits .. ], "query": "glass", "processingTimeMs": 5, "limit": 20, "offset": 0, "estimatedTotalHits": 1, "requestUid": "<uuid>", "performanceDetails": { "wait for permit": "295.29µs", "search > tokenize": "436.67µs", "search > resolve universe": "649.00µs", "search > keyword search": "515.71µs", "search > format": "288.54µs", "search": "3.56ms" } } ] } ``` </details> ##### Federated Search route: `POST /multi-search` ##### Request new request parameters: - `federation.showPerformanceDetails`: `true`/`false` (boolean) <details> <summary>example</summary> ```jsonc { "federation": { "showPerformanceDetails": true }, "queries": [ { "indexUid": "<index_uid>", "q": "glass" } ] } ``` </details> ##### Response new response field: - `performanceDetails`: `{"<span>": "<human_duration>", .. }` (map) <details> <summary>example</summary> ```jsonc { "hits": [ // hits .. ], "query": "glass", "processingTimeMs": 5, "limit": 20, "offset": 0, "estimatedTotalHits": 1, "requestUid": "<uuid>", "performanceDetails": { "wait for permit": "213.83µs", "search > tokenize": "171.67µs", "search > resolve universe": "257.63µs", "search > keyword search": "577.71µs", "search > format": "114.96µs", "search > federation > wait for remote results": "62.71µs", "search > federation > merge results": "120.04µs", "search > federation > merge facets": "53.42µs", "search > federation": "237.04µs", "search": "289.08ms" } } ``` </details> ##### Similar routes: `POST /indexes/<index_uid>/similar` and `GET /indexes/<index_uid>/similar` ##### Request new request parameters: - `showPerformanceDetails`: `true`/`false` (boolean) <details> <summary>example</summary> ```jsonc { "id": 143, "embedder": "manual", "showPerformanceDetails": true } ``` </details> ##### Response new response field: - `performanceDetails`: `{"<span>": "<human_duration>", .. }` (map) <details> <summary>example</summary> ```jsonc { "hits": [ // hits .. ], "id": "143", "processingTimeMs": "[duration]", "limit": 20, "offset": 0, "estimatedTotalHits": 4, "performanceDetails": { "search > format": "244.92µs", "search": "1.25ms" } } ``` </details> By [@&#8203;ManyTheFish](https://github.com/ManyTheFish) in [#&#8203;6132](https://github.com/meilisearch/meilisearch/pull/6132) #### Stabilize multithreaded post-processing of facets and prefixes Multithreaded post-processing of facets and prefixes speeds-up indexing on multi-core machines. Before v1.35.0, it could be disabled with an [experimental feature](https://github.com/orgs/meilisearch/discussions/862). Meilisearch v1.35.0 removes that experimental feature, resulting in the multithreaded post-processing being always enabled. Cloud users upgrading to v1.35.0 will benefit from the speed-up. By [@&#8203;ManyTheFish](https://github.com/ManyTheFish) in [#&#8203;6130](https://github.com/meilisearch/meilisearch/pull/6130) ### 🦋 Fixes #### Breaking change: return pagination fields in `POST /indexes/<index_uid>/fields` route > \[!WARNING] > **Breaking change**: The `POST /indexes/<index_uid>/fields` route now returns an object containing the `results`, `offset`, `limit`, and `total` fields instead of returning an array of results. This change allows to know how many fields match a given filter <details> <summary>Example: before/after</summary> Before: ```jsonc [ // fields .. ] ``` After: ```jsonc { "results": [ // [fields .. ] ], "offset": 0, "limit": 20, "total": 0 } ``` </details> By [@&#8203;ManyTheFish](https://github.com/ManyTheFish) in [#&#8203;6126](https://github.com/meilisearch/meilisearch/pull/6126) #### `POST /indexes/<index_uid>/fields`: Fix pattern filtering when a parent field was matching a child pattern: `title` was matching the pattern `title.to*`. <details> <summary>Example: before/after</summary> For the following request: ```jsonc { "filter": { "attributePatterns": [ "title.en" ] } } ``` Before Response, `title` field is returned: ```jsonc { "results": [ { "name": "title", //metadata... }, ], "offset": 0, "limit": 20, "total": 1 } ``` After Response, nothing returned: ```jsonc { "results": [], "offset": 0, "limit": 20, "total": 0 } ``` </details> By [@&#8203;ManyTheFish](https://github.com/ManyTheFish), also in [#&#8203;6126](https://github.com/meilisearch/meilisearch/pull/6126) #### 🐛 Other fixes - Bump mini-dashboard version to fix display of image in local UI interface by [@&#8203;Strift](https://github.com/Strift) in [#&#8203;6129](https://github.com/meilisearch/meilisearch/pull/6129) - Fix mTLS compatibility with Go by [@&#8203;curquiza](https://github.com/curquiza) in [#&#8203;6133](https://github.com/meilisearch/meilisearch/pull/6133) ### 🔩 Miscellaneous - Add AI usage disclosure guidelines to CONTRIBUTING.md by [@&#8203;meili-bot](https://github.com/meili-bot) in [#&#8203;6114](https://github.com/meilisearch/meilisearch/pull/6114) - Expose SettingsDelta and related types for external crate usage by [@&#8203;MkDev11](https://github.com/MkDev11) in [#&#8203;6119](https://github.com/meilisearch/meilisearch/pull/6119) #### New Contributors - [@&#8203;MkDev11](https://github.com/MkDev11) made their first contribution in [#&#8203;6119](https://github.com/meilisearch/meilisearch/pull/6119) ❤️ **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.34.3...v1.35.0> ### [`v1.34.3`](https://github.com/meilisearch/meilisearch/releases/tag/v1.34.3) [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.34.2...v1.34.3) #### 🐛 Bug Fixes - Increase the auth store database size to 2 GiB so that we can index more keys by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6134](https://github.com/meilisearch/meilisearch/pull/6134) **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.34.2...v1.34.3> ### [`v1.34.2`](https://github.com/meilisearch/meilisearch/releases/tag/v1.34.2) [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.34.1...v1.34.2) This patch fixes an accidental breaking change in v1.34.1 where Meilisearch would not start with a configuration file if `experimental_allowed_ip_networks` was not defined. - Meilisearch Cloud users do not need to update as they were not affected by this regression - We recommend that OSS users upgrade to v1.34.2 **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.34.1...v1.34.2> ### [`v1.34.1`](https://github.com/meilisearch/meilisearch/releases/tag/v1.34.1) [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.34.0...v1.34.1) In Meilisearch v1.34.1, we released a security fix that affect web queries initiated by Meilisearch. ### 🔐 Security - Cloud users: no action is needed. We found no evidence of exploitation on Meilisearch Cloud and the Cloud is protected at the infrastructure level. - Open-source users: if you allow untrusted users to configure webhooks, embedders or network of machines, we recommend you update to Meilisearch v1.34.1 In Meilisearch versions v1.8 to v1.34.0, a user with an API key with *write permissions* to the configuration of the Meilisearch instance could set up Meilisearch to send POST or GET requests to domains and IPs local to the private network of the Meilisearch instance, effectively bypassing the firewall. The vulnerability has not yet been assigned a CVE number; it has CVE Request [`1975471`](https://github.com/meilisearch/meilisearch/commit/1975471) for CVE ID. Meilisearch v1.34.1 fixes the vulnerability by forbidding Meilisearch from making any requests to a host resolving to a non-global IP, in the sense of the [IANA IPv4 Special-Purpose Address Registry](https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml) or the [IANA IPv6 Special-Purpose Address Registry](https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml). If you need this functionality in your Meilisearch instance, you can set private IP networks as allowed with the `--experimental-allowed-ip-networks` parameter after reviewing the security implications. **This is a breaking change**, which is allowed for security reasons. #### Allowing non-global IP networks The `--experimental-allowed-ip-networks` CLI flag and the `MEILI_EXPERIMENTAL_ALLOWED_IP_NETWORKS` environment variable control the behavior of Meilisearch with regards to non-global IP networks, with the CLI flag taking precedence over the environment variable when both are specified. - When missing, the default is to reject all web requests resolving to a non-global IP. - When set to a comma-separated list of CIDR-formatted networks (e.g. `192.168.0.0/16,10.0.0.0`), then web requests to the networks from the list will be permitted. Web requests to the non-global IPs not part of the list will still be rejected. - When set to `any`, all web requests will be permitted regardless of the target IP, similar to the behavior of Meilisearch v1.34.0 and lower. Use this option when you control both the machine and the configuration of the deployed Meilisearch instance. #### Acknowledgments Thanks to Gabriel Rodrigues (aka Texugo), for reporting this vulnerability and for helping us improve the security of Meilisearch. ### [`v1.34.0`](https://github.com/meilisearch/meilisearch/releases/tag/v1.34.0) [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.33.1...v1.34.0) ### 🌈 Improvements #### Easy search over your network of machines ##### `useNetwork` field in `POST /indexes/{:indexUid}/search` The search query object passed in the body of `POST /indexes/{:indexUid}/search` now accepts an optional boolean `useNetwork`. When present and set to `true`, the search is executed "as-if" it was a remote federated search over all remotes in the network. That is, the following: <details> <summary>Search request</summary> ```jsonc // POST /indexes/movies/search { "q": "Batman dark knight returns 1", "filter": "genres IN [Action, Adventure]", "facets": ["genres"], "useNetwork": true, // ✨ NEW "limit": 5 } ``` </details> Is executed by Meilisearch as if it was the following, assuming a network of 3 Meilisearch instances with names `"0", "1" and "2"`: <details> <summary>Equivalent multi-search request</summary> ```jsonc // POST /multi-search { "federation": { "limit": 5, "facetsByIndex": { "movies": [ "genres" ] }, "merge": {} }, "queries": [ { "indexUid": "movies", "federationOptions": { "remote": "0" }, "q": "Batman dark knight returns 1", "filter": "genres IN [Action, Adventure]" }, { "indexUid": "movies", "federationOptions": { "remote": "1" }, "q": "Batman dark knight returns 1", "filter": "genres IN [Action, Adventure]" }, { "indexUid": "movies", "federationOptions": { "remote": "2" }, "q": "Batman dark knight returns 1", "filter": "genres IN [Action, Adventure]" } ] } ``` </details> Resulting in: <details> <summary>Search Response</summary> ```jsonc { "hits": [ { "id": 123025, "title": "Batman: The Dark Knight Returns, Part 1", "overview": "Batman has not been seen for ten years. A new breed of criminal ravages Gotham City, forcing 55-year-old Bruce Wayne back into the cape and cowl. But, does he still have what it takes to fight crime in a new era?", "genres": [ "Action", "Animation", "Mystery" ], "poster": "https://image.tmdb.org/t/p/w500/kkjTbwV1Xnj8wBL52PjOcXzTbnb.jpg", "release_date": 1345507200, "_federation": { "indexUid": "mieli", "queriesPosition": 2, "weightedRankingScore": 0.9894586894586894, "remote": "2" } }, { "id": 142061, "title": "Batman: The Dark Knight Returns, Part 2", "overview": "Batman has stopped the reign of terror that The Mutants had cast upon his city. Now an old foe wants a reunion and the government wants The Man of Steel to put a stop to Batman.", "genres": [ "Action", "Animation", "Mystery" ], "poster": "https://image.tmdb.org/t/p/w500/arEZYd6uMOFTILne9Ux0A8qctMe.jpg", "release_date": 1357171200, "_federation": { "indexUid": "mieli", "queriesPosition": 1, "weightedRankingScore": 0.9894558963186414, "remote": "1" } }, { "id": 16234, "title": "Batman Beyond: Return of the Joker", "overview": "The Joker is back with a vengeance, and Gotham's newest Dark Knight needs answers as he stands alone to face Gotham's most infamous Clown Prince of Crime.", "genres": [ "Animation", "Family", "Action", "Science Fiction" ], "poster": "https://image.tmdb.org/t/p/w500/7RlBs0An83fqAuKfwH5gKMcqgMc.jpg", "release_date": 976579200, "_federation": { "indexUid": "mieli", "queriesPosition": 1, "weightedRankingScore": 0.9427964918160996, "remote": "1" } }, { "id": 155, "title": "The Dark Knight", "overview": "Batman raises the stakes in his war on crime. With the help of Lt. Jim Gordon and District Attorney Harvey Dent, Batman sets out to dismantle the remaining criminal organizations that plague the streets. The partnership proves to be effective, but they soon find themselves prey to a reign of chaos unleashed by a rising criminal mastermind known to the terrified citizens of Gotham as the Joker.", "genres": [ "Drama", "Action", "Crime", "Thriller" ], "poster": "https://image.tmdb.org/t/p/w500/qJ2tW6WMUDux911r6m7haRef0WH.jpg", "release_date": 1216166400, "_federation": { "indexUid": "mieli", "queriesPosition": 1, "weightedRankingScore": 0.5784178187403994, "remote": "1" } }, { "id": 49026, "title": "The Dark Knight Rises", "overview": "Following the death of District Attorney Harvey Dent, Batman assumes responsibility for Dent's crimes to protect the late attorney's reputation and is subsequently hunted by the Gotham City Police Department. Eight years later, Batman encounters the mysterious Selina Kyle and the villainous Bane, a new terrorist leader who overwhelms Gotham's finest. The Dark Knight resurfaces to protect a city that has branded him an enemy.", "genres": [ "Action", "Crime", "Drama", "Thriller" ], "poster": "https://image.tmdb.org/t/p/w500/vzvKcPQ4o7TjWeGIn0aGC9FeVNu.jpg", "release_date": 1342396800, "_federation": { "indexUid": "mieli", "queriesPosition": 2, "weightedRankingScore": 0.5772657450076805, "remote": "2" } } ], "query": "Batman dark knight returns 1", "processingTimeMs": 173, "limit": 5, "offset": 0, "estimatedTotalHits": 47, "facetDistribution": { "genres": { "Action": 46, "Adventure": 15, "Animation": 34, "Comedy": 3, "Crime": 14, "Drama": 6, "Family": 15, "Fantasy": 8, "Horror": 1, "Mystery": 4, "Romance": 1, "Science Fiction": 14, "TV Movie": 4, "Thriller": 4, "Western": 1 } }, "facetStats": {}, "requestUid": "019bbcf4-a609-7701-8d82-d370611adfb3", "remoteErrors": {} } ``` </details> `useNetwork` requires the `network` experimental feature to be enabled. ##### `useNetwork` query parameter in `GET /indexes/{:indexUid}/search` Passing `useNetwork=true` as a query parameter to `GET /indexes/{:indexUid}/search` has the same effect as passing `useNetwork: true` as a field parameter to `POST /indexes/{:indexUid}/search` ##### `.queries[].useNetwork` field in `POST /multi-search` - `useNetwork` can also be passed as a field of the individual queries inside of a `multi-search` request. - When used on a query in a non-federated search request, it has the same effect as on `POST /indexes/{:indexUid}/search` for that query - When used on a query in a federated search request, the request is executed "as-if" one query per remote of the network had been performed. Federated search example: <details> <summary>Multi-search request</summary> ```jsonc { "federation": { "limit": 5 }, "queries": [ { "q": "Batman returns", "indexUid": "mieli", "useNetwork": true }, { "q": "Superman returns", "indexUid": "mieli", "useNetwork": true } ] } ``` </details> <details> <summary>Multi-search response</summary> ```json { "hits": [ { "id": 364, "title": "Batman Returns", "overview": "While Batman deals with a deformed man calling himself the Penguin, an employee of a corrupt businessman transforms into the Catwoman.", "genres": [ "Action", "Fantasy" ], "poster": "https://image.tmdb.org/t/p/w500/jKBjeXM7iBBV9UkUcOXx3m7FSHY.jpg", "release_date": 708912000, "_federation": { "indexUid": "mieli", "queriesPosition": 0, "weightedRankingScore": 1.0, "remote": "1" } }, { "id": 1452, "title": "Superman Returns", "overview": "Superman returns to discover his 5-year absence has allowed Lex Luthor to walk free, and that those he was closest to felt abandoned and have moved on. Luthor plots his ultimate revenge that could see millions killed and change the face of the planet forever, as well as ridding himself of the Man of Steel.", "genres": [ "Science Fiction", "Action", "Adventure" ], "poster": "https://image.tmdb.org/t/p/w500/qIegbn6DSUYmggfwxOBNOVS35q.jpg", "release_date": 1151452800, "_federation": { "indexUid": "mieli", "queriesPosition": 1, "weightedRankingScore": 1.0, "remote": "0" } }, { "id": 324249, "title": "Requiem for Krypton: Making 'Superman Returns'", "overview": "A detailed behind-the-scenes documentary on the making of Superman Returns.", "genres": [ "Documentary" ], "poster": "https://image.tmdb.org/t/p/w500/eC1XKswKSoyDyJXXZszLTuwUHli.jpg", "release_date": 1164672000, "_federation": { "indexUid": "mieli", "queriesPosition": 1, "weightedRankingScore": 0.9907407407407408, "remote": "1" } }, { "id": 294294, "title": "Saltwater", "overview": "This American Indie drama follows several endearing characters as they wade through life seeking happiness, peace and ultimately, love. Will (Ronnie Kerr, Vampire Boys 2, Shut Up and Kiss Me) leaves the Navy after many years, soon reunites old friends and begins to start his new civilian life. His friend Rich (Bruce L Hart) tries to set him up with ruggedly handsome Josh (Ian Roberts-a former Australian professional rugby player, actor and model-Cedar Boys, Superman Returns, Little Fish). While there is immense chemistry between the two, timing and certain ideals never seem to align. When a shocking tragedy happens the two are paired up to pick up the pieces and sort through the after effects. Saltwater is a story about men of all ages, finding love, losing friends, navigating their way through life and knowing it's the journey rather then the destination that's important.", "genres": [ "Romance", "Drama" ], "poster": "https://image.tmdb.org/t/p/w500/bDnLdYqpH9abHo4ASMPKiInx8dm.jpg", "release_date": 1342310400, "_federation": { "indexUid": "mieli", "queriesPosition": 1, "weightedRankingScore": 0.966931216931217, "remote": "1" } }, { "id": 142061, "title": "Batman: The Dark Knight Returns, Part 2", "overview": "Batman has stopped the reign of terror that The Mutants had cast upon his city. Now an old foe wants a reunion and the government wants The Man of Steel to put a stop to Batman.", "genres": [ "Action", "Animation", "Mystery" ], "poster": "https://image.tmdb.org/t/p/w500/arEZYd6uMOFTILne9Ux0A8qctMe.jpg", "release_date": 1357171200, "_federation": { "indexUid": "mieli", "queriesPosition": 0, "weightedRankingScore": 0.8697089947089947, "remote": "1" } } ], "processingTimeMs": 247, "limit": 5, "offset": 0, "estimatedTotalHits": 97, "requestUid": "019bbd3a-5106-70e0-94fc-f58b2f0c28c8", "remoteErrors": {} } ``` </details> ##### Limitations - Facet search referencing `useNetwork` are not supported - The chat route cannot use `useNetwork` at the moment: doing so is not trivial implementation-wise, because chat route expects to be able to open the index (to fetch chat configs), but federated search only opens the indexes once during a short critical section. By [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6101](https://github.com/meilisearch/meilisearch/pull/6101) #### Federated search supports `page` and `hitsPerPage` Pass `federation.page` and `federation.hitsPerPage` with the same meaning as in a regular search request to use [exhaustive pagination](https://www.meilisearch.com/docs/reference/api/search#page) in the federated search By [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6101](https://github.com/meilisearch/meilisearch/pull/6101) #### Speed up settings changes when removing searchable The settings indexer is more efficient when users are removing searchable attributes from the searchable fields. By [@&#8203;VedantMadane](https://github.com/VedantMadane) in [#&#8203;6109](https://github.com/meilisearch/meilisearch/pull/6109) ### 🔒 Security Solves a low-severity timing attack vulnerability on key comparison by using constant-time comparison By [@&#8203;curquiza](https://github.com/curquiza) in [#&#8203;6077](https://github.com/meilisearch/meilisearch/pull/6077) ### 🔩 Maintenance #### Remove some unwanted dependencies - Remove openssl from deps by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6117](https://github.com/meilisearch/meilisearch/pull/6117) - Fix geo-types version to avoid multiple rstar deps by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6118](https://github.com/meilisearch/meilisearch/pull/6118) ### New Contributors :heart: Thanks again [@&#8203;VedantMadane](https://github.com/VedantMadane) for the contribution to this release! **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.33.1...v1.34.0> ### [`v1.33.1`](https://github.com/meilisearch/meilisearch/releases/tag/v1.33.1): 🐞 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.33.0...v1.33.1) In Meilisearch v1.33.1, we released a security fix that affected the dump import, improvements to vector store relevance in massive databases, and a fix related to ranking scores. ##### 🔐 Security Fix - Cloud users: you don't need to do anything. We found no evidence of exploitation of this vulnerability on Meilisearch Cloud. - Open-source users: if you allow importing dumps from an untrusted source, we recommend you update to v1.33.1 All versions of Meilisearch before v1.33.0 are vulnerable to a path traversal vulnerability involving the dump import functionality. Importing a specially crafted dump could result in giving access to the Meilisearch instance to arbitrary, specifically formatted files, present on the file system of the Meilisearch instance. ##### ✨ Enhancements - We updated the vector store to trigger linear scanning even on bigger databases, leading to improved performance and so better result quality when the search cutoff is reached. This applies in particular when the number of filtered candidates is small relative to the number of documents in the index by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6113](https://github.com/meilisearch/meilisearch/pull/6113). ##### 🐛 Bug Fixes - We fixed a bug where only the first non-blocking buckets were taken for the non-final ranking rules. This improves the quality of search results when the search cutoff triggers, especially when vector search and a sort are involved by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6113](https://github.com/meilisearch/meilisearch/pull/6113). **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.33.0...v1.33.1> ### [`v1.33.0`](https://github.com/meilisearch/meilisearch/releases/tag/v1.33.0): 🐞 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.32.2...v1.33.0) ##### ✨ Enhancement - **Add `/fields` route to get all the fields of an index** by [@&#8203;YoEight](https://github.com/YoEight) in [#&#8203;6082](https://github.com/meilisearch/meilisearch/pull/6082) Adds a new POST `/indexes/{indexUid}/fields` endpoint that returns detailed metadata about all fields in an index. This endpoint provides comprehensive information about each field's configuration, including display, search, filtering, and localization settings. - **Implement parallel cleanup of old field IDs** by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6100](https://github.com/meilisearch/meilisearch/pull/6100) We reduce the time required to perform the dumpless upgrade for instances before v1.32.0 by multi-threading database fetches. By doing that, we noticed improvements from 2 hours and 50 minutes to a bit less than 7 minutes. - **Bump hannoy to 0.1.4-nested-rtxns** by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6103](https://github.com/meilisearch/meilisearch/pull/6103) We updated our internal vector store to speed up the dumpless upgrade by improving the graph rebuilding and improving the speed and relevance of the search by using the explore factor as a limit to stop document searches rather than the query limit. ##### 🪲 Bug fixes - **Meilisearch can now rescale when the index reaches 2 TB** by [@&#8203;Vipul-045](https://github.com/Vipul-045) in [#&#8203;6095](https://github.com/meilisearch/meilisearch/pull/6095) ##### 🔒 Security - **Upgrade mini-dashboard to benefit security vulnerability fixes** by [@&#8203;curquiza](https://github.com/curquiza) in [#&#8203;6091](https://github.com/meilisearch/meilisearch/pull/6091) ##### 🔩 Miscellaneous - Fix tests by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6090](https://github.com/meilisearch/meilisearch/pull/6090) - Add verbose OpenAPI schema descriptions for documentation by [@&#8203;qdequele](https://github.com/qdequele) in [#&#8203;6071](https://github.com/meilisearch/meilisearch/pull/6071) - Add code samples to the generated openAPI file by [@&#8203;curquiza](https://github.com/curquiza) in [#&#8203;6028](https://github.com/meilisearch/meilisearch/pull/6028) Thank you [@&#8203;Vipul-045](https://github.com/Vipul-045) for your first contribution ❤️ ### [`v1.32.2`](https://github.com/meilisearch/meilisearch/releases/tag/v1.32.2): 🐟 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.32.1...v1.32.2) #### 🐛 Bug fixes - Do not panic when doing a dumpless upgrade on empty indexes with configured embeddings by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6102](https://github.com/meilisearch/meilisearch/pull/6102) **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.32.1...v1.32.2> ### [`v1.32.1`](https://github.com/meilisearch/meilisearch/releases/tag/v1.32.1): 🐟 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.32.0...v1.32.1) #### 🌈 Improvements ##### Skip cleaning up the field-ID-based databases Introduce a `MEILI_EXPERIMENTAL_DISABLE_FID_BASED_DATABASES_CLEANUP` env var to opt out of the field ID-based database cleanup when upgrading a Meilisearch from versions inferior to 1.32.0. > by [@&#8203;ManyTheFish](https://github.com/ManyTheFish) in [#&#8203;6096](https://github.com/meilisearch/meilisearch/pull/6096) **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.32.0...v1.32.1> ### [`v1.32.0`](https://github.com/meilisearch/meilisearch/releases/tag/v1.32.0): 🐟 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.31.0...v1.32.0) #### 🌈 Improvements ##### Log Search performance trace Introduces comprehensive progress tracking and logging for search operations in Meilisearch. It adds detailed timing information for each step of the search process, enabling better observability and performance analysis. > by [@&#8203;ManyTheFish](https://github.com/ManyTheFish) in [#&#8203;6072](https://github.com/meilisearch/meilisearch/pull/6072) ##### Extract document operations from payloads in parallel We accelerate document indexing by processing a large number of tasks in batches or a large number of records in parallel. We expedited the preparation of the payloads by extracting the various changes and assigning internal IDs in parallel. We achieved a 7x speedup on a four-million-document insertion using four CPUs, and the performance scales with the number of CPUs. The `indexedDocuments` field in tasks using skipCreation no longer precisely reflects the number of document operations performed, specifically for `POST` and `PUT` operations. This count may be higher than the actual number of operations, but it doesn't affect the computation; only the reported count is impacted. We prioritize speed over perfect accuracy here, and the documents are still correctly indexed as before. > by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6080](https://github.com/meilisearch/meilisearch/pull/6080) #### 🐛 Bug fixes ##### Vector sort: Bucket documents with same similarity Fixed vector sort bucketing so documents with identical similarity scores are grouped together, ensuring subsequent ranking rules are applied correctly. > by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6081](https://github.com/meilisearch/meilisearch/pull/6081) ##### Properly Delete Documents from FID-Based Databases Fixes a bug where changing searchableAttributes from \["\*"] to a subset of fields left orphaned data in fid-based databases, causing corruption and warnings during search. > by [@&#8203;ManyTheFish](https://github.com/ManyTheFish) in [#&#8203;6076](https://github.com/meilisearch/meilisearch/pull/6076) ##### Rebuild the graph links when dumpless-upgrading Bumps [hannoy to v0.1.3-nested-rtxns](https://github.com/nnethercott/hannoy/releases/tag/v0.1.3-nested-rtxns), which fixes graph-related recall issues and adds a method to rebuild graph links to recover previously malformed graphs. Also fixes a minor issue in the dumpless upgrade flow where the upgrade description was not displayed correctly and related operations were not properly associated with the upgrade. > by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6055](https://github.com/meilisearch/meilisearch/pull/6055) #### 🛠️ Maintenance and Misc. ##### Update JS SDKs tests to use `pnpm` instead of `yarn` Updated the JavaScript SDK tests to use pnpm instead of yarn in CI workflows, switching the package manager across test configurations to ensure the SDK test suite runs correctly and consistently with the current tooling. > by [@&#8203;Strift](https://github.com/Strift) in [#&#8203;6075](https://github.com/meilisearch/meilisearch/pull/6075) ##### Adapt JS tests in SDK tests CI Updated the SDK tests CI workflow for the JavaScript SDKs > by [@&#8203;curquiza](https://github.com/curquiza) in [#&#8203;6050](https://github.com/meilisearch/meilisearch/pull/6050) ##### Bump lru from 0.16.2 to 0.16.3 Fix Stacked Borrows violation in `IterMut`. > by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;6087](https://github.com/meilisearch/meilisearch/pull/6087) **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.31.0...v1.32.0> ### [`v1.31.0`](https://github.com/meilisearch/meilisearch/releases/tag/v1.31.0): 🦃 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.30.1...v1.31.0) ### 🌈 Improvements #### 🗄️ \[Enterprise Edition] Make the S3-streaming snapshots an Enterprise Edition feature The recently introduced S3-streaming snapshots feature is now available as an Enterprise Edition feature. From now on, you'll need a license to use this feature when using Meilisearch as a self-hosted solution. Note that this version introduces a breaking change regarding the S3-streaming snapshot feature, which is no longer available in the Community Edition; however, on-disk snapshots remain accessible. You can read our BUSL license for contact information, if you like. Note that if you are using the Community Edition of Meilisearch between [version 1.25](https://github.com/meilisearch/meilisearch/releases/tag/v1.25.0) and this release, you can freely use the S3 Streaming feature without an Enterprise Edition license. > by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6057](https://github.com/meilisearch/meilisearch/pull/6057) #### 🔏 \[Enterprise Edition] Support AWS IRSA to authenticate to S3 for snapshotting We just introduced support for IRSA authentication to do snapshots on AWS. IRSA allows the use of short-lived access and secret keys to upload snapshots through S3. This feature is available under the Enterprise Edition and can be accessed through two experimental CLI parameters. > by [@&#8203;paulden](https://github.com/paulden) in [#&#8203;6044](https://github.com/meilisearch/meilisearch/pull/6044) #### ✍️ Allow strict document update without creating missing documents Adds an optional `skipCreation` boolean query parameter to `POST` and `PUT` on `/indexes/{index}/documents`. When set to `true`, documents that don't exist in the index are silently ignored rather than created. Default is `false`, preserving existing behavior. > by [@&#8203;YoEight](https://github.com/YoEight) in [#&#8203;6053](https://github.com/meilisearch/meilisearch/pull/6053) #### 🐛 Bug fixes - Fix actix payload error handling by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6052](https://github.com/meilisearch/meilisearch/pull/6052) - Bump hannoy to v0.1.2 by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6063](https://github.com/meilisearch/meilisearch/pull/6063) #### 🛠️ Maintenance and Misc. - Run windows in the PR CI by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6058](https://github.com/meilisearch/meilisearch/pull/6058) - Make CI test titles more human friendly by [@&#8203;curquiza](https://github.com/curquiza) in [#&#8203;6062](https://github.com/meilisearch/meilisearch/pull/6062) ### [`v1.30.1`](https://github.com/meilisearch/meilisearch/releases/tag/v1.30.1): 🐸 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.30.0...v1.30.1) ### What's Changed #### 🐛 Bug Fixes ##### Fix task attribution during index swap to prevent cross-index task loss by [@&#8203;YoEight](https://github.com/YoEight) in [#&#8203;6059](https://github.com/meilisearch/meilisearch/pull/6059) This change fixes the parenting of the tasks when doing an index swap. ##### Hotfix: log a warning when FieldidsWeightsMap is missing entry by [@&#8203;ManyTheFish](https://github.com/ManyTheFish) in [#&#8203;6064](https://github.com/meilisearch/meilisearch/pull/6064) This hotfix avoids the encounter of following error during a search request: ```json { "message": "Inside `<query>`: Index `<index_uid>`: internal: missing <field_id> in the fieldids weights mapping.", "code": "internal", "type": "internal", "link": "https://docs.meilisearch.com/errors#internal" } ``` #### 🫂 New Contributors - [@&#8203;YoEight](https://github.com/YoEight) made their first contribution in [#&#8203;6059](https://github.com/meilisearch/meilisearch/pull/6059) ### [`v1.30.0`](https://github.com/meilisearch/meilisearch/releases/tag/v1.30.0): 🐸 [Compare Source](https://github.com/meilisearch/meilisearch/compare/v1.29.0...v1.30.0) ### 🌈 Improvements #### Up and down network scaling Since [v1.19.0](https://github.com/meilisearch/meilisearch/releases/tag/v1.19.0), Meilisearch [Enterprise Edition](https://github.com/meilisearch/meilisearch/blob/main/README.md#-enterprise-edition-ee) allows the automatic sharding of documents over multiple Meilisearch instances, enabling scaling to more documents than a single instance would accommodate. Meilisearch v1.30.0 adds the ability to modify the number of participants in sharding, without having to start over sending documents to a new cluster containing the number of desired machines. To make this possible, Meilisearch v1.30.0 introduces *breaking changes*. These breaking changes only affect the users of the experimental `network` feature who enabled automatic sharding (`network.sharding = true`). Users of the stable features are not affected. ##### Usage <details> <summary>Setting up the initial network</summary> 1. Pick a leader machine that will receive all tasks. Calling a route that creates a dcument, settings or network-related task on a machine that is not the leader will now return an error. 2. Send your network topology to the leader by calling `PATCH /network`: ```jsonc // PATCH /network { "self": "ms0", "leader": "ms0", // must be equal to `self` "remotes": { "ms0": { "url": "URL_OF_MS0", "searchApiKey": "SEARCH_API_KEY_OF_MS0", "writeApiKey": "WRITE_API_KEY_OF_MS0", }, "ms1": { "url": "URL_OF_MS1", "searchApiKey": "SEARCH_API_KEY_OF_MS1", "writeApiKey": "WRITE_API_KEY_OF_MS1", } } } ``` 3. The network is automatically propagated to other members of the network. 4. Send settings and documents as usual, but exclusively to the leader. They will be propagated to all participants in the network, and each participant will process a piece of the documents. </details> <details> <details> <summary>Upgrading from v1.29 or earlier</summary> 1. We recommend using the experimental dumpless upgrade feature to go from Meilisearch v1.13+ to Meilisearch v1.29. 2. When using the experimental dumpless upgrade and the Meilisearch instance already has a `network` instance with `sharding` set to `true`, then the `network` object will be modified so that the leader is the first remote in alphabetic order. For instance, if you network contains remotes: `A`, `B`, `C`, the leader will be set to `A`. </details> <summary>Adding a new remote</summary> 1. Call `PATCH /network` on the leader with the information about the new remote: ```jsonc { "remotes": { // add information about the new remote "ms2": { "url": "URL_OF_MS2", "searchApiKey": "SEARCH_API_KEY_OF_MS2", "writeApiKey": "WRITE_API_KEY_OF_MS2", } // information about existing remotes does not need to be repeated } ``` 4. The new network will be propagated from the leader to all remotes (including the new remote `ms2`). 5. All remotes will register a new `networkTopologyChange` task that will "rebalance" the documents between the existing remotes and the new remote, that is, `ms0` and `ms1` will send parts of their documents to `ms2` </details> <details> <summary>Removing a remote</summary> 1. Call `PATCH /network` on the leader by setting any removed remote to `null`: ```jsonc { "remotes": { // set removed remote to null "ms2": null // information about existing remotes does not need to be repeated } ``` 2. The new network will be propagated from the leader to all remotes (including to the old remote `ms2` that will then no longer participate in the network). 3. All remotes will register a new `networkTopologyChange` task that will "rebalance" the documents between the remaining remotes, that is, `ms2` will send its documents between `ms0` and `ms1` </details> ##### List of changes <details> <summary>List of changes, some of which are breaking</summary> 1. Breaking change: The `Network` object returned or edited by the `/network` route is modified in the following way: - the `sharding` boolean is removed - a `leader` field is added as an optional string. When it is not `null`, it has the same effect (and more) than having `sharding: true` in the previous iteration of the `Network` object. The leader is used as a check when receiving task creation requests. - a `version` field is added as a UUID, defaulting to the null UUID. The version is used when processing tasks. 2. Breaking change: When a `network.leader` is set, calling one of the following routes will fail with `not_a_leader` error if the target's `network.self` is not the same as its `network.leader`: - `POST /indexes` - `PATCH/DELETE /indexes/{:indexUid}` - `POST/PUT/DELETE /indexes/{:indexUid}/documents` - `POST /indexes/{:indexUid}/documents/delete` - `POST /indexes/{:indexUid}/documents/delete-batch` - `POST /indexes/{:indexUid}/documents/edit` - `PATCH/DELETE /indexes/{:indexUid}/settings` and settings sub-routes - `PATCH /network` if the target is the **new** leader - `POST /swap-indexes` 3. Breaking change: when a `leader` is set, `PATCH /network` no longer returns a `Network` object. Rather, it spawns a new `NetworkTopologyChange` task, and returns the summarized task view. 4. Breaking change: Tasks are duplicated by the leader to the entire network when calling the following routes: - `POST /indexes` (new to this PR) - `PATCH/DELETE /indexes/{:indexUid}` (new to this PR) - `POST/PUT/DELETE /indexes/{:indexUid}/documents` (was already the case before this PR) - `POST /indexes/{:indexUid}/documents/delete` (was already the case before this PR) - `POST /indexes/{:indexUid}/documents/delete-batch` (was already the case before this PR) - `POST /indexes/{:indexUid}/documents/edit` (was already the case before this PR) - `PATCH/DELETE /indexes/{:indexUid}/settings` and settings sub-routes (new to this PR) - `PATCH /network` if the target is the **new** leader (new to this PR) - `POST /swap-indexes` (new to this PR) 5. New `NetworkTopologyChange` tasks that perform the following: 1. Execute any remaining task to process with a `network.version` lower than the network task's version 2. Iterate over all documents in all indexes, determine their new shard, and send the document to the remote that must now have it in the new version , deleting it from the local DB - The export route code has been factored and specialized to allow this - Should the export to a remote fail, the corresponding documents are kept locally - If there are no documents to send for an index, still call the documents addition with an empty payload and appropriate headers containing the expected metadata - If there are no documents to send for an entire remote, call the `network` route with specific headers containing the expected metadata 3. Wait for and process tasks from the remotes of the previous version of the network. 6. Breaking change: When importing dumps, we drop the `self` and `leader` from the network 7. Network topology change tasks can be cancelled. In this case the state will be the current one (any moved documents will stay that way). Cancellation needs to happen on all machines. </details> by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6000](https://github.com/meilisearch/meilisearch/pull/6000) #### 🛠️ Maintenance - Fix macos-amd64 compilation by [@&#8203;dureuill](https://github.com/dureuill) in [#&#8203;6037](https://github.com/meilisearch/meilisearch/pull/6037) - Move to Rust v1.91.1 by [@&#8203;Kerollmops](https://github.com/Kerollmops) in [#&#8203;6039](https://github.com/meilisearch/meilisearch/pull/6039) - Remove risk of command injection in CI by [@&#8203;curquiza](https://github.com/curquiza) in [#&#8203;6041](https://github.com/meilisearch/meilisearch/pull/6041) #### Asset availability note 🌈 The Meilisearch binary is available again for `meilisearch-enterprise-macos-amd64` and `meilisearch-macos-amd64`. It was not available for Meilisearch v1.29. **Full Changelog**: <https://github.com/meilisearch/meilisearch/compare/v1.29.0...v1.30.0> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My44MS4wIiwidXBkYXRlZEluVmVyIjoiNDMuOTAuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->
renovate force-pushed renovate/getmeili-meilisearch-1.x from 1b06c419cf to d4d4e33e97 2026-03-30 17:08:04 +02:00 Compare
renovate changed title from Update getmeili/meilisearch Docker tag to v1.40.0 to Update getmeili/meilisearch Docker tag to v1.41.0 2026-03-30 17:08:06 +02:00
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin renovate/getmeili-meilisearch-1.x:renovate/getmeili-meilisearch-1.x
git switch renovate/getmeili-meilisearch-1.x

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff renovate/getmeili-meilisearch-1.x
git switch renovate/getmeili-meilisearch-1.x
git rebase main
git switch main
git merge --ff-only renovate/getmeili-meilisearch-1.x
git switch renovate/getmeili-meilisearch-1.x
git rebase main
git switch main
git merge --no-ff renovate/getmeili-meilisearch-1.x
git switch main
git merge --squash renovate/getmeili-meilisearch-1.x
git switch main
git merge --ff-only renovate/getmeili-meilisearch-1.x
git switch main
git merge renovate/getmeili-meilisearch-1.x
git push origin main
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
jansauer/truenas-apps!208
No description provided.