VOOZH about

URL: https://docs.weaviate.io/weaviate/api/graphql/search-operators

⇱ Search operators | Weaviate Documentation


👁 Image
Skip to main content
Introducing Engram — managed memory for AI agents, built on Weaviate
Go to documentation:
⌘U
Weaviate Database

Develop AI applications using Weaviate's APIs and tools

Deploy

Deploy, configure, and maintain Weaviate Database

Query Agent

Run agentic search over your Weaviate Cloud collections

Weaviate Cloud

Manage and scale Weaviate in the cloud

Engram

Persistent memory for LLM agents and applications

Additional resources

Integrations
Weaviate Academy

Need help?

👁 Weaviate Logo
Ask AI Assistant⌘K
Support
Community Forum
Contributor guide

This page covers the search operators that can be used in queries, such as vector search operators (nearText, nearVector, nearObject, etc), keyword search operator (bm25), hybrid search operator (hybrid).

Only one search operator can be added to queries on the collection level.

Operator availability

Built-in operators

These operators are available in all Weaviate instances regardless of configuration.

Module-specific operators

Module-specific search operators are made available in certain Weaviate modules.

By adding relevant modules, you can use the following operators:

Vector search operators

nearXXX operators allow you to find data objects based on their vector similarity to the query. They query can be a raw vector (nearVector) or an object UUID (nearObject).

If the appropriate vectorizer model is enabled, a text query (nearText), an image (nearImage), or another media input may be be used as the query.

All vector search operators can be used with a certainty or distance threshold specified, as well as a limit operator or an autocut operator to specify the desired similarity or distance between the query and the results

nearVector

nearVector finds data objects closest to an input vector.

Variables

VariableRequiredTypeDescription
vectoryes[float]This variable takes a vector embedding in the form of an array of floats. The array should have the same length as the vectors in this collection.
distancenofloatThe maximum allowed distance to the provided search input. Cannot be used together with the certainty variable. The interpretation of the value of the distance field depends on the distance metric used.
certaintynofloatNormalized Distance between the result item and the search vector. Normalized to be between 0 (perfect opposite) and 1 (identical vectors). Can't be used together with the distance variable.

Example

👁 py docs
  API docs
More infoCode snippets in the documentation reflect the latest client library and Weaviate Database version. Check the Release notes for specific versions.

If a snippet doesn't work or you have feedback, please open a GitHub issue.
import weaviate
import weaviate.classes as wvc
import os

client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": os.getenv("OPENAI_API_KEY")
}
)

try:
collection = client.collections.use("Article")

response = collection.query.near_vector(
near_vector=query_vector,
distance=0.7,
limit=5,
)

for o in response.objects:
print(o.properties)

finally:
client.close()
package main

import(
"context"
"fmt"

"github.com/weaviate/weaviate-go-client/v5/weaviate"
"github.com/weaviate/weaviate-go-client/v5/weaviate/graphql"
)

funcmain(){
cfg := weaviate.Config{
Host:"localhost:8080",
Scheme:"http",
}
client, err := weaviate.NewClient(cfg)
if err !=nil{
panic(err)
}

className :="Publication"

name := graphql.Field{Name:"name"}
_additional := graphql.Field{
Name:"_additional", Fields:[]graphql.Field{
{Name:"certainty"},// only supported if distance==cosine
{Name:"distance"},// always supported
},
}

nearVector := client.GraphQL().NearVectorArgBuilder().
WithVector([]float32{0.1,-0.15,0.3})// Replace with a compatible vector

ctx := context.Background()
result, err := client.GraphQL().Get().
WithClassName(className).
WithFields(name, _additional).
WithNearVector(nearVector).
Do(ctx)

if err !=nil{
panic(err)
}
fmt.Printf("%v", result)
}

Replace the placeholder vector with a compatible vector.

# Note: under _additional, `certainty` is only supported if distance==cosine, but `distance` is always supported

echo'{
"query": "{
Get {
Publication(
nearVector: {
vector: [0.1, -0.15, 0.3]
}
) {
name
_additional {
certainty
distance
}
}
}
}"
}'|curl\
-X POST \
-H'Content-Type: application/json'\
-H'Authorization: Bearer learn-weaviate'\
-d @- \
https://edu-demo.weaviate.network/v1/graphql
{
Get{
Publication(
nearVector:{
vector:[0.1,-0.15,0.3]# Replace with a compatible vector
}
){
name
_additional{
certainty
}
}
}
}

nearObject

nearVector finds data objects closest to an existing object in the same collection. The object is typically specified by its UUID.

  • Note: You can specify an object's id or beacon in the argument, along with a desired certainty.
  • Note that the first result will always be the object used for search.

Variables

VariableRequiredTypeDescription
idyesUUIDData object identifier in the uuid format.
beaconnourlData object identifier in the beacon URL format. E.g., weaviate://<hostname>/<kind>/id.
distancenofloatThe maximum allowed distance to the provided search input. Cannot be used together with the certainty variable. The interpretation of the value of the distance field depends on the distance metric used.
certaintynofloatNormalized Distance between the result item and the search vector. Normalized to be between 0 (perfect opposite) and 1 (identical vectors). Can't be used together with the distance variable.

Example

👁 py docs
  API docs
More infoCode snippets in the documentation reflect the latest client library and Weaviate Database version. Check the Release notes for specific versions.

If a snippet doesn't work or you have feedback, please open a GitHub issue.
import weaviate
import weaviate.classes as wvc
import os

client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": os.getenv("OPENAI_API_KEY")
}
)

try:
collection = client.collections.use("Article")

response = collection.query.near_object(
near_object=object_id,
distance=0.6,
limit=5,
)

for o in response.objects:
print(o.properties)

finally:
client.close()
package main

import(
"context"
"fmt"

"github.com/weaviate/weaviate-go-client/v5/weaviate"
"github.com/weaviate/weaviate-go-client/v5/weaviate/graphql"
)

funcmain(){
cfg := weaviate.Config{
Host:"localhost:8080",
Scheme:"http",
}
client, err := weaviate.NewClient(cfg)
if err !=nil{
panic(err)
}

className :="Publication"
fields :=[]graphql.Field{
{Name:"name"},
{Name:"_additional", Fields:[]graphql.Field{
{Name:"certainty"},// certainty only supported if distance==cosine
{Name:"distance"},// distance always supported
}},
}
nearObject := client.GraphQL().NearObjectArgBuilder().WithID("32d5a368-ace8-3bb7-ade7-9f7ff03eddb6")
ctx := context.Background()

result, err := client.GraphQL().Get().
WithClassName(className).
WithFields(fields...).
WithNearObject(nearObject).
Do(ctx)

if err !=nil{
panic(err)
}
fmt.Printf("%v", result)
}
# Note: prior to v1.14, use `certainty` instead of `distance`
# Under _additional, `certainty` is only supported if distance==cosine, but `distance` is always supported
echo'{
"query": "{
Get {
Publication(
nearObject: {
id: \"32d5a368-ace8-3bb7-ade7-9f7ff03eddb6\",
distance: 0.6
}
) {
name
_additional {
certainty
distance
}
}
}
}"
}'|curl\
-X POST \
-H'Content-Type: application/json'\
-H'Authorization: Bearer learn-weaviate'\
-d @- \
https://edu-demo.weaviate.network/v1/graphql
{
Get{
Publication(
nearObject:{
id:"32d5a368-ace8-3bb7-ade7-9f7ff03eddb6",# or weaviate://localhost/32d5a368-ace8-3bb7-ade7-9f7ff03eddb6
distance:0.6# prior to v1.14, use certainty: 0.7
}
){
name
_additional{
certainty# only works if distance==cosine
distance# always works
}
}
}
}

nearText

The nearText operator finds data objects based on their vector similarity to a natural language query.

This operator is enabled if a compatible vectorizer module is configured for the collection. Compatible vectorizer modules are:

  • Any text2vec module
  • Any multi2vec module

Variables

VariableRequiredTypeDescription
conceptsyes[string]An array of strings that can be natural language queries, or single words. If multiple strings are used, a centroid is calculated and used. Learn more about how the concepts are parsed here.
distancenofloatThe maximum allowed distance to the provided search input. Cannot be used together with the certainty variable. The interpretation of the value of the distance field depends on the distance metric used.
certaintynofloatNormalized Distance between the result item and the search vector. Normalized to be between 0 (perfect opposite) and 1 (identical vectors). Can't be used together with the distance variable.
autocorrectnobooleanAutocorrect input text values. Requires the text-spellcheck module to be present & enabled.
moveTonoobject{}Move your search term closer to another vector described by keywords
moveTo{concepts}no[string]An array of strings - natural language queries or single words. If multiple strings are used, a centroid is calculated and used.
moveTo{objects}no[UUID]Object IDs to move the results to. This is used to "bias" NLP search results into a certain direction in vector space.
moveTo{force}nofloatThe force to apply to a particular movement. Must be between 0 and 1 where 0 is equivalent to no movement and 1 is equivalent to largest movement possible.
moveAwayFromnoobject{}Move your search term away from another vector described by keywords
moveAwayFrom{concepts}no[string]An array of strings - natural language queries or single words. If multiple strings are used, a centroid is calculated and used.
moveAwayFrom{objects}no[UUID]Object IDs to move the results from. This is used to "bias" NLP search results into a certain direction in vector space.
moveAwayFrom{force}nofloatThe force to apply to a particular movement. Must be between 0 and 1 where 0 is equivalent to no movement and 1 is equivalent to largest movement possible.

Example I

This example shows an example usage the nearText operator, including how to bias results towards another search query.

👁 py docs
  API docs
More infoCode snippets in the documentation reflect the latest client library and Weaviate Database version. Check the Release notes for specific versions.

If a snippet doesn't work or you have feedback, please open a GitHub issue.
import weaviate
import weaviate.classes as wvc
from weaviate.classes.query import Move
import os

client = weaviate.connect_to_local()

try:
publications = client.collections.use("Publication")

response = publications.query.near_text(
query="fashion",
distance=0.6,
move_to=Move(force=0.85, concepts="haute couture"),
move_away=Move(force=0.45, concepts="finance"),
return_metadata=wvc.query.MetadataQuery(distance=True),
limit=2
)

for o in response.objects:
print(o.properties)
print(o.metadata)

finally:
client.close()
package main

import(
"context"
"fmt"

"github.com/weaviate/weaviate-go-client/v5/weaviate"
"github.com/weaviate/weaviate-go-client/v5/weaviate/graphql"
)

funcmain(){
cfg := weaviate.Config{
Host:"localhost:8080",
Scheme:"http",
}
client, err := weaviate.NewClient(cfg)
if err !=nil{
panic(err)
}

className :="Publication"

name := graphql.Field{Name:"name"}
_additional := graphql.Field{
Name:"_additional", Fields:[]graphql.Field{
{Name:"certainty"},// only supported if distance==cosine
{Name:"distance"},// always supported
},
}

concepts :=[]string{"fashion"}
distance :=float32(0.6)
moveAwayFrom :=&graphql.MoveParameters{
Concepts:[]string{"finance"},
Force:0.45,
}
moveTo :=&graphql.MoveParameters{
Concepts:[]string{"haute couture"},
Force:0.85,
}
nearText := client.GraphQL().NearTextArgBuilder().
WithConcepts(concepts).
WithDistance(distance).// use WithCertainty(certainty) prior to v1.14
WithMoveTo(moveTo).
WithMoveAwayFrom(moveAwayFrom)

ctx := context.Background()

result, err := client.GraphQL().Get().
WithClassName(className).
WithFields(name, _additional).
WithNearText(nearText).
Do(ctx)

if err !=nil{
panic(err)
}
fmt.Printf("%v", result)
}
# Note: Under nearText, use `certainty` instead of distance prior to v1.14
# Under _additional, `certainty` is only supported if distance==cosine, but `distance` is always supported
echo'{
"query": "{
Get {
Publication(
nearText: {
concepts: [\"fashion\"],
distance: 0.6,
moveAwayFrom: {
concepts: [\"finance\"],
force: 0.45
},
moveTo: {
concepts: [\"haute couture\"],
force: 0.85
}
}
) {
name
_additional {
certainty
distance
}
}
}
}"
}'|curl\
-X POST \
-H'Content-Type: application/json'\
-H'Authorization: Bearer learn-weaviate'\
-H"X-OpenAI-Api-Key: $OPENAI_API_KEY"\
-d @- \
https://edu-demo.weaviate.network/v1/graphql
{
Get{
Publication(
nearText:{
concepts:["fashion"],
distance:0.6# prior to v1.14 use "certainty" instead of "distance"
moveAwayFrom:{
concepts:["finance"],
force:0.45
},
moveTo:{
concepts:["haute couture"],
force:0.85
}
}
){
name
_additional{
certainty# only supported if distance==cosine.
distance# always supported
}
}
}
}

Example II

You can also bias results toward other data objects. For example, in this query, we move our query about "travelling in asia", towards an article on food.

👁 py docs
  API docs
More infoCode snippets in the documentation reflect the latest client library and Weaviate Database version. Check the Release notes for specific versions.

If a snippet doesn't work or you have feedback, please open a GitHub issue.
import weaviate
import weaviate.classes as wvc
import os

client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": os.getenv("OPENAI_API_KEY")
}
)

try:
collection = client.collections.use("Article")

response = collection.query.near_text(
query="travelling in Asia",
certainty=0.7,
move_to=wvc.query.Move(
force=0.75,
objects="c4209549-7981-3699-9648-61a78c2124b9"
),
return_metadata=wvc.query.MetadataQuery(certainty=True),
limit=5,
)

for o in response.objects:
print(o.properties)
print(o.metadata.certainty)

finally:
client.close()
package main

import(
"context"
"fmt"

"github.com/weaviate/weaviate-go-client/v5/weaviate"
"github.com/weaviate/weaviate-go-client/v5/weaviate/graphql"
)

funcmain(){
cfg := weaviate.Config{
Host:"localhost:8080",
Scheme:"http",
}
client, err := weaviate.NewClient(cfg)
if err !=nil{
panic(err)
}

className :="Article"

title := graphql.Field{Name:"title"}
summary := graphql.Field{Name:"summary"}
_additional := graphql.Field{
Name:"_additional", Fields:[]graphql.Field{
{Name:"certainty"},
},
}

concepts :=[]string{"travelling in Asia"}
certainty :=float32(0.7)
moveTo :=&graphql.MoveParameters{
Objects:[]graphql.MoverObject{
// this ID is of the article: "Tohoku: A Japan destination for all seasons."
{ID:"c4209549-7981-3699-9648-61a78c2124b9"},
},
Force:0.85,
}
nearText := client.GraphQL().NearTextArgBuilder().
WithConcepts(concepts).
WithCertainty(certainty).
WithMoveTo(moveTo)

ctx := context.Background()

result, err := client.GraphQL().Get().
WithClassName(className).
WithFields(title, summary, _additional).
WithNearText(nearText).
Do(ctx)

if err !=nil{
panic(err)
}
fmt.Printf("%v", result)
}
# The ID belongs to the article "Tohoku: A Japan destination for all seasons."

echo'{
"query": "{
Get {
Article(
nearText: {
concepts: [\"travelling in Asia\"],
certainty: 0.7,
moveTo: {
objects: [{
id: \"c4209549-7981-3699-9648-61a78c2124b9\"
}]
force: 0.85
}
}
) {
title
summary
_additional {
certainty
}
}
}
}"
}'|curl\
-X POST \
-H'Content-Type: application/json'\
-H'Authorization: Bearer learn-weaviate'\
-H"X-OpenAI-Api-Key: $OPENAI_API_KEY"\
-d @- \
https://edu-demo.weaviate.network/v1/graphql
{
Get{
Article(
nearText:{
concepts:["travelling in Asia"],
certainty:0.7,
moveTo:{
objects:[{
# this ID is of the article:
# "Tohoku: A Japan destination for all seasons."
id:"c4209549-7981-3699-9648-61a78c2124b9"
}]
force:0.85
}
}
){
title
summary
_additional{
certainty
}
}
}
}

Additional information

Concept parsing

A nearText query will interpret each term in an array input as distinct strings to be vectorized. If multiple strings are passed, the query vector will be an average vector of the individual string vectors.

  • ["New York Times"] = one vector position is determined based on the occurrences of the words
  • ["New", "York", "Times"] = all concepts have a similar weight.
  • ["New York", "Times"] = a combination of the two above.

A practical example would be: concepts: ["beatles", "John Lennon"]

Semantic Path
  • Only available in txt2vec-contextionary module

The semantic path returns an array of concepts from the query to the data object. This allows you to see which steps Weaviate took and how the query and data object are interpreted.

PropertyDescription
conceptthe concept that is found in this step.
distanceToNextthe distance to the next step (null for the last step).
distanceToPreviousthis distance to the previous step (null for the first step).
distanceToQuerythe distance of this step to the query.
distanceToResultthe distance of the step to this result.

Note: Building a semantic path is only possible if a nearText: {} operator is set as the explore term represents the beginning of the path and each search result represents the end of the path. Since nearText: {} queries are currently exclusively possible in GraphQL, the semanticPath is therefore not available in the REST API.

Example: showing a semantic path without edges.

👁 py docs
  API docs
More infoCode snippets in the documentation reflect the latest client library and Weaviate Database version. Check the Release notes for specific versions.

If a snippet doesn't work or you have feedback, please open a GitHub issue.
import weaviate
import weaviate.classes as wvc
import os

client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": os.getenv("OPENAI_API_KEY")
}
)

try:
# Semantic path is not yet supported by the V4 client. Please use a raw GraphQL query instead.
response = client.graphql_raw_query(
"""
{
Get {
Publication (
nearText:{
concepts: ["fashion"],
distance: 0.6,
moveAwayFrom: {
concepts: ["finance"],
force: 0.45
},
moveTo: {
concepts: ["haute couture"],
force: 0.85
}
}
) {
name
_additional {
semanticPath {
path {
concept
distanceToNext
distanceToPrevious
distanceToQuery
distanceToResult
}
}
}
}
}
}
"""
)

finally:
client.close()
package main

import(
"context"
"fmt"

"github.com/weaviate/weaviate-go-client/v5/weaviate"
"github.com/weaviate/weaviate-go-client/v5/weaviate/graphql"
)

funcmain(){
cfg := weaviate.Config{
Host:"localhost:8080",
Scheme:"http",
}
client, err := weaviate.NewClient(cfg)
if err !=nil{
panic(err)
}

className :="Publication"
fields :=[]graphql.Field{
{Name:"name"},
{Name:"_additional", Fields:[]graphql.Field{
{Name:"semanticPath", Fields:[]graphql.Field{
{Name:"path", Fields:[]graphql.Field{
{Name:"concept"},
{Name:"distanceToNext"},
{Name:"distanceToPrevious"},
{Name:"distanceToQuery"},
{Name:"distanceToResult"},
}},
}},
}},
}

concepts :=[]string{"fashion"}
moveTo :=&graphql.MoveParameters{
Concepts:[]string{"haute couture"},
Force:0.85,
}
moveAwayFrom :=&graphql.MoveParameters{
Concepts:[]string{"finance"},
Force:0.45,
}
nearText := client.GraphQL().NearTextArgBuilder().
WithConcepts(concepts).
WithDistance(0.6).// prior to v1.14, use WithCertainty(0.7)
WithMoveTo(moveTo).
WithMoveAwayFrom(moveAwayFrom)

ctx := context.Background()

result, err := client.GraphQL().Get().
WithClassName(className).
WithFields(fields...).
WithNearText(nearText).
Do(ctx)

if err !=nil{
panic(err)
}
fmt.Printf("%v", result)
}
# Note: Under nearText, use `certainty` instead of `distance` prior to v1.14

echo'{
"query": "{
Get {
Publication (
nearText: {
concepts: [\"fashion\"],
distance: 0.6,
moveAwayFrom: {
concepts: [\"finance\"],
force: 0.45
},
moveTo: {
concepts: [\"haute couture\"],
force: 0.85
}
}
) {
name
_additional {
semanticPath{
path {
concept
distanceToNext
distanceToPrevious
distanceToQuery
distanceToResult
}
}
}
}
}
}"
}'|curl\
-X POST \
-H'Content-Type: application/json'\
-H'Authorization: Bearer learn-weaviate'\
-H"X-OpenAI-Api-Key: $OPENAI_API_KEY"\
-d @- \
https://edu-demo.weaviate.network/v1/graphql
{
Get{
Publication(
nearText:{
concepts:["fashion"],
distance:0.6,# prior to v1.14 use certainty: 0.7
moveAwayFrom:{
concepts:["finance"],
force:0.45
},
moveTo:{
concepts:["haute couture"],
force:0.85
}
}
){
name
_additional{
semanticPath{
path{
concept
distanceToNext
distanceToPrevious
distanceToQuery
distanceToResult
}
}
}
}
}
}

Depending on the vectorizer module, you can use additional modalities such as images, audio, or video as the query, and retrieve corresponding, compatible objects.

Some modules, such as multi2vec-clip and multi2vec-bind allow you to search across modalities. For example, you can search for images using a text query, or search for text using an image query.

For more information, see specific module pages such as these:

hybrid

This operator allows you to combine BM25 and vector search to get a "best of both worlds" type search results set.

Variables

VariablesRequiredTypeDescription
queryyesstringsearch query
alphanofloatweighting for each search algorithm, default 0.75
vectorno[float]optional to supply your own vector
propertiesno[string]list of properties to limit the BM25 search to, default all text properties
fusionTypenostringthe type of hybrid fusion algorithm (available from v1.20.0)
bm25SearchOperatornoobjectset how many of the (bm25) query tokens must be present within a single searched property for an object to be considered a match. (available from v1.31.0)
  • Notes:
    • alpha can be any number from 0 to 1, defaulting to 0.75.
      • alpha = 0 forces using a pure keyword search method (BM25)
      • alpha = 1 forces using a pure vector search method
      • alpha = 0.5 weighs the BM25 and vector methods evenly
    • fusionType can be rankedFusion or relativeScoreFusion
      • rankedFusion (default) adds inverted ranks of the BM25 and vector search methods
      • relativeScoreFusion adds normalized scores of the BM25 and vector search methods

Fusion algorithms

Ranked fusion

The rankedFusion algorithm is Weaviate's original hybrid fusion algorithm.

In this algorithm, each object is scored according to its position in the results for that search (vector or keyword). The top-ranked objects in each search get the highest scores. Scores decrease going from top to least ranked. The total score is calculated by adding the rank-based scores from the vector and keyword searches.

Relative score fusion

In relativeScoreFusion the vector search and keyword search scores are scaled between 0 and 1. The highest raw score becomes 1 in the scaled scores. The lowest value is assigned 0. The remaining values are ranked between 0 and 1. The total score is a scaled sum of the normalized vector similarity and normalized BM25 scores.

For a fuller discussion of fusion methods, see this blog post

Additional metadata response

Hybrid search results are sorted by a score, derived as a fused combination of their BM25F score and nearText similarity (higher is more relevant). This score, and additionally the explainScore metadata can be optionally retrieved in the response.

Example

👁 py docs
  API docs
More infoCode snippets in the documentation reflect the latest client library and Weaviate Database version. Check the Release notes for specific versions.

If a snippet doesn't work or you have feedback, please open a GitHub issue.
import weaviate
import weaviate.classes as wvc
import os

client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": os.getenv("OPENAI_API_KEY")
}
)

try:
collection = client.collections.use("Article")

response = collection.query.hybrid(
query="Fisherman that catches salmon",
alpha=0.5,
return_metadata=wvc.query.MetadataQuery(score=True, explain_score=True),
limit=5,
)

for o in response.objects:
print(o.properties)
print(o.metadata.score)
print(o.metadata.explain_score)

finally:
client.close()
hybrid :=&HybridArgumentBuilder{}
hybrid.WithQuery("Fisherman that catches salmon").WithAlpha(0.5)

query := builder.WithClassName("Article").WithHybrid(hybrid).build()

echo'{
"query": "{
Get {
Article(
hybrid: {
query: \"Fisherman that catches salmon\"
alpha: 0.5
}
) {
title
summary
_additional { score explainScore }
}
}
}"
}'|curl\
-X POST \
-H'Content-Type: application/json'\
-H'Authorization: Bearer learn-weaviate'\
-H"X-OpenAI-Api-Key: $OPENAI_API_KEY"\
-d @- \
https://edu-demo.weaviate.network/v1/graphql
{
Get{
Article(
hybrid:{
query:"Fisherman that catches salmon"
alpha:0.5
}
){
title
summary
_additional{score,explainScore}
}
}
}

Example with vector specified

You can optionally supply the vector query to the vector variable. This will override the query variable for the vector search component of the hybrid search.

👁 py docs
  API docs
More infoCode snippets in the documentation reflect the latest client library and Weaviate Database version. Check the Release notes for specific versions.

If a snippet doesn't work or you have feedback, please open a GitHub issue.
import weaviate
import weaviate.classes as wvc
import os

client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": os.getenv("OPENAI_API_KEY")
}
)

try:
collection = client.collections.use("Article")

response = collection.query.hybrid(
query="Fisherman that catches salmon",
vector=query_vector,
alpha=0.5,
return_metadata=wvc.query.MetadataQuery(score=True, explain_score=True),
limit=5,
)

for o in response.objects:
print(o.properties)
print(o.metadata.score)
print(o.metadata.explain_score)

finally:
client.close()
hybrid :=&HybridArgumentBuilder{}
hybrid.WithQuery("Fisherman that catches salmon").WithVector(1,2,3).WithAlpha(0.5)

query := builder.WithClassName("Article").WithHybrid(hybrid).build()
# The `vector` below is optional. Not needed if Weaviate handles the vectorization.
# If you provide your own embeddings, put the vector query there, and make sure it has the correct number of dimensions.
echo'{
"query": "{
Get {
Article(
hybrid: {
query: \"Fisherman that catches salmon\"
alpha: 0.5
vector: [1, 2, 3]
})
{
title
summary
_additional { score }
}
}
}"
}'|curl\
-X POST \
-H'Content-Type: application/json'\
-H'Authorization: Bearer learn-weaviate'\
-H"X-OpenAI-Api-Key: $OPENAI_API_KEY"\
-d @- \
https://edu-demo.weaviate.network/v1/graphql
{
Get{
Article(
hybrid:{
query:"Fisherman that catches salmon"
alpha:0.5
vector:[1,2,3]# optional. Not needed if Weaviate handles the vectorization. If you provide your own embeddings, put the vector query here.
})
{
title
summary
_additional{score}
}
}
}

Hybrid with a conditional filter

A conditional (where) filter can be used with hybrid.

👁 py docs
  API docs
More infoCode snippets in the documentation reflect the latest client library and Weaviate Database version. Check the Release notes for specific versions.

If a snippet doesn't work or you have feedback, please open a GitHub issue.
import weaviate
import weaviate.classes as wvc
import os

client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": os.getenv("OPENAI_API_KEY")
}
)

try:
collection = client.collections.use("Article")

response = collection.query.hybrid(
query="How to catch an Alaskan Pollock",
alpha=0.5,
filters=wvc.query.Filter.by_property("wordCount").less_than(1000),
limit=5,
)

for o in response.objects:
print(o.properties)

finally:
client.close()
where := filters.Where().
WithPath([]string{"content"}).
WithOperator(filters.Equal).
WithValueString("Alaskan")// All results must have "Alaskan" in the content property

name = graphql.Field{Name:"summary"}

hybrid :=&graphql.HybridArgumentBuilder{}
hybrid.WithQuery("How to catch an Alaskan Pollock").WithAlpha(0.5)

resultSet, gqlErr := client.GraphQL().Get().WithClassName("Article").WithHybrid(hybrid).WithWhere(where).WithFields(name).Do(context.Background())
articles := get["Article"].([]interface{})
echo'{
"query": "{
Get {
Article (
hybrid: { query: \"How to catch an Alaskan Pollock\", alpha: 0.5 }
where: { path: [\"wordCount\"], operator: LessThan, valueInt: 1000 }
) {
title
summary
}
}
}"
}'|curl\
-X POST \
-H'Content-Type: application/json'\
-H'Authorization: Bearer learn-weaviate'\
-H"X-OpenAI-Api-Key: $OPENAI_API_KEY"\
-d @- \
https://edu-demo.weaviate.network/v1/graphql
{
Get{
Article(
hybrid:{query:"how to fish",alpha:0.5}
where:{path:["wordCount"],operator:LessThan,valueInt:1000}
){
title
summary
}
}
}

A hybrid operator can accept an array of strings to limit the set of properties for the BM25 component of the search. If unspecified, all text properties will be searched.

👁 py docs
  API docs
More infoCode snippets in the documentation reflect the latest client library and Weaviate Database version. Check the Release notes for specific versions.

If a snippet doesn't work or you have feedback, please open a GitHub issue.
import weaviate
import weaviate.classes as wvc
import os

client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": os.getenv("OPENAI_API_KEY")
}
)

try:
collection = client.collections.use("JeopardyQuestion")

response = collection.query.hybrid(
query="Venus",
alpha=0.25,
query_properties=["question"],
return_metadata=wvc.query.MetadataQuery(score=True),
limit=5,
)

for o in response.objects:
print(o.properties)
print(o.metadata.score)

finally:
client.close()
echo'{
"query": "{
Get {
JeopardyQuestion (
hybrid: {
query: \"Venus\"
alpha: 0.25
properties: [\"question\"]
}
limit: 3
)
{
question
answer
_additional { score }
}
}
}"
}'|curl\
-X POST \
-H'Content-Type: application/json'\
-H'Authorization: Bearer learn-weaviate'\
-H"X-OpenAI-Api-Key: $OPENAI_API_KEY"\
-d @- \
https://edu-demo.weaviate.network/v1/graphql
{
Get{
JeopardyQuestion(
hybrid:{
query:"Venus"
alpha:0.25# closer to pure keyword search
properties:["question"]# changing to "answer" will yield a different result set
}
limit:3
){
question
answer
_additional{
score
}
}
}
}

Oversearch with relativeScoreFusion

When relativeScoreFusion is used as the fusionType with a small search limit, a result set can be very sensitive to the limit parameter due to the normalization of the scores.

To mitigate this effect, Weaviate automatically performs a search with a higher limit (100) and then trims the results down to the requested limit.

BM25 search operator

Added in v1.31

Use bm25SearchOperator to set how many of the query tokens must be present within a single searched property for an object to be considered a match in the keyword (bm25) search portion of the hybrid search. This is useful when you want to ensure that only objects with a certain number of relevant keywords are returned.

The available options are And, or Or. With And, all of the query tokens must appear together within a single searched property; tokens spread across different properties do not match. If Or is set, an additional parameter minimumOrTokensMatch must be specified, which defines how many of the query tokens must be present within a single searched property for the object to be considered a match.

If not set, the keyword search behaves as if Or was set with a minimumOrTokensMatch of 1.

BM25

The bm25 operator performs a keyword (sparse vector) search, and uses the BM25F ranking function to score the results. BM25F (Best Match 25 with Extension to Multiple Weighted Fields) is an extended version of BM25 that applies the scoring algorithm to multiple fields (properties), producing better results.

The search is case-insensitive, and case matching does not confer a score advantage. Stop words are removed. Stemming is not supported yet.

Schema configuration

The free parameters k1 and b are configurable and optional. See the schema reference for more details.

Variables

The bm25 operator supports the following variables:

VariablesRequiredDescription
queryyesThe keyword search query.
propertiesnoArray of properties (fields) to search in, defaulting to all properties in the collection.
searchOperatornoset how many of the query tokens must be present within a single searched property for an object to be considered a match. (available from v1.31.0)
Boosting properties

Specific properties can be boosted by a factor specified as a number after the caret sign, for example properties: ["title^3", "summary"].

Additional metadata response

The BM25F score metadata can be optionally retrieved in the response. A higher score indicates higher relevance.

Example query

👁 py docs
  API docs
More infoCode snippets in the documentation reflect the latest client library and Weaviate Database version. Check the Release notes for specific versions.

If a snippet doesn't work or you have feedback, please open a GitHub issue.
import weaviate
import weaviate.classes as wvc
import os

client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": os.getenv("OPENAI_API_KEY")
}
)

try:
collection = client.collections.use("Article")

response = collection.query.bm25(
query="fox",
query_properties=["title"],
return_metadata=wvc.query.MetadataQuery(score=True),
limit=5,
)

for o in response.objects:
print(o.properties)
print(o.metadata.score)

finally:
client.close()
package main

import(
"context"
"fmt"

"github.com/weaviate/weaviate-go-client/v5/weaviate"
"github.com/weaviate/weaviate-go-client/v5/weaviate/graphql"
)

funcmain(){
cfg := weaviate.Config{
Host:"localhost:8080",
Scheme:"http",
}
client, err := weaviate.NewClient(cfg)
if err !=nil{
panic(err)
}

className :="Article"

title := graphql.Field{Name:"title"}
_additional := graphql.Field{
Name:"_additional", Fields:[]graphql.Field{
{Name:"score"},
},
}

query :="fox"
properties :=[]string{"title"}
bm25 := client.GraphQL().Bm25ArgBuilder().
WithQuery(query).
WithProperties(properties...)

ctx := context.Background()

result, err := client.GraphQL().Get().
WithClassName(className).
WithFields(title, _additional).
WithBM25(bm25).
Do(ctx)

if err !=nil{
panic(err)
}
fmt.Printf("%v", result)
}
echo'{
"query": "{
Get {
Article(
bm25: {
query: \"fox\",
properties: [\"title\"],
}
) {
title
_additional {
score
}
}
}
}"
}'|curl\
-X POST \
-H'Content-Type: application/json'\
-H'Authorization: Bearer learn-weaviate'\
-d @- \
https://edu-demo.weaviate.network/v1/graphql
{
Get{
Article(
bm25:{
query:"fox",
properties:["title"]
}
){
title
_additional{
score
}
}
}
}

BM25 with a conditional filter

A conditional (where) filter can be used with bm25.

👁 py docs
  API docs
More infoCode snippets in the documentation reflect the latest client library and Weaviate Database version. Check the Release notes for specific versions.

If a snippet doesn't work or you have feedback, please open a GitHub issue.
import weaviate
import weaviate.classes as wvc
import os

client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": os.getenv("OPENAI_API_KEY")
}
)

try:
collection = client.collections.use("Article")

response = collection.query.bm25(
query="how to fish",
return_metadata=wvc.query.MetadataQuery(score=True),
filters=wvc.query.Filter.by_property("wordCount").less_than(1000),
limit=5,
)

for o in response.objects:
print(o.properties)
print(o.metadata.score)

finally:
client.close()
resultSet, gqlErr := client.GraphQL().Get().WithClassName("Article").WithHybrid(hybrid).WithWhere(where).WithFields(name).Do(context.Background())

where := filters.Where().
WithPath([]string{"wordCount"}).
WithOperator(filters.LessThan).
WithValueInt(1000)

name = graphql.Field{Name:"summary"}// the output field

bm25B :=&BM25ArgumentBuilder{}
bm25B = bm25B.WithQuery("How to fish").WithProperties("title","summary")

resultSet, gqlErr := client.GraphQL().Get().WithClassName("Article").WithBM25(bm25B).WithWhere(where).WithFields(name).Do(context.Background())
articles := get["Article"].([]interface{})
echo'{
"query": "{
Get {
Article(
bm25: { query: \"how to fish\", properties: [\"title\"] }
where: { path: [\"wordCount\"], operator: LessThan, valueInt: 1000 }
) {
summary
title
}
}
}"
}'|curl\
-X POST \
-H'Content-Type: application/json'\
-H'Authorization: Bearer learn-weaviate'\
-d @- \
https://edu-demo.weaviate.network/v1/graphql
{
Get{
Article(
bm25:{query:"how to fish",properties:["title"]}
where:{path:["wordCount"],operator:LessThan,valueInt:1000}
){
summary
title
}
}
}

Search operator

Added in v1.31

Use searchOperator to set how many of the query tokens must be present within a single searched property for an object to be considered a match. This is useful when you want to ensure that only objects with a certain number of relevant keywords are returned.

The available options are And, or Or. With And, all of the query tokens must appear together within a single searched property; tokens spread across different properties do not match. If Or is set, an additional parameter minimumOrTokensMatch must be specified, which defines how many of the query tokens must be present within a single searched property for the object to be considered a match.

If not set, the keyword search behaves as if Or was set with a minimumOrTokensMatch of 1.

ask

Enabled by the module: Question Answering.

This operator allows you to return answers to questions by running the results through a Q&A model.

Variables

VariableRequiredTypeDescription
questionyesstringThe question to be answered.
certaintynofloatDesired minimal certainty or confidence of answer to the question. The higher the value, the stricter the search becomes. The lower the value, the fuzzier the search becomes. If no certainty is set, any answer that could be extracted will be returned.
propertiesno[string]The properties of the queries collection which contains text. If no properties are set, all are considered.
reranknobooleanIf enabled, the qna module will rerank the result based on the answer score. For example, if the 3rd result - as determined by the previous (semantic) search contained the most likely answer, result 3 will be pushed to position 1, etc. Supported since v1.10.0

Example

👁 py docs
  API docs
More infoCode snippets in the documentation reflect the latest client library and Weaviate Database version. Check the Release notes for specific versions.

If a snippet doesn't work or you have feedback, please open a GitHub issue.
import weaviate
import weaviate.classes as wvc
import os

client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": os.getenv("OPENAI_API_KEY")
}
)

try:
# QnA module use is not yet supported by the V4 client. Please use a raw GraphQL query instead.
response = client.graphql_raw_query(
"""
{
Get {
Article(
ask: {
question: "Who is the king of the Netherlands?",
properties: ["summary"],
},
limit: 1
) {
title
_additional {
answer {
hasAnswer
property
result
startPosition
endPosition
}
}
}
}
}
"""

finally:
client.close()
package main

import(
"context"
"fmt"

"github.com/weaviate/weaviate-go-client/v5/weaviate"
"github.com/weaviate/weaviate-go-client/v5/weaviate/graphql"
)

funcmain(){
cfg := weaviate.Config{
Host:"localhost:8080",
Scheme:"http",
}
client, err := weaviate.NewClient(cfg)
if err !=nil{
panic(err)
}

className :="Article"
fields :=[]graphql.Field{
{Name:"title"},
{Name:"_additional", Fields:[]graphql.Field{
{Name:"answer", Fields:[]graphql.Field{
{Name:"hasAnswer"},
{Name:"certainty"},
{Name:"property"},
{Name:"result"},
{Name:"startPosition"},
{Name:"endPosition"},
}},
}},
}
ask := client.GraphQL().AskArgBuilder().
WithQuestion("Who is the king of the Netherlands?").
WithProperties([]string{"summary"})
ctx := context.Background()

result, err := client.GraphQL().Get().
WithClassName(className).
WithFields(fields...).
WithAsk(ask).
WithLimit(1).
Do(ctx)

if err !=nil{
panic(err)
}
fmt.Printf("%v", result)
}
echo'{
"query": "{
Get {
Article(
ask: {
question: \"Who is the king of the Netherlands?\",
properties: [\"summary\"]
},
limit: 1
) {
title
_additional {
answer {
hasAnswer
property
result
startPosition
endPosition
}
}
}
}
}
"
}'|curl\
-X POST \
-H'Content-Type: application/json'\
-H'Authorization: Bearer learn-weaviate'\
-H"X-OpenAI-Api-Key: $OPENAI_API_KEY"\
-d @- \
https://edu-demo.weaviate.network/v1/graphql
{
Get{
Article(
ask:{
question:"Who is the king of the Netherlands?",
properties:["summary"],
},
limit:1
){
title
_additional{
answer{
hasAnswer
property
result
startPosition
endPosition
}
}
}
}
}

Additional metadata response

The answer and a certainty can be retrieved.

Questions and feedback

Have a question or feedback? Here's how to reach us.