Discover why mixing up text and keyword fields can make your searches slow and messy--and how to fix it!
Text vs keyword field types in Elasticsearch - When to Use Which
Imagine you have a big list of book titles and author names stored in a database. You want to search for books by exact author names or find all titles containing certain words.
If you treat all data the same way, searching becomes slow and confusing. Exact matches fail because the system breaks text into pieces, and searching for parts of words or exact names gets mixed up. It's like trying to find a needle in a haystack without sorting the hay first.
Using text fields lets Elasticsearch analyze and break down sentences for full-text search, while keyword fields keep data exact for filtering and sorting. This way, you get fast, accurate searches and precise matches without confusion.
PUT books
{
"mappings": {
"properties": {
"author": { "type": "text" }
}
}
}PUT books
{
"mappings": {
"properties": {
"author": {
"type": "text",
"fields": {
"raw": { "type": "keyword" }
}
}
}
}
}This lets you search by words inside text and also filter or sort by exact values, making your searches smarter and faster.
When searching an online store, you want to find products by keywords in descriptions but also filter by exact brand names or categories. Text and keyword fields make this possible.
Text fields break down content for full-text search.
Keyword fields store exact values for filtering and sorting.
Using both together makes searching powerful and precise.
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
