Как использовать директиву SOLR copyField для использования в полях muiple - PullRequest
2 голосов
/ 19 июня 2020

У меня довольно простая структура SOLR, которая содержит три разных поля:

id, текст и теги

в schema.xml Я установил следующее

<uniqueKey>id</uniqueKey>
<defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="AND"/>
<copyField source="tags" dest="text"/>

Однако, когда я ищу слово, которое появляется только как тег, документ не найден.

Мой вопрос: происходит ли copyField перед запуском любого анализатора (индекс и запрос), как описано здесь или непосредственно перед анализатором запросов?


РЕДАКТИРОВАТЬ

определение анализатора:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.LowerCaseFilterFactory" />              
        <filter class="solr.SnowballPorterFilterFactory" language="German" />
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.LowerCaseFilterFactory" />              
        <filter class="solr.SnowballPorterFilterFactory" language="German" />
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
</fieldType>

и определения типов полей (они в значительной степени соответствуют конфигурациям по умолчанию):

<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>

и наконец определения полей:

<fields>
    <field name="id" type="string" indexed="true" stored="true" required="true" />
    <field name="text" type="text" indexed="true" stored="false" multiValued="true" />
    <field name="tags" type="text" indexed="false" stored="false" />
</fields>
<uniqueKey>id</uniqueKey>
<defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="AND"/>
<copyField source="tags" dest="text"/>

1 Ответ

1 голос
/ 19 июня 2020

copyField вызывается до того, как произойдет какой-либо анализ (что является своего рода точкой наличия полей копирования - они позволяют обрабатывать один и тот же контент несколькими способами).

Но это копирование только происходит, когда вы индексируете. Если вы запрашиваете tags, вы не получите совпадений в text одновременно. Однако, если вы отправили значение для tags, оно также будет добавлено как значение в поле text, и единственная обработка, которая будет выполняться, - это та, которая определена для text.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...