2010-10-19 25 views
1

J'ai lu quelques tutoriels et parcouru la documentation de Solr. Mais une chose n'est pas claire pour moi. Permettez-moi de vous expliquer:Solr - Ecrire le résultat d'un analyseur dans différents champs

Regardons les choses en Asume que le document suivant est indexé:

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

Contrairement à ce document, l'index doit contenir un champ supplémentaire appelé « docType ». Ce champ d'index supplémentaire doit être rempli à l'aide d'une "règle d'achèvement". L'idée sous-jacente:

Si id commence par le caractère "R", alors écrivez la chaîne "Resolve" dans le champ docType dans l'index. Si id commence par le caractère "C", alors écrivez la chaîne "Contribute" dans le champ docType de l'index.

Le document ci-dessus devrait être disponible dans l'index avec les champs suivants:

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

Mon idée est d'utiliser un analyseur pour cela. Le résultat de l'analyseur sera alors écrit dans le champ "id" dans l'index comme d'habitude (seulement une copie du texte original) mais le résultat "Resolve" ou "Contribute" devrait être écrit dans un autre champ.

Ma question fondamentale est: Comment cela peut-il être réalisé dans l'analyseur (Java snipped)? Pour le rendre plus complexe, le champ d'index "docType" doit être interrogeable et doit être disponible dans le résultat de la recherche. A quoi ressemblera le schéma pour l'ID de champ et le docType?

Merci à l'avance Tobias

Répondre

6

Si vous avez seulement besoin de la valeur indexée, l'approche de schéma est suffisante. Créer une nouvelle FieldType qui effectue le traitement nécessaire, créer un champ de votre nouveau type, et mettre en place un champ de copie pour copier la valeur de 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"/> 

Vous pouvez noter que vous ne recevrez pas un stocké valeur de cela. Si vous en avez besoin, alors vous devriez avoir la valeur docType trouvée avant d'envoyer le document à Solr - par exemple en le créant dans la requête SQL, si votre source de contenu est SQL, etc.

+0

Merci pour le rapide répondre. Si je vous ai bien compris, ne copie pas directement dans l'index, mais copie le contenu de la source dans le champ de destination avant l'exécution de l'analyseur et le résultat de l'analyseur est alors enregistré dans l'index? Excellente idée, bonne réponse, merci beaucoup. Est-il également possible d'écrire des valeurs dans un analyseur dans des champs d'index personnalisés en utilisant le code source Java? –

+0

Vous le comprenez bien; La copie sur le terrain est faite en premier, puis l'analyse. Si vous voulez créer des analyseurs personnalisés, voir: http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#Analyzers –