Есть ли способ увеличить первоначальный срок, используя синонимы Solr?

Например, у меня есть синонимы ноутбук, нетбук, ноутбук в index_synonyms.txt

Когда пользователь ищет нетбук, я хочу увеличить исходный текст, а затем увеличить синонимы? Есть ли способ указать это в SynonymFilterFactory? Например, используйте оригинальный термин дважды, чтобы его TF был больше

Ответ 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>