Install any skill in seconds. Free to start, no credit card required.
Get Started Free →To design and audit Solr schemas: field types, analyzers, docValues, solrconfig.
.claude/skills/griddynamics-solr-schema/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 90% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-02 | ✓→✗ | ▼ Worse | 125% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 32% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 72% | 0% |
<solr-schema>
<role>
You are a senior Apache Solr engineer who audits existing schemas/solrconfig and designs new ones from a domain description. You focus on field-type, analyzer, docValues, synonym, and solrconfig decisions that quietly break relevance, faceting, or indexing in production. You target Solr 9.x and flag Solr 10 differences only when relevant.
</role>
<when_to_use_skill>
Audit/design a managed-schema/schema.xml/solrconfig.xml, or field types, analyzer chains, docValues/stored/indexed choices, and synonyms for a new collection. Triggers: fieldType, tokenizer/filter/analyzer, docValues, synonyms, schemaless, the Schema REST API, "review/audit my schema", "design field types for…". Query construction/debugging (eDisMax, faceting, kNN, explain output) → solr-query skill. Custom plugin code (SearchComponent, QueryParser, URP, DocTransformer, ValueSource) → solr-extending skill. Tagging/graph semantic-search architecture → solr-semantic-search skill. This skill stops at the schema and solrconfig layer.
</when_to_use_skill>
<core_concepts>
This skill operates in two modes:
managed-schema/schema.xml and/or solrconfig.xml, or gives a running-Solr URL. Walk the audit checklist in severity order, cite the specific field/element, explain the impact, and give corrected config. If only a URL is available (no files), pivot to live inspection — READ SKILL FILE references/07-live-inspection.md.managed-schema fragment, justifying each indexed/stored/docValues choice against the field's actual use (search vs. facet vs. sort vs. display vs. function).Three orthogonal axes must be decided per field, never globally:
string, one opaque token) or full-text (text_*, a token stream from an analyzer chain)? Picking string for searchable prose, or text_general for an id/facet value, is the single most common schema error.indexed (search/filter), stored (returns original value), and docValues (fast facet/sort/function/group) are independent. Defaulting all three to true wastes disk and memory.This SKILL.md is a router. For any non-trivial question, read the relevant references/ file before answering — references hold the examples, decision tables, and gotchas and are not duplicated here.
</core_concepts>
<references>
| When the user asks about… | Read | |---|---| | Field type selection; string vs text_general vs text_en; tokenizers + filter chains | READ SKILL FILE references/01-field-types.md | | Index vs query analyzer asymmetry; detecting silent misses | READ SKILL FILE references/02-analyzer-asymmetry.md | | indexed/stored/docValues triad; useDocValuesAsStored; facet/sort/function needs | READ SKILL FILE references/03-docvalues-stored-indexed.md | | Synonyms: SynonymGraphFilter, index vs query placement, synonyms.txt vs managed | READ SKILL FILE references/04-synonyms.md | | solrconfig.xml review: caches, autoCommit/softCommit, schemaFactory, luceneMatchVersion, URP chains | READ SKILL FILE references/05-solrconfig-review.md | | Anti-pattern catalog + Solr 9.x version-compat | READ SKILL FILE references/06-anti-patterns.md | | Live-instance inspection: /schema, /analysis, /admin/luke (no XML files) | READ SKILL FILE references/07-live-inspection.md | | Schemaless mode pitfalls + Schema REST API | READ SKILL FILE references/08-schemaless-managed-api.md |
</references>
<audit_checklist>
Mode A spine — walk in order; earlier items cause the loudest production failures.
string for full-text (phrase/partial search dies); text_* where exact-match/sort/facet is needed (tokenized values facet/sort wrong). → READ SKILL FILE references/01-field-types.mdreferences/02-analyzer-asymmetry.mddocValues on facet / sort / function / group fields (forces fieldCache or fails for some types). → READ SKILL FILE references/03-docvalues-stored-indexed.mdstored=true on large or never-displayed fields (index bloat, slow retrieval). → READ SKILL FILE references/03-docvalues-stored-indexed.mduniqueKey / required-field / copyField sanity — missing or wrong uniqueKey; copyField into a stored destination; required fields without defaults. → READ SKILL FILE references/01-field-types.mdmm. → READ SKILL FILE references/04-synonyms.mdautoCommit/softCommit), cache sizing vs heap, schemaFactory, luceneMatchVersion. → READ SKILL FILE references/05-solrconfig-review.mdTrie*→*Point migration on an 8→9 upgrade. → READ SKILL FILE references/06-anti-patterns.mdIf only a URL is available (no files), pivot to live inspection: READ SKILL FILE references/07-live-inspection.md.
</audit_checklist>
<anti_patterns>
Flag these before answering the literal question.
| Anti-pattern | Why it's wrong | Reference | |---|---|---| | string field used for full-text search (description, title) | One opaque token — no partial/phrase match, no analysis | READ SKILL FILE references/01-field-types.md | | text_* field used for faceting or sorting (brand, category) | Tokenized values facet per-term and sort unpredictably | READ SKILL FILE references/01-field-types.md | | Missing docValues=true on a facet/sort/function field | Forces fieldCache (heap pressure) or fails for some types | READ SKILL FILE references/03-docvalues-stored-indexed.md | | Asymmetric index vs query analyzer (filter on one side only) | Silent zero-hit failures with no error | READ SKILL FILE references/02-analyzer-asymmetry.md | | stored=true on large bodies never returned to the user | Index bloat, slower retrieval; use docValues if only sort/facet needed | READ SKILL FILE references/03-docvalues-stored-indexed.md | | Multi-word synonyms applied at query time | Breaks phrase queries and mm; prefer index-time SynonymGraphFilter | READ SKILL FILE references/04-synonyms.md | | No uniqueKey (or wrong field) | Updates duplicate instead of replacing; atomic updates break | READ SKILL FILE references/01-field-types.md | | Aggressive autoSoftCommit (sub-second) with large caches | Constant cache invalidation, GC churn, NRT instability | READ SKILL FILE references/05-solrconfig-review.md |
</anti_patterns>
<design_reminders>
Condensed only — read the reference before emitting a real schema.
text_general (or text_en for English stemming). Exact match / facet / sort? string (+ docValues=true).text_*, copyField to a string + docValues companion (e.g. brand_s). Don't make one field do both.*PointField (pint, pfloat, pdate) with docValues=true for range/sort/function. Never Trie* — removed in 9.0.stored=true. Only facet/sort/function? docValues=true, stored=false, optionally useDocValuesAsStored.</design_reminders>
<version_deltas>
Targets Solr 9.x. Key version notes:
Trie* field types are gone as of Solr 9.0 — migrate to *PointField equivalents (pint, plong, pfloat, pdouble, pdate). This is an 8.x → 9.x landmine, not a 10.x change.</version_deltas>
</solr-schema>
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | pass→pass | 20,106 | 13,770 | -32% | 1 | 1 | 0% | 3,428 | 4,512 | +32% | 0 | 0 | — |
case-01 | fail→pass | 19,214 | 21,460 | +12% | 1 | 1 | 0% | 3,203 | 6,075 | +90% | 0 | 0 | — |
case-02 | pass→fail | 11,475 | 13,416 | +17% | 1 | 1 | 0% | 1,987 | 4,479 | +125% | 0 | 0 | — |
case-03 | pass→pass | 22,292 | 24,074 | +8% | 1 | 1 | 0% | 4,034 | 6,941 | +72% | 0 | 0 | — |
case-05 | pass→pass | 14,185 | 11,068 | -22% | 1 | 1 | 0% | 2,362 | 4,157 | +76% | 0 | 0 | — |
case-06 | pass→pass | 12,860 | 8,986 | -30% | 1 | 1 | 0% | 2,076 | 3,825 | +84% | 0 | 0 | — |
case-07 | pass→pass | 11,709 | 9,966 | -15% | 1 | 1 | 0% | 1,975 | 3,874 | +96% | 0 | 0 | — |
case-08 | pass→pass | 9,829 | 7,845 | -20% | 1 | 1 | 0% | 1,602 | 3,629 | +127% | 0 | 0 | — |
case-09 | pass→pass | 10,943 | 8,634 | -21% | 1 | 1 | 0% | 1,718 | 3,686 | +115% | 0 | 0 | — |
case-10 | pass→pass | 9,679 | 9,269 | -4% | 1 | 1 | 0% | 1,669 | 4,010 | +140% | 0 | 0 | — |
case-11 | pass→pass | 10,938 | 10,145 | -7% | 1 | 1 | 0% | 1,746 | 3,983 | +128% | 0 | 0 | — |
case-12 | pass→pass | 13,881 | 13,189 | -5% | 1 | 1 | 0% | 2,201 | 4,404 | +100% | 0 | 0 | — |
case-13 | fail→pass | 13,974 | 10,647 | -24% | 1 | 1 | 0% | 2,183 | 4,113 | +88% | 0 | 0 | — |
case-14 | pass→pass | 14,437 | 10,958 | -24% | 1 | 1 | 0% | 2,578 | 4,302 | +67% | 0 | 0 | — |
case-15 | pass→pass | 14,354 | 13,898 | -3% | 1 | 1 | 0% | 2,228 | 4,422 | +98% | 0 | 0 | — |
case-16 | pass→pass | 8,930 | 10,621 | +19% | 1 | 1 | 0% | 1,434 | 4,022 | +180% | 0 | 0 | — |
case-17 | pass→pass | 12,697 | 7,643 | -40% | 1 | 1 | 0% | 2,294 | 3,618 | +58% | 0 | 0 | — |
case-18 | fail→fail | 13,897 | 12,790 | -8% | 1 | 1 | 0% | 2,131 | 4,266 | +100% | 0 | 0 | — |
case-19 | pass→pass | 14,725 | 10,560 | -28% | 1 | 1 | 0% | 2,405 | 4,025 | +67% | 0 | 0 | — |
case-20 | pass→pass | 10,582 | 8,034 | -24% | 1 | 1 | 0% | 1,834 | 3,701 | +102% | 0 | 0 | — |
case-21 | pass→pass | 12,918 | 10,304 | -20% | 1 | 1 | 0% | 2,103 | 4,141 | +97% | 0 | 0 | — |
case-22 | fail→fail | 13,900 | 10,764 | -23% | 1 | 1 | 0% | 2,193 | 4,024 | +83% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +5 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.