Skip to main content
โšก Calmops

Solr Internals: Lucene, Indexing, and Search

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