Skip to main content
TopK supports keyword search with the BM25 ranking function. To perform a keyword search on your documents, use the match() function. Define a schema with a text() field and add a keyword_index():
from topk_sdk.schema import text, keyword_index

client.collections().create(
    "books",
    schema={
        "title": text().index(keyword_index()),
        "description": text().index(keyword_index()),
    },
)
To run a keyword search on the title and description fields using the match() function. We’ll query the collection to match the term "great" in the title field or the term "novel" in any of the keyword-indexed text fields:
from topk_sdk.query import select, fn, match, field

docs = client.collection("books").query(
    select(
        "title",
        "description",
        # Score documents using BM25 algorithm
        text_score=fn.bm25_score(),
    )
    # Filter documents that have the `great` keyword in the `title` field
    # or the `novel` in any of the text-indexed fields.
    .filter(
        match("great", field="title") | match("novel")
    )
    # Return top 10 documents with the highest text score
    .topk(field("text_score"), 10)
)

# Example result:

[
  {
    _id: '1',
    title: 'The Great Gatsby',
    description: 'A novel about a great man who wants to be rich and famous',
    text_score: 0.864456057548523
  },
  {
    _id: '2',
    title: 'The Catcher in the Rye',
    description: 'A novel about a boy who wants to be a writer',
    text_score: 0.1948474943637848,
  }
]
The match() function will by default execute against all fields with a keyword index.
TopK provides a powerful keyword search API allowing you to customize your search queries. Read more about keyword search here.