Solr - запись результата анализатора в разные поля - PullRequest
1 голос
/ 19 октября 2010

Я прочитал пару уроков и просмотрел документацию по Solr. Но одна вещь мне не ясна. Позвольте мне объяснить:

Предположим, что следующий документ будет проиндексирован:

<doc>
  <field name="id">R12345</field>
  <field name="title">My title</field>
  <field name="content">My Content</field>
</doc>

В противоположность этому документу индекс должен содержать одно дополнительное поле с именем "docType". Это дополнительное поле индекса должно быть заполнено с использованием «правила завершения». Идея, стоящая за этим:

Если id начинается с символа "R", тогда напишите строку "Resolve" в поле docType в индексе. Если id начинается с символа «C», тогда напишите строку «Contribute» в поле docType в индексе.

Указанный выше документ должен быть доступен в индексе со следующими полями:

id=R12345
title=My Title
content=My Content
docType=Resolve

Моя идея - использовать для этого Анализатор. Затем результат анализатора будет записан в поле «id» в индексе как обычно (только копия исходного текста), но результат «Resolve» или «Contribute» должен быть записан в другом поле.

Мой основной вопрос: как этого можно достичь в Analyzer (Java snipped)? Чтобы сделать его более сложным, индексное поле «docType» должно быть доступно для поиска и должно быть доступно в результатах поиска. Как будет выглядеть схема для идентификатора поля и docType?

Заранее спасибо Tobias

1 Ответ

6 голосов
/ 19 октября 2010

Если вам нужно только индексированное значение, тогда достаточно схемного подхода. Создайте новый тип поля, который выполняет необходимую обработку, создайте поле нового типа и настройте поле копирования для копирования значения из 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 и т. Д.

...