2013-07-19 2 views
1

Je souhaite copier un champ et lui appliquer un analyseur supplémentaire dans la copie. Alors que je sais comment faire la copie (<copyField source="source" dest="dest") ce que je veux vraiment faire est d'exécuter un analyseur différent sur la copie (ASCIIFoldingFilterFactory).Appliquer une analyse à copyfield

Comment puis-je modifier le type de copyField afin de pouvoir exécuter cet analyseur supplémentaire?
Dois-je même changer de type ou puis-je simplement faire fonctionner un analyseur supplémentaire? Je crois que je peux en quelque sorte pirater ensemble en utilisant un champ dynamique qui correspondra au nom du champ de copie, puis changer le type de cette façon, mais cela ne créera-t-il pas une copie supplémentaire de mes données?

Répondre

3

Vous avez juste besoin de définir un nouveau type de champ et déclarer votre copyField comme étant de ce type.

Par exemple, ci-dessous text_syn est un type qui applique un ensemble d'analyseurs et text_stop_syn_stem est un autre type, qui a plusieurs analyseurs (pour l'enlèvement arrêt de texte et issu):

<types> 
    ... 
    <fieldType name="text_syn" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/> 
      <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
      <filter class="solr.LowerCaseFilterFactory"/>   
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
      <filter class="solr.ASCIIFoldingFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/> 
      <filter class="solr.LowerCaseFilterFactory"/>   
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
      <filter class="solr.ASCIIFoldingFilterFactory"/> 
     </analyzer> 
    </fieldType> 

    <fieldType name="text_stop_syn_stem" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
      <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
      <filter class="solr.PorterStemFilterFactory"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
      <filter class="solr.ASCIIFoldingFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
      <filter class="solr.PorterStemFilterFactory"/>   
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
      <filter class="solr.ASCIIFoldingFilterFactory"/> 
     </analyzer> 
    </fieldType> 
    ... 
</types> 

Dans les champs, nous avons obtenu:

<field name="name_syn" type="text_syn" indexed="true" stored="true" /> 
<field name="name_stop_syn_stem" type="text_stop_syn_stem" indexed="true" stored="false" /> 

et copyField est comme:

<copyField source="name_syn" dest="name_stop_syn_stem" /> 
Questions connexes