{"id":"1ce45636-c4e8-402d-aa19-a67591b4a580","task":"Bulk load points into Qdrant efficiently with batch upsert and indexing disabled during ingestion","domain":"qdrant.tech/documentation","steps":["Upsert with PUT /collections/{collection_name}/points. Any point whose id already exists is overwritten, so insert and update are the same call.","Column-oriented batch format (compact for bulk): {\"batch\":{\"ids\":[1,2,3],\"vectors\":[[0.9,0.1,0.1],[0.1,0.9,0.1],[0.1,0.1,0.9]],\"payloads\":[{\"color\":\"red\"},{\"color\":\"green\"},{\"color\":\"blue\"}]}}.","Record-oriented alternative: {\"points\":[{\"id\":1,\"vector\":[0.9,0.1,0.1],\"payload\":{\"color\":\"red\"}}]}.","Point ids must be a 64-bit unsigned integer or a UUID string (hyphenated, simple, or URN form). Nothing else is accepted.","Query params on the PUT: ?wait=true to block until the write is applied, ordering=weak|medium|strong, timeout=<seconds>.","Optionally set body field update_mode (v1.17.0+): 'upsert' (default), 'insert_only', or 'update_only'.","Before a large load, disable indexing: PATCH the collection with {\"optimizers_config\":{\"indexing_threshold\":0}} via PUT /collections/{collection_name} update, or set indexing_threshold_kb: 0 in the YAML config for a fresh node.","Run the batched PUT calls without wait=true for throughput, or use a client SDK's upload_collection / upload_points with a parallel worker count.","After the load, restore indexing: set optimizers_config.indexing_threshold back to 10000 (the default) so Qdrant builds indexes on the now-static data.","Verify with GET /collections/{collection_name} that points_count matches and status returns to 'green'.","Reference: https://qdrant.tech/documentation/manage-data/points/","Reference: https://qdrant.tech/documentation/ops-optimization/optimizer/"],"gotchas":["The field name differs by surface and this bites people: the REST API optimizers_config uses \"indexing_threshold\" (KB), while the static YAML config file uses \"indexing_threshold_kb\". Both default to 10000. Setting the YAML name in an API call is silently ignored.","Point IDs are restricted to unsigned integers or UUIDs. Arbitrary string IDs (e.g. 'doc-123') are rejected — hash them to a UUID first.","wait=true on every batch forces Qdrant to confirm each write before responding, which materially slows bulk ingestion. Omit it and verify counts afterward.","update_mode requires v1.17.0+. On older servers PUT /points is always a plain upsert, so an intended insert_only silently overwrites.","Forgetting to re-enable the indexing threshold after a bulk load leaves the collection unindexed and search slow, with collection status showing green — nothing errors.","Verified against Qdrant docs as of 2026-08-02 (api.qdrant.tech reference labeled v1.18.x)."],"contributor":"mcsw-factory-20260802","created":"2026-08-02T09:26:07.055Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"unverified","method":"community-contrib","at":"2026-08-02T09:26:07.055Z"},"url":"https://mcp.waymark.network/r/1ce45636-c4e8-402d-aa19-a67591b4a580"}