In schema.xml wordt beschreven welke velden er zijn en van welk type. Er kunnen nieuwe typen worden gedefiniëerd en voor ieder type kan worden bepaald welke acties moeten worden uitgevoerd voordat het veld wordt geïndexeerd of gezocht.
Kort overzicht van schema.xml:
<schema>
<types>
<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="sint" class="solr.SortableIntField" />
<fieldType name="text" class="solr.TextField">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory"/>
</analyzer>
</fieldType>
<fields>
<field name="id" type="string" indexed="true" stored="true" required="true" />
<field name="body" type="text" indexed="true" stored="true" termVectors="true"/>
<copyField source="teaser" dest="text" maxChars="300" />
<dynamicField name="*_i" type="sint" indexed="true" stored="true"/>
</fields>
<uniqueKey>id </uniqueKey>
<defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="OR"/>
</schema>
Alle veldtypes in SolR moeten worden gedefiniëerd in een fieldType tag. Deze heeft als belangrijkste attributen name en class. De class is een Java-class.
Standaard solr-classes zijn: BCDIntField, BCDLongField, BCDStrField, BinaryField, BoolField, ByteField, DateField, DoubleField, ExternalFileField, FloatField, IntField. LongField, RandomSortField, ShortField, SortableDoubleField, SortableFloatField, SortableIntField, SortableLongField, StrField, TextField, TrieDateField, TrieDoubleField, TrieField, TrieFloatField , TrieIntField, TrieLongField, UUIDField.
TextField types kunnen een of meer analyzers hebben. Een analyzer kan een class zijn die afgeleid is van org.apache.lucene.analysis.Analyzer of een lijst van charFilters, Tokenizer en TokenFilters. Een analyzer kan voor indexeren (type="index") of voor zoeken (type="query") gebruikt worden, of voor beide (geen type-attribuut)
Voordat
een veld wordt geïndexeerd (of doorzocht) wordt de tekst in
"Tokens" omgezet. Er zijn veel mogelijkheden om te "tokenizen".
Voorbeelden
Let Op: Alle Tokenizers worden via een Factory aangeroepen.
Daarna kan de tekst bewerkt worden door tokens te
filteren.
Voorbeelden:
Nu we de typen hebben gedefinieerd kunne we velden gaan definieren.
Iedere veld heeft een name en een type.
Daarnaast kan een veld andere eigenschappen hebben zoals stored (het veld kan in een query worden opgehaald) of indexed (er kan op het veld worden gezocht).
Voorbeeld: <field name="price" type="sfloat" indexed="true" stored="true"/>
Met de copyField directive is het mogelijk bepaalde velden op meerder manier te analyseren of te combineren. Ook kan worden aangegeven hoevel tekens maximaal gekopieerd moeten worden.
Met
<dynamicField> kunnen velden worden gedefieerd waarvan de naam
(nog) niet bekend is. Met een wildcard kan worden aangegeven wlke
dynamische velden gemaakt moeten worden. Voorbeeld:
<dynamicField name="*_i" type="sint" indexed="true" stored="true"/>
maakt van ieder veld dat eindigt op _i een sortable integer field dat geindexeerd wordt en opgeslagen.