---
title: Indexing Text Arrays
description: Add text arrays to the index
canonical: https://docs.paradedb.com/documentation/indexing/indexing-arrays
---
The BM25 index accepts arrays of type `text[]` or `varchar[]`.
```sql
CREATE TABLE array_demo (id SERIAL PRIMARY KEY, categories TEXT[]);
INSERT INTO array_demo (categories) VALUES
('{"food","groceries and produce"}'),
('{"electronics","computers"}'),
('{"books","fiction","mystery"}');
```
```sql SQL
CREATE INDEX search_idx ON array_demo
USING bm25 (id, categories)
WITH (key_field = 'id');
```
```python Django
from django.db import connection
from paradedb.indexes import BM25Index
with connection.schema_editor() as schema_editor:
schema_editor.add_index(
ArrayDemo,
BM25Index(
fields={
"id": {},
"categories": {},
},
key_field="id",
name="search_idx",
),
)
```
```python SQLAlchemy
from sqlalchemy import Index
from paradedb.sqlalchemy import indexing
idx = Index(
"search_idx",
indexing.BM25Field(ArrayDemo.id),
indexing.BM25Field(ArrayDemo.categories),
postgresql_using="bm25",
postgresql_with={"key_field": "id"},
)
with engine.begin() as conn:
idx.create(conn)
```
```ruby Rails
ActiveRecord::Base.connection.add_bm25_index(
:array_demo,
fields: {
id: {},
categories: {}
},
key_field: :id,
name: :search_idx
)
```
Under the hood, each element in the array is indexed as a separate entry. This means that an array is considered a
match if **any** of its entries is a match.
```sql
SELECT * FROM array_demo WHERE categories === 'food';
```
```ini Expected Response
id | categories
----+--------------------------------
1 | {food,"groceries and produce"}
(1 row)
```
Text arrays can be [tokenized](/documentation/tokenizers/overview) and [filtered](/documentation/token-filters/overview) in the same way as text fields:
```sql SQL
CREATE INDEX search_idx ON array_demo
USING bm25 (id, (categories::pdb.literal))
WITH (key_field = 'id');
```
```python Django
from django.db import connection
from paradedb.indexes import BM25Index
with connection.schema_editor() as schema_editor:
schema_editor.add_index(
ArrayDemo,
BM25Index(
fields={
"id": {},
"categories": {"tokenizer": "literal"},
},
key_field="id",
name="search_idx",
),
)
```
```python SQLAlchemy
from sqlalchemy import Index
from paradedb.sqlalchemy import indexing
idx = Index(
"search_idx",
indexing.BM25Field(ArrayDemo.id),
indexing.BM25Field(
ArrayDemo.categories,
tokenizer=indexing.tokenize.literal(),
),
postgresql_using="bm25",
postgresql_with={"key_field": "id"},
)
with engine.begin() as conn:
idx.create(conn)
```
```ruby Rails
ActiveRecord::Base.connection.add_bm25_index(
:array_demo,
fields: {
id: {},
categories: { tokenizer: :literal }
},
key_field: :id,
name: :search_idx
)
```