Field Attributes

Field attributes customize how Redis indexes and searches your data. Each field type has specific attributes that control indexing behavior, search capabilities, and storage options.

Common Attributes

These attributes are available on most non-vector field types (text, tag, numeric, geo).

sortable

Enables sorting results by this field. Without sortable, you cannot use the field in ORDER BY clauses.

Trade-off: Sortable fields consume additional memory to maintain a sorted index.

# YAML
- name: created_at
  type: numeric
  attrs:
    sortable: true
# Python
{"name": "created_at", "type": "numeric", "attrs": {"sortable": True}}

Use when: You need to sort search results by this field (e.g., "newest first", "highest price").

no_index

Stores the field without indexing it. The field value is available in search results but cannot be used in queries or filters.

Important: no_index only makes sense when combined with sortable: true. A field that is neither indexed nor sortable serves no purpose in the schema.

# YAML - Store for sorting but don't index for search
- name: internal_score
  type: numeric
  attrs:
    sortable: true
    no_index: true

Use when: You want to sort by a field but never filter on it, saving index space.

index_missing

Allows searching for documents that don’t have this field. When enabled, you can use ISMISSING queries to find documents where the field is absent or null.

# YAML
- name: optional_category
  type: tag
  attrs:
    index_missing: true
# Python
{"name": "optional_category", "type": "tag", "attrs": {"index_missing": True}}

Use when: Your data has optional fields and you need to query for documents missing those fields.

Query example:

from redisvl.query.filter import Tag

# Find documents where category is missing
filter_expr = Tag("optional_category").ismissing()

Text Field Attributes

Text fields support full-text search with these additional attributes.

weight

Controls the importance of this field in relevance scoring. Higher weights make matches in this field rank higher.

- name: title
  type: text
  attrs:
    weight: 2.0  # Title matches count double

- name: description
  type: text
  attrs:
    weight: 1.0  # Default weight

Use when: Some text fields are more important than others for search relevance.

no_stem

Disables stemming for this field. By default, Redis applies stemming so "running" matches "run". Disable when exact word forms matter.

- name: product_code
  type: text
  attrs:
    no_stem: true

Use when: Field contains codes, identifiers, or technical terms where stemming would cause incorrect matches.

withsuffixtrie

Maintains a suffix trie for optimized suffix and contains queries. Enables efficient *suffix and *contains* searches.

- name: email
  type: text
  attrs:
    withsuffixtrie: true

Use when: You need to search for patterns like *@gmail.com or *smith*.

Trade-off: Increases memory usage and index build time.

phonetic_matcher

Enables phonetic matching using the specified algorithm. Matches words that sound similar.

- name: name
  type: text
  attrs:
    phonetic_matcher: "dm:en"  # Double Metaphone, English

Supported values: dm:en (Double Metaphone English), dm:fr (French), dm:pt (Portuguese), dm:es (Spanish)

Use when: Searching names or words where spelling variations should match (e.g., "Smith" matches "Smyth").

index_empty

Allows indexing and searching for empty strings. By default, empty strings are not indexed.

- name: middle_name
  type: text
  attrs:
    index_empty: true

Use when: Empty string is a meaningful value you need to query for.

unf (Un-Normalized Form)

Preserves the original value for sortable fields without normalization. By default, sortable text fields are lowercased for consistent sorting.

Requires: sortable: true

- name: title
  type: text
  attrs:
    sortable: true
    unf: true  # Keep original case for sorting

Use when: You need case-sensitive sorting or must preserve exact original values.

Tag Field Attributes

Tag fields are for exact-match filtering on categorical data.

separator

Specifies the character that separates multiple tags in a single field value. Default is comma (,).

- name: categories
  type: tag
  attrs:
    separator: "|"  # Use pipe instead of comma

Use when: Your tag values contain commas, or you’re using a different delimiter in your data.

case_sensitive

Makes tag matching case-sensitive. By default, tags are lowercased for matching.

- name: product_sku
  type: tag
  attrs:
    case_sensitive: true

Use when: Tag values are case-sensitive identifiers (SKUs, codes, etc.).

withsuffixtrie

Same as text fields—enables efficient suffix and contains queries on tags.

- name: email_domain
  type: tag
  attrs:
    withsuffixtrie: true

index_empty

Allows indexing empty tag values.

- name: optional_tags
  type: tag
  attrs:
    index_empty: true

Numeric Field Attributes

Numeric fields support range queries and sorting.

unf (Un-Normalized Form)

For sortable numeric fields, preserves the exact numeric representation without normalization.

Requires: sortable: true

- name: price
  type: numeric
  attrs:
    sortable: true
    unf: true

Note: Numeric fields do not support index_empty (empty numeric values are not meaningful).

Geo Field Attributes

Geo fields store geographic coordinates for location-based queries.

Geo fields support the common attributes (sortable, no_index, index_missing) but have no geo-specific attributes. The field value should be a string in "longitude,latitude" format.

- name: location
  type: geo
  attrs:
    sortable: true

Note: Geo fields do not support index_empty (empty coordinates are not meaningful).

Vector Field Attributes

Vector fields have a different attribute structure. See Schema for complete vector field documentation.

Key vector attributes:

  • dims: Vector dimensionality (required)
  • algorithm: flat, hnsw, or svs-vamana
  • distance_metric: COSINE, L2, or IP
  • datatype: float16, float32, float64, or bfloat16
  • index_missing: Allow searching for documents without vectors
- name: embedding
  type: vector
  attrs:
    algorithm: hnsw
    dims: 768
    distance_metric: cosine
    datatype: float32
    index_missing: true  # Handle documents without embeddings

Redis-Specific Subtleties

Modifier Ordering

RediSearch has specific requirements for the order of field modifiers. RedisVL handles this automatically, but it’s useful to understand:

Canonical order: INDEXEMPTYINDEXMISSINGSORTABLEUNFNOINDEX

If you’re debugging raw Redis commands, ensure modifiers appear in this order.

Field Type Limitations

Not all attributes work with all field types:

Attribute Text Tag Numeric Geo Vector
sortable
no_index
index_missing
index_empty
unf
withsuffixtrie

JSON Path for Nested Fields

When using JSON storage, use the path attribute to index nested fields:

- name: author_name
  type: text
  path: $.metadata.author.name
  attrs:
    sortable: true

The name becomes the field’s alias in queries, while path specifies where to find the data.

Complete Example

version: "0.1.0"
index:
  name: products
  prefix: product
  storage_type: json

fields:
  # Full-text searchable with high relevance
  - name: title
    type: text
    path: $.title
    attrs:
      weight: 2.0
      sortable: true

  # Exact-match categories
  - name: category
    type: tag
    path: $.category
    attrs:
      separator: "|"
      index_missing: true

  # Sortable price with range queries
  - name: price
    type: numeric
    path: $.price
    attrs:
      sortable: true

  # Store-only field for sorting
  - name: internal_rank
    type: numeric
    path: $.internal_rank
    attrs:
      sortable: true
      no_index: true

  # Vector embeddings
  - name: embedding
    type: vector
    path: $.embedding
    attrs:
      algorithm: hnsw
      dims: 768
      distance_metric: cosine

  # Location search
  - name: store_location
    type: geo
    path: $.location

Learn more: Schema provides the complete API reference for all field types and attributes.

RATE THIS PAGE
Back to top ↑