2010-01-12 9 views
20

¿Cómo puedo crear una copia de un campo de cadena en forma insensible a las mayúsculas y minúsculas? Quiero usar el tipo típico de "cadena" y un tipo de distinción entre mayúsculas y minúsculas. Los tipos se definen así:¿Cómo crear una copia insensible a mayúsculas y minúsculas de un campo de cadena en SOLR?

<fieldType name="string" class="solr.StrField" 
     sortMissingLast="true" omitNorms="true" /> 

    <!-- A Case insensitive version of string type --> 
    <fieldType name="string_ci" class="solr.StrField" 
     sortMissingLast="true" omitNorms="true"> 
     <analyzer type="index"> 
      <tokenizer class="solr.KeywordTokenizerFactory"/>   
      <filter class="solr.LowerCaseFilterFactory" /> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.KeywordTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory" /> 
     </analyzer> 
    </fieldType> 

Y un ejemplo del campo de este modo:

<field name="destANYStr" type="string" indexed="true" stored="true" 
    multiValued="true" /> 
<!-- Case insensitive version --> 
<field name="destANYStrCI" type="string_ci" indexed="true" stored="false" 
    multiValued="true" /> 

He intentado utilizar CopyField así:

<copyField source="destANYStr" dest="destANYStrCI" /> 

Pero, al parecer CopyField se llama en origen y destino antes de invocar cualquier analizador, así que aunque he especificado que dest no distingue entre mayúsculas y minúsculas a través de anaylyzers, se preserva el caso de los valores copiados del campo fuente.

Espero evitar volver a transmitir el valor en el campo del cliente, en el momento de creación del registro.

Respuesta

45

Sin respuestas de SO, hice un seguimiento en la lista de usuarios SOLR. Descubrí que mi campo string_ci no funcionaba como se esperaba antes de considerar los efectos de copyField. Ahmet Arslan explica por qué el campo "string_ci" debe utilizar solr.TextField y no solr.StrField:

De Apache Solr-1.4.0-\ ejemplo \ Solr \ conf \ schema.xml:

"El tipo StrField no se analiza, sino que se indexa/almacena al pie de la letra".

"solr.TextField permite la especificación de analizadores de texto personalizados especificados como tokenizer y una lista de filtros token".

Con un ejemplo que produjo y un ligero ajuste por mí mismo, la siguiente definición de campo parece ser el truco, y ahora el CopyField funciona como se esperaba también.

<fieldType name="string_ci" class="solr.TextField" 
     sortMissingLast="true" omitNorms="true"> 
     <analyzer> 
      <tokenizer class="solr.KeywordTokenizerFactory"/>   
      <filter class="solr.LowerCaseFilterFactory" /> 
     </analyzer> 
    </fieldType> 

El campo destANYStrCI tendrá un valor almacenado caso conservado pero proporcionará una caja de campo insensible a buscar. CAVEAT: la búsqueda de comodín insensible a mayúsculas y minúsculas no se puede realizar dado que las frases de comodín omiten el analizador de consultas y no se mostrarán en minúsculas antes de coincidir con el índice. Esto significa que los caracteres en las frases comodín deben ser minúsculas para que coincidan.

+0

Buena respuesta. Especialmente omitNorms es útil para ahorrar memoria. –

5

Sí cierto. LowerCaseFilterFactory no se aplica al tipo de datos String. Solo pudimos aplicar LowerCaseFilterFactory en los campos de texto.

Si intenta hacerlo de esta manera

<!-- Assigning customised data type --> 
<field name="language" type="text_lower" indexed="true" stored="true" multiValued="false" default="en"/> 

<!-- Defining customised data type for lower casing. --> 
<fieldType name="text_lower" class="solr.String" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

No funcionaría, tenemos que usar TextField.

Pruebe de esta manera, debería funcionar. Sólo cambia el FieldType a partir String a TextField

<!-- Assigning customised data type --> 
 
<field name="language" type="text_lower" indexed="true" stored="true" multiValued="false" default="en"/> 
 

 
<!-- Defining customised data type for lower casing. --> 
 
<fieldType name="text_lower" class="solr.TextField" positionIncrementGap="100"> 
 
    <analyzer type="index"> 
 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
 
    <filter class="solr.LowerCaseFilterFactory"/> 
 
    </analyzer> 
 
    <analyzer type="query"> 
 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
 
    <filter class="solr.LowerCaseFilterFactory"/> 
 
    </analyzer> 
 
</fieldType>

+1

Esto no responde la pregunta. No puedes ordenar usando el campo de texto.A veces necesita la cadena –

+0

, la mejor opción es crear su propio contenedor en el campo de cadena y agregar el analizador de filtro para minúsculas. –

Cuestiones relacionadas