Introduction
Understanding Solr’s internal architecture helps you optimize queries and troubleshoot issues. This article explores how Solr achieves powerful search capabilities.
Apache Lucene Foundation
Solr is built on Apache Lucene:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Solr โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Request Handler โ โ
โ โ Query Parser โ โ
โ โ Response Writer โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Lucene Library โ โ
โ โ - IndexWriter โ โ
โ โ - IndexReader โ โ
โ โ - Searcher โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Inverted Index
How It Works
Documents:
1. "Solr is fast"
2. "Solr is powerful"
Inverted Index:
โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโ
โ Term โ Doc IDs โ
โโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโค
โ Solr โ 1, 2 โ
โ is โ 1, 2 โ
โ fast โ 1 โ
โ powerful โ 2 โ
โโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโ
Index Structure
Index (shard)
โโโ segments_1
โ โโโ segment_N.nvd (term vectors)
โ โโโ segment_N.nvm (term vector metadata)
โ โโโ segment_N.doc (stored fields)
โ โโโ segment_N.fdt (stored field data)
โ โโโ segment_N.fdx (stored field index)
โ โโโ segment_N.tip (term index)
โ โโโ segment_N.tbk (term block)
โโโ segments.gen
โโโ write.lock
Document Indexing
Index Pipeline
Document
โ
โผ
โโโโโโโโโโโโโโโ
โ Analyzer โโโโบ Tokenize, lowercase, stem
โโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโ
โ IndexWriterโโโโบ Build inverted index
โโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโ
โ Segment โโโโบ Write to segment
โโโโโโโโโโโโโโโ
Analysis Chain
// Field type with analyzer
{
"name": "title",
"type": "text_en",
"analyzer": {
"tokenizer": {
"type": "standard"
},
"filters": [
"lowercase",
"asciifolding",
"porter_stem"
]
}
}
Segment Merging
Merge Policy
// TieredMergePolicy (default)
{
"class": "solr.TieredMergePolicyFactory",
"maxMergeAtOnce": 10,
"segmentsPerTier": 10
}
// Optimize (force merge)
curl "http://localhost:8983/solr/gettingstarted/update?optimize=true"
Query Execution
Query Flow
โ
โผ
โ
Queryโโโโโโโโโโโโโโ
โ QueryParser โโโโบ Parse query syntax
โโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโ
โ BooleanQueryโโโโบ Build query plan
โโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโ
โ IndexReader โโโโบ Execute across segments
โโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโ
โ Scorer โโโโบ Score documents
โโโโโโโโโโโโโโโ
โ
โผ
Results
Caching
// Query result cache
<queryResultCache class="solr.LRUCache" size="10000"/>
// Filter cache
<filterCache class="solr.LRUCache" size="10000"/>
TF-IDF Scoring
Formula
Score(q,d) = sum(tf(t in d) * idf(t) * boost(t.field) * lengthNorm(t.field in d))
where:
- tf(t in d) = term frequency in document
- idf(t) = inverse document frequency
- lengthNorm = 1/sqrt(field length)
Conclusion
Understanding Solr’s internalsโLucene, inverted index, and query executionโhelps you design better schemas and optimize search performance.
Comments