2012-05-18 19 views

risposta

7

Per quanto ne so, non esiste un modo per farlo con SynonymFilterFactory esistente. Ma seguire è un trucco che puoi usare per ottenere questo comportamento.

Diciamo che il campo è chiamato title. Crea un altro campo che è una copia di questo, per esempio title_synonyms. Ora assicurati che SynonymFilterFactory sia utilizzato come analizzatore solo per title_synonyms (puoi farlo utilizzando diversi tipi di campo per i due campi, ad esempio text e text_synonyms). Cerca in entrambi questi campi, ma dai una maggiore spinta a title rispetto a title_synonyms.

Qui ci sono esempi di definizioni di tipi di 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> 

E qui ci sono definizioni dei campi di esempio:

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

Se si utilizza dismax , puoi dare diversi boost a questi campi come così:

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

Davvero una bella idea! Ma nel mio caso ho circa 10 campi in cui i sinonimi lo richiedono ... lo farò se non ci sono altri rimedi ... patch solr ecc. – yura

+2

Se stai usando lo stesso file di sinonimi per tutti quei campi, puoi copiare tutto in un unico campo di sinonimi: non è necessario un campo di sinonimi corrispondente a ciascun campo. –

+1

Ma io uso il peso a grana fine su tutti i campi. Quindi il sinonimo di titolo è più importante del sinonimo per la descrizione, ecc. – yura