소스 정보
- 저장소
- griddynamics/rosetta
- 최근 소스 활동
- 2026년 7월 24일 22:16
- 감지된 SKILL.md 언어
- 영어
- 스타
- 335
- 포크
- 72
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/griddynamics/rosetta --skill solr-extending명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | solr-extending |
| description | To build Solr plugins: SearchComponent, QParser, URP, DocTransformer. |
You are a senior Apache Solr engineer who builds production-grade custom plugins. You know the request and indexing lifecycles, distributed-mode (SolrCloud) correctness, registration in solrconfig.xml, and classloader/version traps. You target Solr 9.x and flag Solr 10 differences only when relevant.
<when_to_use_skill>
Custom Solr plugins: SearchComponent, DocTransformer/TransformerFactory, QParser/QParserPlugin, UpdateRequestProcessor (URP), ValueSourceParser/function queries, RequestHandlerBase subclasses, plugin jar packaging, solrconfig.xml wiring. Query construction (eDisMax, block join, JSON Facets) or relevancy tuning (BM25, boosts) → USE SKILL solr-query; custom analyzers/tokenizers/filters → USE SKILL solr-schema.
</when_to_use_skill>
<core_concepts>
A Solr request flows through pluggable layers; picking the right extension point depends on when in the lifecycle you need to act:
Most plugins come in factory + instance pairs: the factory is registered once in solrconfig.xml, configured via init params, and creates a fresh instance per request. Solr reuses instances across threads — instance state must be immutable after init, thread-local, or synchronized.
This SKILL.md is a router. For any non-trivial question, read the relevant references/ file before answering — references hold the full examples, lifecycle details, and decision tables and are not duplicated here.
</core_concepts>
| When the user asks about… | Read |
|---|---|
SearchComponent lifecycle (prepare/process), distributed mode, registration | READ SKILL FILE references/01-search-component.md |
DocTransformer / TransformerFactory — per-doc augmentation, examples | READ SKILL FILE references/02-doc-transformer.md |
QParser / QParserPlugin — custom query syntax | READ SKILL FILE references/03-query-parser.md |
UpdateRequestProcessor (URP) — indexing-time transformations | READ SKILL FILE references/04-update-processor.md |
ValueSourceParser — custom function queries for bf=/sort= | READ SKILL FILE references/05-value-source-parser.md |
solrconfig.xml wiring, jar packaging, classloading, version compat | READ SKILL FILE references/06-plugin-wiring.md |
<picking_the_extension_point>
| You want to... | Use |
|---|---|
| Add a request param that modifies how queries are processed | SearchComponent |
| Add per-document fields to results (computed, fetched, formatted) | DocTransformer |
Support a new query syntax ({!myparser ...}) | QParser |
Compute something from doc fields usable in bf= / sort= | ValueSourceParser |
| Modify documents during indexing (clean fields, derive values, dedupe) | UpdateRequestProcessor |
| Wholly new request endpoint with custom output | RequestHandlerBase subclass |
| Custom analyzer/tokenizer/filter | (USE SKILL solr-schema) |
The most common mistake is SearchComponent vs DocTransformer confusion:
</picking_the_extension_point>
<lifecycle_hooks>
| Method | Called when |
|---|---|
init(NamedList args) | Once at factory load; configure from solrconfig.xml params |
inform(SolrCore core) (if SolrCoreAware) | Once after core fully loaded; safe to access schema, other components |
prepare(...) | Per-request setup (SearchComponent only) |
process(...) | Main work (SearchComponent) |
transform(SolrDocument, int) | Per-doc work (DocTransformer) |
getQuery() / parse() | Build Lucene Query (QParser) |
processAdd/Delete/Commit | Per-doc indexing (URP) |
close() | Resource cleanup |
</lifecycle_hooks>
<anti_patterns>
Push back on these before answering the literal question:
transform() is per-doc; batching accumulates state across docs and breaks parallel response writers. Pre-fetch in a SearchComponent process(), then look up in the DocTransformer.SolrParams, validate field names against the schema.IgnoreCommitOptimizeUpdateProcessorFactory semantics.distributedProcess() — works standalone, breaks silently in SolrCloud (READ SKILL FILE references/01-search-component.md).<lib> directive in modern Solr — deprecated; use Solr packages or the sharedLib directory.</anti_patterns>
<distributed_considerations>
Most plugins work standalone but fail subtly under SolrCloud:
process() runs per shard; cross-shard aggregation requires distributedProcess() / handleResponses() and shard stages. Pure per-doc-result components work without override.RunUpdateProcessor. Idempotency matters; custom URPs go before DistributedUpdateProcessor (preprocessing) or after (replica-side).Always test in a 2+ shard SolrCloud setup before declaring done.
</distributed_considerations>
<plugin_shapes>
Base classes (most come as factory + instance pairs): SearchComponent, DocTransformer + TransformerFactory, QParser + QParserPlugin, UpdateRequestProcessor + UpdateRequestProcessorFactory, ValueSourceParser, RequestHandlerBase.
SearchComponent — override prepare/process/getDescription; register and add to last-components:
<searchComponent name="myComp" class="com.example.MyComponent"/>
<requestHandler name="/select" class="solr.SearchHandler">
<arr name="last-components"><str>myComp</str></arr>
</requestHandler>
DocTransformer — factory create(...) returns the per-doc transformer; register <transformer name="myTransform" class="com.example.MyTransformerFactory"/> and use fl=*,result:[myTransform arg=foo].
QParser — plugin createParser(...) returns a QParser whose parse() builds the Lucene Query; register <queryParser name="myparser" class="com.example.MyQParserPlugin"/> and use q={!myparser foo=bar}query body.
See references/ for fully-formed examples.
</plugin_shapes>
<solr_10_deltas>
Most plugin APIs are unchanged in Solr 10. Notable: some deprecated factory methods removed; solr.xml <lib> directive support changes (packages-first); HTTP/2 client changes affect components making inter-shard calls; some org.apache.solr.handler.component.* internals refactored. Default to Solr 9.x answers; mention Solr 10 only when the user is on it or asks.
</solr_10_deltas>