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>
fonte
2012-05-19 05:25:03
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
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. –
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