Как использовать директиву SOLR copyField - PullRequest
21 голосов
/ 04 января 2011

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

идентификатор, текст и теги

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

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

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

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


EDIT

анализатор по умолчанию:

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

Ответы [ 3 ]

29 голосов
/ 04 января 2011

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

3 голосов
/ 05 января 2011

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

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

любое количество декларации могут быть включены в ваш схема, чтобы проинструктировать Solr, что вы хочу дублировать любые данные, которые он видит в поле «источник» документов которые добавляются в индекс

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

1 голос
/ 19 января 2011

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

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

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

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

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

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