Solr - запись результата анализатора в разные поля
Вопрос
Я прочитал пару учебников и просматривал документацию Solr. Но одна вещь для меня не ясна. Позволь мне объяснить:
Давайте несем, что следующий документ должен быть проиндексирован:
<doc>
<field name="id">R12345</field>
<field name="title">My title</field>
<field name="content">My Content</field>
</doc>
Вопреки этого документа индекс должен содержать одно дополнительное поле под названием «DOCTYPE». Это дополнительное поле индекса должно быть заполнено с использованием «правила завершения». Идея позади этого:
Если идентификатор начинается с символа «R», то напишите строку «разрешите» в поле «Уотно в поле» в индексе. Если идентификатор начинается с символа «C», то напишите строку «вносят вклад» в поле DOCTYPE в индексе.
Приведенный выше документ должен быть доступен в индексе со следующими полями:
id=R12345
title=My Title
content=My Content
docType=Resolve
Моя идея состоит в том, чтобы использовать анализатор для этого. Результат анализатора затем будет записан в поле «ID» в индексе как обычно (только копия исходного текста), но результатом «разрешение» или «вклад» следует записать в другом поле.
Мой основной вопрос: как это может быть достигнуто в анализаторе Teh (Java Shipped)? Чтобы сделать его более сложным, что поле индекса «DOCTYPE» должен быть доступным и должен быть доступен в результате поиска. Как будет выглядеть схема для идентификатора поля и дочинка?
Спасибо заранее Тобиас
Решение
Если вам нужно только индексированное значение, то подход схемы достаточно. Создайте новый FieldType, который выполняет необходимую обработку, создайте поле вашего нового типа и настроить поле копирования, чтобы скопировать значение из id
:
<fieldType name="doctypeField" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="([CR]).*" replacement="$1" replace="all" />
<filter class="solr.PatternReplaceFilterFactory" pattern="C" replacement="Contribute" replace="all" />
<filter class="solr.PatternReplaceFilterFactory" pattern="R" replacement="Resolve" replace="all" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<field name="doctype" type="doctypeField" indexed="true" stored="false" required="false" />
<copyField source="id" dest="doctype"/>
Возможно, вы захотите отметить, что вы не получите сохраненное значение из этого. Если вам это нужно, то у вас должно быть значение DOCTYPE определяется перед подачей документа в Solr - например, создавая его в SQL-запросе, если ваш источник контента SQL и т. Д.