Подтвердить что ты не робот

Как использовать директиву SOLR copyField

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

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

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

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

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

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


ИЗМЕНИТЬ

анализатор def:

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

Ответ 1

CopyField выполняется, когда документ индексируется, поэтому он находится перед анализатором индекса. Это похоже на то, что вы ввели один и тот же текст ввода в двух разных полях. Но после этого все зависит от анализаторов, которые вы определили для обоих полей.

Ответ 2

Если вы выполните поиск q = тегов: xyz, то xyz не будет найден, потому что вы отправили его не индексированным.

Если вы выполняете поиск по умолчанию, да, он должен искать в поле копирования, однако, согласно Solr wiki

Любое количество    объявления могут быть включены в ваши    схемы, чтобы проинструктировать Солра, что вы    хотите, чтобы он дублировал любые данные, которые он видит    в поле "источник" документов    которые добавляются к индексу

Я думаю, что добавив "теги" к индексу, также не будет индексироваться копия "тегов".

Ответ 3

Я не пробовал использовать copyField для добавления дополнительного текста в существующее поле. Я полагаю, что Solr может объединить его или добавить в качестве второго значения.

Но вот пара идей, которые нужно попробовать:

  • Экспериментируйте с документом, в котором текстовое поле пустое, возможно, даже не упоминается как под структурой. Кажется ли это иметь значение, когда теги превращают его в основной текст, если текст начинается как полностью пустой или нет?

  • Объявите второе поле, назовите его text2. И затем ТАКЖЕ скопируйте теги в текст2 через вторую copyField директиву. В этом поле text2 в нем не будет ничего другого, по-видимому, даже не упоминается в ваших полях, поэтому он обязательно должен получить контент.

В обоих случаях вы должны проверять результаты с помощью браузера схемы, как и раньше. Мне было бы очень интересно узнать, как вы узнаете!