2010-01-12 14 views
20

Come posso creare una copia di un campo stringa in caso di forma non sensibile? Voglio usare il tipico tipo "stringa" e un tipo maiuscole e minuscole. I tipi sono definiti in questo modo:Come creare una copia senza distinzione tra maiuscole e minuscole di un campo stringa in 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> 

e un esempio del campo in questo 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" /> 

Ho provato ad utilizzare CopyField in questo modo:

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

Ma, a quanto pare CopyField si chiama su source e dest prima che vengano invocati tutti gli analizzatori, quindi anche se ho specificato che dest non fa distinzione tra maiuscole e minuscole tramite anaylyzers, il caso dei valori copiati dal campo sorgente viene mantenuto.

Spero di evitare di ritrasmettere il valore sul campo dal client, al momento della creazione del record.

risposta

45

Senza risposte da SO, ho seguito l'elenco degli utenti SOLR. Ho scoperto che il mio campo string_ci non funzionava come previsto prima di considerare anche gli effetti di copyField. Ahmet Arslan spiega perché il campo "string_ci" dovrebbe usare solr.TextField e non solr.StrField:

Da apache-1.4.0-solr \ esempio \ solr \ conf \ schema.xml:

"Il tipo StrField non viene analizzato, ma indicizzato/archiviato letteralmente."

"solr.TextField consente la specifica di analizzatori di testo personalizzati specificati come tokenizer e un elenco di filtri token."

Con un esempio ha provato e una leggera modifica da solo, la seguente definizione del campo sembra fare il trucco e ora il CopyField funziona come previsto.

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

Il campo destANYStrCI avrà un valore caso conservato memorizzato, ma fornirà un caso insensibile campo per cercare. CAVEAT: la ricerca con caratteri jolly senza distinzione tra maiuscole e minuscole non può essere eseguita poiché le frasi con caratteri jolly ignorano l'analizzatore di query e non saranno in minuscolo prima della corrispondenza con l'indice. Ciò significa che i caratteri nelle frasi jolly devono essere in minuscolo per corrispondere.

+0

Buona risposta. Soprattutto omitNorms è utile, per risparmiare memoria. –

5

Sì vero. LowerCaseFilterFactory non si applica al tipo di dati String. Potremmo applicare LowerCaseFilterFactory solo sui campi di testo.

Se si tenta di fare in questo modo

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

Non funzionerebbe, dobbiamo usare TextField.

Provare in questo modo, dovrebbe funzionare. Basta cambiare il fieldType da String al 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

Questa non risponde alla domanda. Non è possibile ordinare utilizzando il campo di testo.A volte è necessario stringare –

+0

l'opzione migliore è quella di creare il proprio wrapper sul campo stringa e aggiungere l'analizzatore di filtri in minuscolo. –

Problemi correlati