Solr - запись результата анализатора в разные поля

StackOverflow https://stackoverflow.com/questions/3966070

  •  09-10-2019
  •  | 
  •  

Вопрос

Я прочитал пару учебников и просматривал документацию 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 и т. Д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top