Ответ 1
Насколько я знаю, нет никакого способа сделать это с существующим SynonymFilterFactory. Но вот трюк, который вы можете использовать, чтобы получить это поведение.
Скажем, ваше поле называется title
. Создайте другое поле, которое является копией этого, скажем title_synonyms
. Теперь убедитесь, что SynonymFilterFactory используется как анализатор только для title_synonyms
(вы можете сделать это, используя разные типы полей для двух полей - скажем text
и text_synonyms
). Ищите в обоих этих полях, но дайте более высокий импульс title
чем title_synonyms
.
Ниже приведены определения типа поля:
<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>
И вот примеры определений полей:
<field name="title" type="text" stored="false"
required="true" multiValued="true"/>
<field name="title_synonyms" type="text_synonyms" stored="false"
required="true" multiValued="true"/>
Скопировать title
в поле title_synonyms
:
<copyField source="title" dest="title_synonyms"/>
Если вы используете dismax
, вы можете дать разные стимулы для этих полей, например:
<str name="qf">title^10 title_synonyms^1</str>