2010-08-05 15 views
7

Quello che voglio essere in grado di fare è eseguire una query e ottenere risultati che non sono case sensitive e che corrispondono parole parziali dall'indice.Utilizzo di più tokenizer in Solr

Ho uno schema Solr impostato al momento che è stato modificato in modo da poter interrogare e restituire risultati, indipendentemente dal caso in cui si trovino. Quindi, se cerco iPOd, vedrò iPod restituito. Il codice per fare questo è:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    </analyzer> 
... 
</fieldType> 

ho trovato questo codice che ci permetterà di fare una query parziali parole partita, ma non credo che posso avere due tokenizers su un campo.

<fieldType name="text" class="solr.TextField" > 
    <analyzer type="index"> 
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
... 
</fieldType> 

Quindi, cosa posso fare per eseguire questo tokenizer sul campo?
O c'è un modo per unirli?
Oppure c'è un altro modo in cui posso portare a termine questo compito?

risposta

7

Dichiarare un altro fieldType (ovvero un nome diverso) con il tokenizer NGram, quindi dichiarare un campo che utilizza fieldType con NGram e un altro campo con fieldType standard "text". Utilizzare copyField per copiarne uno. Vedi Indexing same data in multiple fields.

+1

Ma in che modo interrogare ora in modo che i risultati verranno visualizzati in dati che sono stati tokenizzati con entrambi i tokenizer? In altre parole: come ottenere risultati da entrambi i tokenizer contemporaneamente? –

7

Un'alternativa sarebbe applicare EdgeGramFilterFacgtory al campo esistente e rimanere con il tokenizzatore corrente (WhitespaceTokenizerFactory), ad es.

<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> 

Questo avrebbe mantenuto invariato lo schema corrente, vale a dire che non avrebbe bisogno di un ulteriore campo che ha un altro tokenizer (NGramTokenizerFactory)

tuo campo aspetto poi qualcosa di simile al seguito:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    </analyzer> 
... 
</fieldType>