PageSourceSearch

https://weaviate.io/assets/js/39ae8b28.a9b75e95.js

js weaviate.io collected 2026-10-01 08:41:40 UTC 31,181 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkmy_website=globalThis.webpackChunkmy_website||[]).push([[14693],{75598(e,n,i){i.d(n,{Ay:()=>o,RM:()=>t});var s=i(74848),a=i(28453);const t=[{value:"<code>ContainsAny</code> and <code>ContainsAll</code> operators",id:"containsany-and-containsall-operators",level:2},{value:"Multi-tenancy improvements",id:"multi-tenancy-improvements",level:2},{value:"Deactivate / activate tenant shards (experimental)",id:"deactivate--activate-tenant-shards-experimental",level:3},{value:"Improved cycle management for MT",id:"improved-cycle-management-for-mt",level:3},{value:"New modules",id:"new-modules",level:2},{value:"<code>text2vec-gpt4all</code> module",id:"text2vec-gpt4all-module",level:3},{value:"<code>multi2vec-bind</code> module",id:"multi2vec-bind-module",level:3},{value:"Example 1: Audio Search with car_audio.wav",id:"example-1-audio-search-with-car_audiowav",level:4},{value:"Example 2: Video Search with bird.mp4",id:"example-2-video-search-with-birdmp4",level:4},{value:"Performance improvements",id:"performance-improvements",level:2},{value:"Alternative virtual memory access (pread vs mmap)",id:"alternative-virtual-memory-access-pread-vs-mmap",level:3},{value:"Multiprocessing speedups for ARM64 processors",id:"multiprocessing-speedups-for-arm64-processors",level:3},{value:"Vector indexing improvements",id:"vector-indexing-improvements",level:3},{value:"Delta encoding",id:"delta-encoding",level:4},{value:"Reduce HNSW lock contention",id:"reduce-hnsw-lock-contention",level:4},{value:"Backup improvements",id:"backup-improvements",level:3},{value:"Hybrid search algorithm refinement",id:"hybrid-search-algorithm-refinement",level:2},{value:"Summary",id:"summary",level:2}];function r(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Weaviate 1.21",src:i(89652).A+"",width:"1200",height:"630"})}),"\n",(0,s.jsxs)(n.p,{children:["Weaviate ",(0,s.jsx)(n.code,{children:"1.21"})," is here!"]}),"\n",(0,s.jsxs)(n.p,{children:["Here are the \u2b50\ufe0f",(0,s.jsx)(n.em,{children:"highlights"}),"\u2b50\ufe0f relating to this release:"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsxs)(n.a,{href:"#containsany-and-containsall-operators",children:[(0,s.jsx)(n.code,{children:"ContainsAny"})," and ",(0,s.jsx)(n.code,{children:"ContainsAll"})," operators added"]})," \u2013 Convenient, new operators to simplify complex queries."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#multi-tenancy-improvements",children:"Multi-tenancy improvements"})," \u2013 Experimental tenant deactivation for efficiency, performance improvements."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#new-modules",children:"New vectorizer modules"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"text2vec-gpt4all"})," provides fast transformer inference on CPUs; and"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"multi2vec-bind"})," vectorizes multi-modal data from up to 7 modalities."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#performance-improvements",children:"Performance improvements"})," \u2013 A suite of improvements to search, indexing and backup performance."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#hybrid-search-algorithm-refinement",children:"Hybrid search algorithm refinement"})," - Improved scoring stability for small limits in hybrid search."]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Available on WCD",type:"tip",children:(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"1.21"})," is already available on ",(0,s.jsx)(n.a,{href:"https://console.weaviate.cloud/",children:"Weaviate Cloud"})," - so try it out!"]})}),"\n",(0,s.jsx)(n.p,{children:"For more details, keep scrolling \u2b07\ufe0f!"}),"\n",(0,s.jsxs)(n.h2,{id:"containsany-and-containsall-operators",children:[(0,s.jsx)(n.code,{children:"ContainsAny"})," and ",(0,s.jsx)(n.code,{children:"ContainsAll"})," operators"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"New ContainsAll / ContainsAny filter operators",src:i(7704).A+"",width:"1601",height:"749"})}),"\n",(0,s.jsxs)(n.p,{children:["You asked for it - and it\u2019s here! ",(0,s.jsx)(n.code,{children:"1.21"})," adds ",(0,s.jsx)(n.code,{children:"ContainsAny"})," and ",(0,s.jsx)(n.code,{children:"ContainsAll"})," operators to make your filters (syntactically) sweeter than ever."]}),"\n",(0,s.jsxs)(n.p,{children:["You can use these to reduce complex chains of ",(0,s.jsx)(n.code,{children:"And"})," or ",(0,s.jsx)(n.code,{children:"Or"}
1)," where filters to simple, digestible, queries that are easier on your eye and your brain."]}),"\n",(0,s.jsx)(n.p,{children:"These operators allow you to filter an array property, using a query array."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"ContainsAny"})," will find all objects whose property contains one or more (i.e. ",(0,s.jsx)(n.em,{children:"any"}),") of the query values. In other words - a series of ",(0,s.jsx)(n.code,{children:"Or"})," statements."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"ContainsAll"}),", on the other hand, will find all objects whose property contains every single one (i.e. ",(0,s.jsx)(n.em,{children:"all"}),") of the query values. This can replace a series of ",(0,s.jsx)(n.code,{children:"And"})," statements."]}),"\n",(0,s.jsx)(n.p,{children:"This is one of our most-requested features, and we are very excited for you to try it out."}),"\n",(0,s.jsxs)(t,{children:[(0,s.jsx)("summary",{children:"Example usage"}),(0,s.jsxs)(n.p,{children:["Consider a dataset of people (class ",(0,s.jsx)(n.code,{children:"Person"}),"), where each ",(0,s.jsx)(n.code,{children:"Person"})," object has a ",(0,s.jsx)(n.code,{children:"name"})," and a ",(0,s.jsx)(n.code,{children:"languages_spoken"})," property."]}),(0,s.jsxs)(n.p,{children:["A ",(0,s.jsx)(n.code,{children:"ContainsAny"})," like this will return all ",(0,s.jsx)(n.code,{children:"Person"})," objects whose ",(0,s.jsx)(n.code,{children:"languages_spoken"})," values contain any of the listed languages in the query."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-graphql",children:'{\n  Get {\n    Person (\n      where: {\n        path: ["languages_spoken"],\n        operator: ContainsAny,\n        valueText: ["Chinese", "French", "English"]\n      }\n    )\n    {\n      languages_spoken\n      name\n    }\n  }\n}\n'})}),(0,s.jsxs)(n.p,{children:["A ",(0,s.jsx)(n.code,{children:"ContainsAll"})," query on the other hand will return all ",(0,s.jsx)(n.code,{children:"Person"})," objects whose ",(0,s.jsx)(n.code,{children:"languages_spoken"})," values contain every single one of the listed languages in the query."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-graphql",children:'{\n  Get {\n    Person (\n      where: {\n        path: ["languages_spoken"],\n        operator: ContainsAll,\n        valueText: ["Chinese", "French", "English"]\n      }\n    )\n    {\n      languages_spoken\n      name\n    }\n  }\n}\n'})}),(0,s.jsx)(n.admonition,{title:"Client libraries will be updated to support these operators soon.",type:"note"})]}),"\n",(0,s.jsx)(n.h2,{id:"multi-tenancy-improvements",children:"Multi-tenancy improvements"}),"\n",(0,s.jsx)(n.h3,{id:"deactivate--activate-tenant-shards-experimental",children:"Deactivate / activate tenant shards (experimental)"}),"\n",(0,s.jsxs)(n.admonition,{type:"info",children:[(0,s.jsxs)(n.mdxAdmonitionTitle,{children:["Tenant status renamed in ",(0,s.jsx)(n.code,{children:"v1.26"})]}),(0,s.jsxs)(n.p,{children:["In ",(0,s.jsx)(n.code,{children:"v1.26"}),", the ",(0,s.jsx)(n.code,{children:"HOT"})," status was renamed to ",(0,s.jsx)(n.code,{children:"ACTIVE"})," and the ",(0,s.jsx)(n.code,{children:"COLD"})," status was renamed to ",(0,s.jsx)(n.code,{children:"INACTIVE"}),"."]})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Activate / Deactivate tenants",src:i(63353).A+"",width:"1601",height:"748"})}),"\n",(0,s.jsxs)(n.p,{children:["We introduced multi-tenancy (MT) with ",(0,s.jsx)(n.code,{children:"1.20"}),", and we are thrilled by your response so far."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"1.21"})," adds an (experimental) feature to deactivate or activate individual tenants. This will allow you to scale even bigger with ease, because inactive tenants' data will not take up any space in memory."]}),"\n",(0,s.jsxs)(n.p,{children:["This is possible because under the hood, each ",(0,s.jsx)(n.a,{href:"https://www.weaviate.io/blog/multi-tenancy-vector-search#built-in-isolation-through-lightweight-shards",children:"tenant is a partition shard"}
1),", and tenant shards can now be deactivated while still retaining the data. Deactivated (",(0,s.jsx)(n.code,{children:"INACTIVE"}),") shards do not consume memory or file descriptors, so this enables an unlimited number of non-active shards, limited only by disk space, while giving active (",(0,s.jsx)(n.code,{children:"ACTIVE"}),") shards access to resources that they need."]}),"\n",(0,s.jsxs)(n.p,{children:["Deactivating unused subsets of data will help to reduce cost and improve the overall performance. We are very excited for you to ",(0,s.jsx)(n.a,{href:"https://docs.weaviate.io/weaviate/manage-data/multi-tenancy",children:"try it out"}),"."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Read more:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.weaviate.io/weaviate/api/rest#tag/schema/post/schema/%7BclassName%7D/tenants",children:"REST API: Schema: Multi-tenancy"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.weaviate.io/weaviate/concepts/data#multi-tenancy",children:"Concepts: Data: Multi-tenancy"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"This is an experimental feature",type:"note",children:(0,s.jsx)(n.p,{children:"Please use it with caution."})}),"\n",(0,s.jsx)(n.h3,{id:"improved-cycle-management-for-mt",children:"Improved cycle management for MT"}),"\n",(0,s.jsxs)(n.p,{children:["With ",(0,s.jsx)(n.code,{children:"1.21"}),", we've improved resource usage in a MT environment."]}),"\n",(0,s.jsx)(n.p,{children:"As you might imagine, enabling large-scale MT requires managing a large number of processes, unifying and centralizing the scheduling of background processes in each shard."}),"\n",(0,s.jsx)(n.p,{children:"We've improved the way Weaviate manages these processes, leading to a more stable setup in a MT environment."}),"\n",(0,s.jsx)(n.h2,{id:"new-modules",children:"New modules"}),"\n",(0,s.jsxs)(n.h3,{id:"text2vec-gpt4all-module",children:[(0,s.jsx)(n.code,{children:"text2vec-gpt4all"})," module"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"New text2vec-gpt4all module",src:i(79115).A+"",width:"1601",height:"749"})}),"\n",(0,s.jsxs)(n.p,{children:["This module allows you to perform local vectorization of text using the ",(0,s.jsx)(n.a,{href:"https://docs.gpt4all.io/gpt4all_python_embedding.html",children:"gpt4all"})," library."]}),"\n",(0,s.jsxs)(n.p,{children:["A key benefit of this module is that it is optimized for CPU using ",(0,s.jsx)(n.a,{href:"https://github.com/ggerganov/ggml",children:(0,s.jsx)(n.code,{children:"ggml"})}),". For those of you without a GPU on hand, you can now take advantage of a transformer-architecture model without sacrificing speed."]}),"\n",(0,s.jsxs)(n.p,{children:["Currently, ",(0,s.jsx)(n.code,{children:"text2vec-gpt4all"})," supports the ",(0,s.jsx)(n.a,{href:"https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2",children:(0,s.jsx)(n.code,{children:"all-MiniLM-L6-v2"})})," model."]}),"\n",(0,s.jsx)(n.p,{children:"If you are looking to perform local vectorization and don't have a GPU, this module could be a great option for you."}),"\n",(0,s.jsx)(n.admonition,{title:"Limitations",type:"note",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Input text is truncated to 256 tokens. If you need to use longer chunks, you should explore a different module."}),"\n",(0,s.jsxs)(n.li,{children:["Available for ",(0,s.jsx)(n.code,{children:"x86-64"})," devices only."]}),"\n"]})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Read more:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.weaviate.io/weaviate/model-providers/gpt4all/embeddings",children:"Modules: text2vec-gpt4all"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"multi2vec-bind-module",children:[(0,s.jsx)(n.code,{children:"multi2vec-bind"})," module"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"New multi2vec-bind module",src:i(15245).A+"",width:"1601",height:"749"})}),"\n",(0,s.jsxs)(n.p,{children:["With ",(0,s.jsx)(n.code,{children:"1.21"})," we are introducing a second multimodal module to Weaviate! The ",(0,s.jsx)(n.code,{children:"multi2vec-bind"})," module will allow users to generate embeddings using the ",(0,s.jsx)(n.a,{href:"https://github.com/facebookresearch/ImageBind",children:"ImageBind"})," model from Meta AI/FAIR out of the box."]}),"\n",(0,s.jsxs)(n.p,{children:["We will cover some highlights about this great multimodal model below. For a detailed overview, have a look at this ",(0,s.jsx)(n.a,{href:"https://ai.meta.com/blog/imagebind-six-modalities-binding-ai/",children:"blog"})," and the ",(0,s.jsx)(n.a,{href:"https://arxiv.org/abs/2305.05665",children:"paper"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"multi2vec-bind"})," can generate vectors from an impressive 7 different modalities of data! You can now embed data containing any combination of text, image, video, audio, inertial measurement unit (IMU) - accelerometer and gyroscope data, depth images, and thermal images with Weaviate."]}),"\n",(0,s.jsxs)(t,{children:[(0,s.jsx)("summary",{children:"How is this possible?"}),(0,s.jsx)(n.p,{children:"ImageBind is able to understand multiple modalities because it actually consists of multiple models, each that specializes in understanding one modality."}),(0,s.jsx)(n.p,{children:"The embedding space for these specialist models is then unified/fused by using a contrastive loss function. This loss function, similar to its use in training the CLIP model, is used to make sure that similar concepts across different modalities are located \u201ccloser\u201d together in vector space."}),(0,s.jsx)(n.p,{children:"So for example the vector representations of the sound of a lion roaring, the image of a lion roaring and the text \u201clion roaring\u201d should all be close in vector space whereas the multimodal representation of a car, should be further away."}),(0,s.jsx)(n.p,{children:"The ability to encode and represent all of these modalities of data is quite exciting because now Weaviate can understand and perform cross-modal search and retrieval."}),(0,s.jsxs)(n.p,{children:["This means that when using the ",(0,s.jsx)(n.code,{children:"multi2vec-bind"})," module you can query with and retrieve any of the above combinations of modalities. For example, you can perform a ",(0,s.jsx)(n.code,{children:"nearAudio"})," search by passing in a sound file of a lion roaring as a query and retrieve a picture of a lion roaring. Or perhaps y
1ou want you\u2019ve got a tune stuck in your head but can\u2019t remember which song it\u2019s from? You can now record yourself humming the tune and then pass that in as a query to perform audio to audio search to retrieve the closest matching song! The possibilities are excitingly endless."]})]}),"\n",(0,s.jsx)(n.p,{children:"We know you've just been dying to vectorize that data from your accelerometer and gyroscope, and now you can! \ud83d\ude09"}),"\n",(0,s.jsxs)(n.p,{children:["Take a look at some examples of cross-modal search with ",(0,s.jsx)(n.code,{children:"multi2vec-bind"})," below. Here, we are searching over a set of images using an audio file and then a video file, respectively."]}),"\n",(0,s.jsxs)(n.h4,{id:"example-1-audio-search-with-car_audiowav",children:["Example 1: Audio Search with ",(0,s.jsx)(n.a,{href:"https://drive.google.com/file/d/1TDQ5h8ewX_DXcTv1CEiHG-b81GVm6X-W/view?usp=sharing",children:"car_audio.wav"})]}),"\n",(0,s.jsx)(n.admonition,{title:"Search carried out with a preview version of the Python client",type:"note"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'client.query\n.get("BindExample", ["text"])\n.with_near_audio({"audio" : "car_audio.wav"})\n.do()\n'})}),"\n",(0,s.jsx)(n.p,{children:"Top retrieved image:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Image of a car representing the top retrieved image from an audio search",src:i(26088).A+"",width:"512",height:"288"})}),"\n",(0,s.jsxs)(n.h4,{id:"example-2-video-search-with-birdmp4",children:["Example 2: Video Search with ",(0,s.jsx)(n.a,{href:"https://drive.google.com/file/d/11X9ump85jtgTYx-vtEUb1p5dT-vxjbf2/view?usp=drive_link",children:"bird.mp4"})]}),"\n",(0,s.jsx)(n.admonition,{title:"Search carried out with a preview version of the Python client",type:"note"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'client.query\n.get("BindExample", ["text"])\n.with_near_video({"video" : "bird.mp4"})\n.do()\n'})}),"\n",(0,s.jsx)(n.p,{children:"Top retrieved image:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Image of a bird representing the top retrieved image from a video search",src:i(2577).A+"",width:"383",height:"512"})}),"\n",(0,s.jsxs)(n.p,{children:["We\u2019ll explore the awesomeness of this new module more in a blog soon but for now, you can read more about the details of how you can use ",(0,s.jsx)(n.code,{children:"multi2vec-bind"})," in the ",(0,s.jsx)(n.a,{href:"https://docs.weaviate.io/weaviate/model-providers/imagebind/embeddings-multimodal",children:"documentation"}),"."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Read more:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.weaviate.io/weaviate/model-providers/imagebind/embeddings-multimodal",children:"Modules: multi2vec-bind"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"performance-improvements",children:"Performance improvements"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Performance improvements",src:i(86608).A+"",width:"1601",height:"749"})}),"\n",(0,s.jsx)(n.h3,{id:"alternative-virtual-memory-access-pread-vs-mmap",children:"Alternative virtual memory access (pread vs mmap)"}),"\n",(0,s.jsxs)(n.p,{children:["There is now an option to use ",(0,s.jsx)(n.code,{children:"pread"})," for virtual memory access by setting it in the ",(0,s.jsx)(n.code,{children:"PERSISTENCE_LSM_ACCESS_STRATEGY"})," ",(0,s.jsx)(n.a,{href:"https://docs.weaviate.io/weaviate/config-refs/env-vars",children:"environment variable"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Weaviate has been using ",(0,s.jsx)(n.code,{children:"mmap"})," to map a portion of disk space to virtual memory. While ",(0,s.jsx)(n.code,{children:"mmap"})," is performant, it can lead to stalling situations under heavy load or memory pressure due to Weaviate not being aware that the memory is in fact virtual."]}),"\n",(0,s.jsxs)(n.p,{children:["If this is an issue for you, you can use ",(0,s.jsx)(n.code,{children:"pread"})," for virtual memory access."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"pread"})," provides better responsiveness and avoids inducing downtime in a cluster. The tradeoff is that ",(0,s.jsx)(n.code,{children:"pread"}
1)," does not provide the same memory management benefits as ",(0,s.jsx)(n.code,{children:"mmap"}),", and may not be as fast as memory access."]}),"\n",(0,s.jsxs)(n.p,{children:["The current default will remain ",(0,s.jsx)(n.code,{children:"mmap"})," - so if you want to change it, you must set the ",(0,s.jsx)(n.code,{children:"PERSISTENCE_LSM_ACCESS_STRATEGY"})," ",(0,s.jsx)(n.a,{href:"https://docs.weaviate.io/weaviate/config-refs/env-vars",children:"environment variable"})," to ",(0,s.jsx)(n.code,{children:"pread"}),"."]}),"\n",(0,s.jsxs)(t,{children:[(0,s.jsx)("summary",{children:"Further technical details"}),(0,s.jsx)("p",{children:(0,s.jsxs)(n.p,{children:["With ",(0,s.jsx)(n.code,{children:"mmap"}),", the operating system handles the disk access. It maps files or devices into memory, which can be beneficial for large files because it doesn't require the entire file to be loaded into memory. For example, it can cache the entire disk enough memory is available, resulting in fast access."]})}),(0,s.jsx)("br",{}),(0,s.jsx)("p",{children:(0,s.jsxs)(n.p,{children:["However, under heavy load or memory pressure, the use of ",(0,s.jsx)(n.code,{children:"mmap"})," can lead to scalability issues and slow down the system."]})}),(0,s.jsx)("br",{}),(0,s.jsx)("p",{children:(0,s.jsxs)(n.p,{children:["On the other hand, the ",(0,s.jsx)(n.code,{children:"pread"})," function performs regular disk I/O at a specific position."]})}),(0,s.jsx)("br",{}),(0,s.jsx)("p",{children:(0,s.jsxs)(n.p,{children:["It is similar to ",(0,s.jsx)(n.code,{children:"mmap"})," in that it reads a specified number of bytes from a specific byte position. But, the Go runtime is aware of the disk I/O operations performed with ",(0,s.jsx)(n.code,{children:"pread"}),", while it is not with ",(0,s.jsx)(n.code,{children:"mmap"})," (as it is handled by the OS). So, disk I/O operations are handled differently between these two functions."]})}),(0,s.jsx)("br",{}),(0,s.jsx)("p",{children:(0,s.jsxs)(n.p,{children:["With ",(0,s.jsx)(n.code,{children:"pread"}),", When a goroutine is waiting for disk I/O, the Go runtime parks it and works on other tasks in the meantime. This means that the goroutine is not blocked and does not cause performance issues."]})})]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Read more:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.weaviate.io/weaviate/config-refs/env-vars",children:"References: Configuration: Environment variables"})}),"\n",(0,s.jsxs)(n.li,{children:["Paper: ",(0,s.jsx)(n.a,{href:"https://db.cs.cmu.edu/mmap-cidr2022/",children:'"Do you really want to use mmap in your DBMS?"'})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"multiprocessing-speedups-for-arm64-processors",children:"Multiprocessing speedups for ARM64 processors"}),"\n",(0,s.jsxs)(n.p,{children:["For those of you on ARM processors, you'll be happy to know that ",(0,s.jsx)(n.code,{children:"simd"})," multiprocessing instructions are now used for faster distance calculations on ARM64 processors."]}),"\n",(0,s.jsx)(n.p,{children:"This optimization results in significant performance (up to ~40%!) improvements, especially for large data sets and high-dimensional embeddings."}),"\n",(0,s.jsx)(n.p,{children:"You don't have to do anything to take advantage of this feature. Weaviate automatically detects the architecture and enables the optimization if it is supported."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.mdxAdmonitionTitle,{children:["A similar feature is already available for ",(0,s.jsx)(n.code,{children:"x86-64"})," processors"]})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Read more:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.weaviate.io/weaviate/config-refs/distances#distance-implementations-and-optimizations",children:"References: Distance metrics: Implementations"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"vector-indexing-improvements",children:"Vector indexing improvements"}),"\n",(0,s.jsx)(n.p,{children:"The vector indexing (HNSW) algorithm has been updated to improve performance."}),"\n",(0,s.jsx)(n.h4,{id:"delta-encoding",children:"Delta encoding"}),"\n",(0,s.jsx)(n.p,{children:"This release changes how the HNSW graph connections are stored in memory."}),"\n",(0,s.jsxs)(n.p,{children:["Previously, the graph was stored as an array with all the edges. However, from ",(0,s.jsx)(n.code,{children:"1.21"}),", the graph is stored as a delta-encoded array, which is more efficient. This reduces the memory footprint of the graph, and improves performance."]}),"\n",(0,s.jsx)(n.h4,{id:"reduce-hnsw-lock-contention",children:"Reduce HNSW lock contention"}),"\n",(0,s.jsx)(n.p,{children:"This change reduces the potential for HNSW lock contention, improving performance."}),"\n",(0,s.jsxs)(n.p,{children:["From ",(0,s.jsx)(n.code,{children:"1.21"})," onward, the HNSW locking algorithms have been updated to be more selective about what needs to be protected and how, during read/write processes."]}),"\n",(0,s.jsx)(n.p,{children:"Our internal testing showed improved performance by up to 20% in some cases."}),"\n",(0,s.jsx)(n.h3,{id:"backup-improvements",children:"Backup improvements"}),"\n",(0,s.jsx)(n.p,{children:"Your backups will now be smaller, and will likely incur lower costs from cloud storage providers."}),"\n",(0,s.jsx)(n.p,{children:"The new and improved backup process combines and compresses the required files to one backup file. Where there are a large number of files - such as with multi-tenancy users - this will be particularly beneficial."}),"\n",(0,s.jsx)(n.p,{children:"Not only will it compress the data, it will reduce the number of file operations, improving efficiency and reducing cloud storage costs."}),"\n",(0,s.jsxs)(n.admonition,{type:"note",children:[(0,s.jsxs)(n.mdxAdmonitionTitle,{children:[(0,s.jsx)(n.code,{children:"1.21"})," backups cannot be used in ",(0,s.jsx)(n.code,{children:"1.20"})," and below"]}),(0,s.jsxs)(n.p,{children:["Due to this change, backups from ",(0,s.jsx)(n.code,{children:"1.21"})," cannot be used to restore in a ",(0,s.jsx)(n.code,{children:"1.20"})," instance."]}),(0,s.jsxs)(n.p,{children:["If you might need to roll back, we recommend making a backup from ",(0,s.jsx)(n.code,{children:"1.20"})," before upgrading to ",(0,s.jsx)(n.code,{children:"1.21"}),"."]})]}),"\n",(0,s.jsx)(n.h2,{id:"hybrid-search-algorithm-refinement",children:"Hybrid search algorithm refinement"}),"\n",(0,s.jsx)(n.p,{children:"We have introduced a small change with our new hybrid fusion scoring algorithm."}),"\n",(0,s.jsx)(n.p,{children:"Where hybrid search is carried out with a small limit, a higher (internal) limit is used to determine the scoring, before returning the results with the original limit."}),"\n",(0,s.jsx)(n.p,{children:"This addresses a potential issue where the scoring could be unstable with a small limit, as the scoring is based on a small number of results."}),"\n",(0,s.jsx)(n.p,{children:"As a user, you don't need to do anything to take advantage of this change. It is automatically applied to all hybrid searches."}),"\n",(0,s.jsx)(n.h2,{id:"summary",children:"Summary"}),"\n",(0,s.jsxs)(n.p,{children:["That's it from us - we hope you enjoy the new features and improvements in Weaviate ",(0,s.jsx)(n.code,{children:"1.21"}),". This release is already available on ",(0,s.jsx)(n.a,{href:"https://console.weaviate.cloud/",children:"WCD"}),". So you can try it out yourself on a free sandbox, or by upgrading!"]}),"\n",(0,s.jsx)(n.p,{children:"Thanks for reading, and see you next time \ud83d\udc4b!"})]})}function o(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},74555(e,n,i){i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>l,metadata:()=>s,toc:()=>h});var s=i(43285),a=i(74848),t=i(28453),r=i(75598),o=i(73284);const l={title:"Weaviate 1.21 Release",slug:"weaviate-1-21-release",authors:["jp","zain"],date:new Date("2023-08-22T00:00:00.000Z"),image:"./img/hero.png",tags:["release","engineering"],description:"Weaviate 1.21 released with 
1new operators, performance improvements, multi-tenancy improvements, and more!"},d=void 0,c={image:i(28993).A,authorsImageUrls:[void 0,void 0]},h=[...r.RM,...o.RM];function m(e){return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.Ay,{}),"\n","\n",(0,a.jsx)(o.Ay,{})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(m,{...e})}):m()}},28993(e,n,i){i.d(n,{A:()=>s});const s=i.p+"assets/images/hero-a848ecd5aeb5053c1691576b3f103519.png"},2577(e,n,i){i.d(n,{A:()=>s});const s=i.p+"assets/images/bird-db7cb48ff473fdf97d1a639bdf87c564.jpg"},26088(e,n,i){i.d(n,{A:()=>s});const s=i.p+"assets/images/car-5036e4332c651d1ce5a3c083f97a2ba9.jpg"},7704(e,n,i){i.d(n,{A:()=>s});const s=i.p+"assets/images/contains-all-any-3198ac02f5192905e1cf8b03445d6f0b.png"},89652(e,n,i){i.d(n,{A:()=>s});const s=i.p+"assets/images/hero-a848ecd5aeb5053c1691576b3f103519.png"},63353(e,n,i){i.d(n,{A:()=>s});const s=i.p+"assets/images/mt-inactive-87969f1cd952c6dbf4824cd5d0c19783.png"},15245(e,n,i){i.d(n,{A:()=>s});const s=i.p+"assets/images/multi2vec-bind-2cd7364763b8795b5f9e75bfcce017c8.png"},86608(e,n,i){i.d(n,{A:()=>s});const s=i.p+"assets/images/performance-be6e24b16b4d93edd9a9a02b3699eebd.png"},79115(e,n,i){i.d(n,{A:()=>s});const s=i.p+"assets/images/text2vec-gpt4all-484b634c81e68cb64870617eb151509a.png"},43285(e){e.exports=JSON.parse('{"permalink":"/blog/weaviate-1-21-release","editUrl":"https://github.com/weaviate/weaviate-io/tree/main/blog/2023-08-22-weaviate-1-21-release/index.mdx","source":"@site/blog/2023-08-22-weaviate-1-21-release/index.mdx","title":"Weaviate 1.21 Release","description":"Weaviate 1.21 released with new operators, performance improvements, multi-tenancy improvements, and more!","date":"2023-08-22T00:00:00.000Z","tags":[{"inline":true,"label":"release","permalink":"/blog/tags/release"},{"inline":true,"label":"engineering","permalink":"/blog/tags/engineering"}],"readingTime":0.08,"hasTruncateMarker":false,"authors":[{"name":"Joon-Pil (JP) Hwang","title":"Educator","url":"https://github.com/databyjp","imageURL":"/img/people/icon/jp.jpg","key":"jp","page":null},{"name":"Zain Hasan","title":"Developer Advocate","url":"https://github.com/zainhas","imageURL":"/img/people/icon/zain.jpg","key":"zain","page":null}],"frontMatter":{"title":"Weaviate 1.21 Release","slug":"weaviate-1-21-release","authors":["jp","zain"],"date":"2023-08-22T00:00:00.000Z","image":"./img/hero.png","tags":["release","engineering"],"description":"Weaviate 1.21 released with new operators, performance improvements, multi-tenancy improvements, and more!"},"unlisted":false,"prevItem":{"title":"Unlocking the Power of Hybrid Search - A Deep Dive into Weaviate\'s Fusion Algorithms","permalink":"/blog/hybrid-search-fusion-algorithms"},"nextItem":{"title":"Distance Metrics in Vector Search","permalink":"/blog/distance-metrics-in-vector-search"}}')}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.