Full-text search engine concept in Elasticsearch - Time & Space Complexity
When using a full-text search engine like Elasticsearch, it is important to understand how the time it takes to find results changes as the amount of data grows.
We want to know how the search speed changes when we add more documents or search terms.
Analyze the time complexity of the following Elasticsearch query.
GET /library/_search
{
"query": {
"match": {
"content": "climate change"
}
}
}
This query searches the "library" index for documents containing the words "climate change" in the "content" field.
In this search, Elasticsearch looks through its inverted index to find documents matching the search words.
- Primary operation: Checking the posting lists for each search term and merging results.
- How many times: Once per search term, then combined across documents containing those terms.
As the number of documents grows, the posting lists for common words get longer, so more entries must be checked.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 documents | Few entries to check, very fast. |
| 1000 documents | More entries, takes longer but still quick. |
| 1,000,000 documents | Many entries, search takes noticeably more time. |
Pattern observation: The work grows roughly in proportion to how many documents contain the search terms.
Time Complexity: O(k + r)
This means the search time grows with the number of search terms (k) plus the number of matching documents (r).
[X] Wrong: "Searching always takes the same time no matter how many documents exist."
[OK] Correct: The search time depends on how many documents contain the search words, so more data usually means more work.
Understanding how search time grows helps you explain how search engines handle large data efficiently and why indexing matters.
What if we added a filter to only search documents from the last year? How would the time complexity change?
Practice
Solution
Step 1: Understand full-text search
Full-text search engines are designed to search text data quickly and efficiently.Step 2: Identify the main use case
They help find words or phrases inside large text collections, unlike storing media or calculations.Final Answer:
To quickly find words or phrases inside large amounts of text -> Option CQuick Check:
Full-text search = find words fast [OK]
- Confusing full-text search with media storage
- Thinking it does math calculations
- Assuming it builds website interfaces
Solution
Step 1: Review query types
Elasticsearch has different queries: term for exact matches, range for numbers, exists for presence.Step 2: Identify text search query
Thematchquery is designed to find words inside text fields using full-text search.Final Answer:
match -> Option BQuick Check:
Text search query = match [OK]
- Using term query for full-text search
- Confusing range query with text search
- Using exists query to find words
{
"query": {
"match": { "description": "fast car" }
}
}Solution
Step 1: Understand match query behavior
Thematchquery analyzes the input text and searches for documents containing any of the words.Step 2: Analyze the query text "fast car"
It looks for documents containing "fast" or "car", not necessarily as an exact phrase or order.Final Answer:
Searches documents where the description contains either "fast" or "car" -> Option DQuick Check:
Match query finds any matching words [OK]
- Assuming match query searches exact phrase
- Thinking it requires words in order
- Confusing with exists query
{
"query": {
"match": { "title": "" }
}
}
What is the likely problem?Solution
Step 1: Check the query input
The match query is given an empty string "" to search, which means no words to match.Step 2: Understand match query behavior with empty input
Match queries need some text to find matches; empty strings return no results.Final Answer:
The match query cannot search empty strings -> Option AQuick Check:
Empty match query = no results [OK]
- Thinking field name syntax is wrong
- Using range query for text fields
- Confusing term and match query roles
Solution
Step 1: Understand the requirement
You want documents containing "apple" but excluding those containing "fruit" in the same field.Step 2: Use bool query with must and must_not
The bool query allows combining conditions: must for required matches, must_not to exclude matches.Step 3: Analyze options
{ "query": { "bool": { "must": { "match": { "content": "apple" } }, "must_not": { "match": { "content": "fruit" } } } } } uses bool with must match "apple" and must_not match "fruit", which fits the requirement.Final Answer:
{ "query": { "bool": { "must": { "match": { "content": "apple" } }, "must_not": { "match": { "content": "fruit" } } } } } -> Option AQuick Check:
Bool must + must_not = include apple, exclude fruit [OK]
- Using match with both words includes fruit
- Using term query ignores text analysis
- Using range query on text fields is invalid
Ready to prove it?
Pass the test and this pattern moves unknown
