Skip to main content

Indexing

Weaviate supports several types of indexes.

  1. Vector indexes - a vector index (e.g. HNSW or flat) is used to serve all vector-search queries.
  2. Inverted indexes - inverted indexes enable BM25 queries, or speed up filtering.

You can configure indexes in Weaviate per collection.

Some things to bear in mind:

  • Especially for large datasets, configuring the indexes is important because the more you index, the more storage is needed.
  • A rule of thumb -- if you don't query over a specific field or vector space, don't index it.
  • One of Weaviate's unique features is how the indexes are configured (learn more about this here).

Vector indexes

A vector index is used to serve all vector-search queries. Weaviate supports multiple types of vector indexes:

  1. HNSW - an approximate nearest neighbor (ANN) search based vector index. HNSW indexes scale well with large datasets.
  2. Flat - a vector index that is used for brute-force searches. This is useful for small datasets.
  3. Dynamic - a vector index that is flat when the dataset is small and switches to HNSW when the dataset is large.

For more information on vector indexes, see the Vector Indexing page.

Inverted indexes

Configure the inverted index

There are three inverted index types in Weaviate:

  • indexSearchable - a searchable index for BM25 or hybrid search
  • indexFilterable - a match-based index for fast filtering by matching criteria
  • indexRangeFilters - a range-based index for filtering by numerical ranges

Each inverted index can be set to true (on) or false (off) on a property level. The indexSearchable and indexFilterable indexes are on by default, while the indexRangeFilters index is off by default.

The filterable indexes are only capable of filtering, while the searchable index can be used for both searching and filtering (though not as fast as the filterable index).

So, setting "indexFilterable": false and "indexSearchable": true (or not setting it at all) will have the trade-off of worse filtering performance but faster imports (due to only needing to update one index) and lower disk usage.

See the related how-to section to learn how to enable or disable inverted indexes on a property level.

A rule of thumb to follow when determining whether to switch off indexing is: if you will never perform queries based on this property, you can turn it off.

Inverted index types summary

Inverted index typeDescriptionApplicable data typesDefaultAvailability
indexSearchableA searchable index for BM25-suitable Map index for BM25 or hybrid searching.text, text[],truev1.19
indexFilterableA Roaring Bitmap index for match-based filtering.Everything except blob, geoCoordinates, object and phoneNumber data types including arrays thereoftruev1.19
indexRangeFiltersA Roaring Bitmap index for numerical range-based filtering.int, number and date onlyfalsev1.26
  • Enable one or both of indexFilterable and indexRangeFilters to index a property for faster filtering.
    • If only one is enabled, the respective index is used for filtering.
    • If both are enabled, indexRangeFilters is used for operations involving comparison operators, and indexFilterable is used for equality and inequality operations.

This chart shows which filter makes the comparison when one or both index type is true for an applicable property.

OperatorindexRangeFilters onlyindexFilterable onlyBoth enabled
EqualindexRangeFiltersindexFilterableindexFilterable
Not equalindexRangeFiltersindexFilterableindexFilterable
Greater thanindexRangeFiltersindexFilterableindexRangeFilters
Greater than equalindexRangeFiltersindexFilterableindexRangeFilters
Less thanindexRangeFiltersindexFilterableindexRangeFilters
Less than equalindexRangeFiltersindexFilterableindexRangeFilters

Inverted index for timestamps

You can also enable an inverted index to search based on timestamps.

Timestamps are currently indexed using the indexFilterable index.

Collections without indexes

If you don't want to set an index at all, this is possible too.

To create a collection without any indexes, skip indexing on the collection and on the properties.

{
"class": "Author",
"description": "A description of this collection, in this case, it's about authors",
"vectorIndexConfig": {
"skip": true // <== disable vector index
},
"properties": [
{
"indexFilterable": false, // <== disable filterable index for this property
"indexSearchable": false, // <== disable searchable index for this property
"dataType": [
"text"
],
"description": "The name of the Author",
"name": "name"
},
{
"indexFilterable": false, // <== disable filterable index for this property
"dataType": [
"int"
],
"description": "The age of the Author",
"name": "age"
},
{
"indexFilterable": false, // <== disable filterable index for this property
"dataType": [
"date"
],
"description": "The date of birth of the Author",
"name": "born"
},
{
"indexFilterable": false, // <== disable filterable index for this property
"dataType": [
"boolean"
],
"description": "A boolean value if the Author won a nobel prize",
"name": "wonNobelPrize"
},
{
"indexFilterable": false, // <== disable filterable index for this property
"indexSearchable": false, // <== disable searchable index for this property
"dataType": [
"text"
],
"description": "A description of the author",
"name": "description"
}
]
}

Further resources

Questions and feedback

If you have any questions or feedback, let us know in the user forum.