Frage

Ich habe ein paar Tutorials lesen und die Solr Dokumentation durchsucht. Aber eine Sache ist mir nicht klar. Lassen Sie mich erklären:

Lassen Sie uns asume, dass das folgende Dokument indiziert werden:

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

Im Gegensatz zu diesem Dokument sollte der Index enthält ein zusätzliches Feld namens „docType“. Dieses zusätzliche Indexfeld sollte mit einem „Erledigungsregel“ gefüllt werden. Die Idee dahinter:

Wenn id beginnt mit dem Zeichen "R" dann den String schreiben "Resolve" in Feld docType im Index. Wenn id beginnt mit dem Zeichen "C" dann den String schreiben "Contribute" in Feld docType im Index.

Das oben gezeigte Dokument sollte im Index mit den folgenden Feldern zur Verfügung

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

Meine Idee ist hierfür einen Analyzer zu verwenden. Das Ergebnis des Analyzer wird dann in das Feld „id“ im Index wie üblich geschrieben werden (nur eine Kopie des ursprünglichen Textes), aber das Ergebnis „Resolve“ oder „Contribute“ sollte in einem anderen Feld geschrieben werden.

Meine grundlegende Frage ist: Wie kann diese (snipped Java) in Teh Analyzer erreicht werden? Um es komplexer das Indexfeld „docType“ sollte durchsucht werden und muss im Suchergebnis zur Verfügung. Wie wird sich das Schema aussehen wie für Feld-ID und docType?

Vielen Dank im Voraus Tobias

War es hilfreich?

Lösung

Wenn Sie nur den indizierten Wert benötigen, dann ist das Schema Ansatz ausreichend. Erstellen Sie einen neuen Feldtyp, dass führt die notwendige Verarbeitung, ein Feld des neuen Typs erstellen, und richten Sie eine Kopie Feld den Wert von id zu kopieren:

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

Sie können zu Anmerkung wünschen, dass Sie nicht einen gespeicherten Wert von diesem erhalten werden. Wenn Sie das brauchen, dann sollten Sie den Wert docType herausgefunden haben, bevor das Dokument zu Solr Fütterung -. Zum Beispiel, indem sie es in der SQL-Abfrage erstellen, wenn Ihre Inhaltsquelle SQL, etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top