We use text and keyword fields to store words differently so we can search and sort data easily.
Text vs keyword field types in Elasticsearch
{
"mappings": {
"properties": {
"field_name": {
"type": "text" | "keyword"
}
}
}
}text fields are analyzed and broken into words for full-text search.
keyword fields are not analyzed and stored as exact values for filtering and sorting.
description field as text for full-text search.{
"mappings": {
"properties": {
"description": {
"type": "text"
}
}
}
}country field as keyword for exact matching and sorting.{
"mappings": {
"properties": {
"country": {
"type": "keyword"
}
}
}
}text and keyword fields in one mapping.{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"status": {
"type": "keyword"
}
}
}
}This mapping sets comment as text for searching words inside comments, and user_id as keyword for exact user ID filtering.
{
"mappings": {
"properties": {
"comment": {
"type": "text"
},
"user_id": {
"type": "keyword"
}
}
}
}Use text fields when you want to search inside the content.
Use keyword fields when you want to filter, sort, or aggregate exact values.
Sometimes you can use both types on the same data by using multi-fields.
Text fields break content into words for searching.
Keyword fields store exact values for filtering and sorting.
Choose the field type based on how you want to use the data.
Practice
Solution
Step 1: Understand the purpose of text fields
Text fields are designed for full-text search, allowing analysis and tokenization of sentences.Step 2: Compare with keyword fields
Keyword fields are for exact matches and do not analyze the text, so they are not suitable for searching inside sentences.Final Answer:
text -> Option AQuick Check:
Full-text search = text [OK]
- Choosing keyword for full-text search
- Confusing integer or date types with text
- Thinking keyword fields tokenize text
Solution
Step 1: Recall Elasticsearch field types
Elasticsearch uses "keyword" as the type for exact match fields.Step 2: Identify the correct syntax
"keyword" is the correct type name; "text" is for analyzed fields, "string" and "fulltext" are invalid types.Final Answer:
"name": { "type": "keyword" } -> Option BQuick Check:
Keyword field syntax = "name": { "type": "keyword" } [OK]
- Using "string" instead of "keyword"
- Confusing "text" with "keyword"
- Using invalid type names like "fulltext"
{
"properties": {
"title": { "type": "text" },
"category": { "type": "keyword" }
}
}
Which query will correctly filter documents where category is exactly "books"?Solution
Step 1: Identify field types and query types
"category" is a keyword field, so exact match queries use "term" query.Step 2: Match query usage
"match" queries are for full-text search on text fields, not exact matches on keyword fields.Final Answer:
{ "term": { "category": "books" } } -> Option AQuick Check:
Exact filter on keyword = term query [OK]
- Using match query on keyword fields
- Filtering text fields with term query expecting full-text search
- Confusing field names in queries
{
"properties": {
"username": { "type": "keyword" },
"bio": { "type": "text" }
}
}
A developer tries to filter users with username containing "john" using this query:
{ "match": { "username": "john" } }
Why does this query not work as expected?Solution
Step 1: Understand keyword field behavior
Keyword fields are not analyzed and do not support partial matching with match query.Step 2: Understand match query limitations
Match query analyzes input and is meant for text fields, not keyword fields which require term or wildcard queries for partial matches.Final Answer:
Because match query does not work on keyword fields for partial matches -> Option CQuick Check:
Match query + keyword field = no partial match [OK]
- Thinking keyword fields support partial match with match query
- Confusing field types for filtering
- Using match query on numeric or date fields
Solution
Step 1: Understand the need for both full-text search and exact filtering
Full-text search requires text type; exact filtering requires keyword type.Step 2: Use multi-fields to support both
Mapping with "text" type and a subfield "raw" as "keyword" allows searching inside tags and filtering/sorting by exact tag.Final Answer:
"tags": { "type": "text", "fields": { "raw": { "type": "keyword" } } } -> Option DQuick Check:
Multi-fields = text + keyword for search and filter [OK]
- Using only text type and expecting exact filters
- Using only keyword type and expecting full-text search
- Not defining subfields for multi-purpose queries
Ready to prove it?
Pass the test and this pattern moves unknown
