2009-12-14 7 views
1

J'ai été capable d'importer des données via solr DIH.Conserver la structure de la base de données relationnelle dans l'index solr?

Dans ma base de données, j'ai 4 tables:

threads: id, user_id, country_id 

tags: id 

thread_tag_map: thread_id, tag_id 

countries: id 

posts: id, thread_id 

Je veux chaque document solr consister en:

thread_id 
tag_id 
country_id 
post_id 

Par exemple:

thread_id: 1 
tag_id: 23 
tag_id: 34 
country_id: 43 
post_id: 4 
post_id: 23 
post_id: 23 

Comment dois-je la carte il?

Je n'ai pas pu configurer data-config.xml pour cela. J'ai suivi le tutoriel DIH sans succès.

Voici mon schema.xml:

<schema name="example" version="1.2"> 
    <types> 
    <fieldType name="string" class="solr.StrField" sortMissingLast="true"/> 
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/> 
    <fieldType name="uuid" class="solr.UUIDField" indexed="true" /> 
    <fieldType name="text_rev" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true" 
      maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="stopwords.txt" 
       enablePositionIncrements="true" 
       /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 
</types> 


<fields> 
    <field name="id" type="uuid" indexed="true" stored="true" default="NEW"/> 
    <field name="threads.title" type="text_rev" indexed="true" stored="true"/> 
    <field name="posts.body" type="text_rev" indexed="true" stored="true"/> 
    <dynamicField name="*id" type="int" indexed="false" stored="true"/> 
</fields> 

<uniqueKey>id</uniqueKey> 

<defaultSearchField>posts.body</defaultSearchField> 

<solrQueryParser defaultOperator="OR"/> 
</schema> 
+0

N'a pas déjà fait cela et pourrait m'aider? – ajsie

+0

s'il vous plaît poster votre schéma.xml –

Répondre

2

Il semble que vous voulez juste définir ces domaines:

ID_thread

tag_id

country_id

post_id

en tant que champs 'chaîne' indexés dans le fichier schema.xml. post_id doit avoir plusieurs valeurs = "true". Voir les fichiers schema.xml par défaut pour les directives de mise en forme. Ou ...

http://wiki.apache.org/solr/SchemaXml

La seule chose délicate ici est en fait la base de données interroge, pas la configuration solr. Il suffit d'écrire une requête de jointure où vous pouvez obtenir tous vous avez besoin de l'ID et utiliser une bibliothèque client solr pour votre langue pour construire un datastruction simple, par exemple (JSON-y):

[{"thread_id":"1", 
    "tag_id":"14", 
    "country_id":"2", 
    "post_id":["5", 
      "7", 
      "18" 
      ] 
},...and more...] 

Depuis Solr est pas SGBDR, vous devrez simuler vos recherches en effectuant plusieurs requêtes ou en utilisant des sous-requêtes. Une autre option pourrait consister à utiliser Solr pour récupérer votre discussion ou votre message avec une recherche en texte intégral, puis en utilisant un identifiant à partir de là pour exécuter une requête MySQL qui vous apportera tout ce dont vous avez besoin.

Questions connexes