2010-08-05 4 views
7

Lo que quiero hacer es realizar una consulta y obtener resultados que no distinguen entre mayúsculas y minúsculas y que coinciden con palabras parciales del índice.Uso de varios tokenizadores en Solr

Tengo un esquema de Solr configurado en el momento que se ha modificado para que pueda consultar y devolver los resultados sin importar el caso. Entonces, si busco iPOd, veré el iPod devuelto. El código para hacer esto es:

<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> 

He encontrado el código que nos permitirá hacer una consulta coincidencia de palabra parcial, pero no creo que puedo tener dos tokenizers en 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> 

Entonces, ¿qué puedo hacer para realizar esta tokenizer en el campo, así?
¿O hay alguna forma de fusionarlos?
¿O hay otra forma en que pueda lograr esta tarea?

Respuesta

7

Declara otro fieldType (es decir, un nombre diferente) que tiene el tokenizer NGram, luego declara un campo que usa el fieldType con NGram y otro campo con el tipo de campo "text" estándar. Use copyField para copiar uno a otro. Ver Indexing same data in multiple fields.

+1

Pero ¿cómo ahora consultar eso para que los resultados se vean en los datos que se tokenized con ambos tokenizers? En otras palabras, ¿cómo obtener resultados de ambos tokenizers a la vez? –

7

Una alternativa sería aplicar EdgeGramFilterFacgtory al campo existente y permanecer con su tokenizador actual (WhitespaceTokenizerFactory), p.

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

Esto mantendría el esquema actual sin cambios, es decir, usted no necesitaría un campo adicional que tiene otro tokenizer (NGramTokenizerFactory)

Su mirada campo, entonces algo así como el siguiente:

<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>