2012-05-18 13 views

Respuesta

7

Hasta donde yo sé, no hay forma de hacer esto con el SynonymFilterFactory existente. Pero seguir es un truco que puede usar para obtener este comportamiento.

Digamos que su campo se llama title. Cree otro campo que sea una copia de esto, digamos title_synonyms. Ahora asegúrese de que SynonymFilterFactory se utiliza como analizador solo para title_synonyms (puede hacerlo utilizando diferentes tipos de campos para los dos campos, por ejemplo text y text_synonyms). Busque en estos dos campos pero aumente más el title que el title_synonyms.

A continuación se muestra las definiciones de campo:

<fieldType name="text" class="solr.TextField"> 
     <analyzer type="index"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
    </fieldType> 

    <fieldType name="text_synonyms" class="solr.TextField"> 
     <analyzer type="index"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.SynonymFilterFactory" synonyms="synonyms_index.txt" ignoreCase="true" expand="true"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.SynonymFilterFactory" synonyms="synonyms_query.txt" ignoreCase="true" expand="true"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
    </fieldType> 

Y aquí están las definiciones de campo de muestra:

<field name="title" type="text" stored="false" 
      required="true" multiValued="true"/> 
    <field name="title_synonyms" type="text_synonyms" stored="false" 
      required="true" multiValued="true"/> 

Copia title campo a title_synonyms:

<copyField source="title" dest="title_synonyms"/> 

Si está utilizando dismax , puedes dar diferentes impulsos a estos campos como el siguiente:

<str name="qf">title^10 title_synonyms^1</str> 
+0

¡Muy buena idea! Pero en mi caso tengo alrededor de 10 campos donde los sinónimos lo requieren ... lo haré si no hay otras soluciones ... parches de solr, etc. – yura

+2

Si está usando el mismo archivo de sinónimos para todos esos campos, puede copiar todos en un campo común de sinónimos: no necesita un campo de sinónimos correspondiente a cada campo. –

+1

Pero uso un peso granulado fino para todos los campos. Por lo tanto, el sinónimo de título es más importante que el sinónimo de descripción, etc. – yura

Cuestiones relacionadas