2017-10-17 12 views
0

Je suis nouveau à Solr et coincé à quelque chose de basique (je pense), ce qui est probablement un manque de compréhension/compréhension en mon nom. J'ai lu la documentation sur DIH et passé beaucoup de temps à chercher ce problème, sans trouver ma solution. Mon cas d'utilisation est un système de messagerie/courrier électronique, où les utilisateurs peuvent s'informer mutuellement et démarrer un sujet, auquel ils peuvent répondre (c'est donc plus un message électronique que des messages directs sur une base d'utilisateurs).Indexation joints enregistrements dans Solr

La question est simple; J'ai une table, threads, qui est la base pour cela et contient des données interrogeables comme les informations de l'utilisateur et le sujet. Ensuite, la table emails est jointe, avec la colonne html consultable. Lorsque je cours en dessous de la collection dans Solr et que j'effectue une recherche, il ne prendra qu'un seul email pour un fil de discussion et cherchera, contrairement à ce que j'espère; obtenir tous les emails appartenant à ce fil. Donc disons que j'ai 10 threads, mais 100 messages, il est dit Fetched: 100, mais Processed: 10.

Comment est-ce que je peux indexer correctement tout ce contenu et permettre une recherche sur ce contenu? Dans ce cas d'utilisation particulier, j'ai également créé un exemple inversé, en commençant par les messages, puis les threads auxquels ils appartiennent, puis en dédupliquant les résultats (ce qui fonctionne dans une certaine mesure), mais l'étape suivante est left join pour les pièces jointes d'email. Donc, à la recherche d'une solution avec cette configuration.

En utilisant Solr 6,6

<dataConfig> 
    <dataSource name="ds-db" type="JdbcDataSource" 
       driver="com.mysql.jdbc.Driver" 
       url="${dataimporter.request.url}" 
       user="${dataimporter.request.user}" 
       password="${dataimporter.request.password}"/> 
    <document name="threads"> 
     <entity name="thread" dataSource="ds-db" 
       query=" 
      SELECT threads.id 
       , threads.user_id 
       , threads.subject 
       , users.first_name 
       , users.last_name 
       , users.email 
       FROM threads 
     LEFT JOIN users ON users.user_id=threads.user_id 
      "> 
      <field column="id" name="thread_id"/> 
      <field column="user_id" name="user_id"/> 
      <field column="subject" name="subject"/> 
      <field column="first_name" name="first_name"/> 
      <field column="last_name" name="last_name"/> 
      <field column="email" name="email"/> 

      <entity name="message" dataSource="ds-db" transformer="HTMLStripTransformer" 
        query=" 
       SELECT id 
        , html 
        FROM emails 
       WHERE thread_id = ${thread.id} 
        "> 
       <field column="id" name="id"/> 
       <field column="html" name="html" stripHTML="true"/> 


      </entity> 

     </entity> 
    </document> 
</dataConfig> 

géré par schéma

<schema name="example-data-driven-schema" version="1.6"> 
    ... 
    <field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/> 
    <field name="thread_id" type="string" multiValued="false" indexed="true" required="true" stored="true"/> 
    <field name="first_name" type="string_lowercase" indexed="true" stored="true"/> 
    <field name="last_name" type="string_lowercase" indexed="true" stored="true"/> 
    <field name="email" type="string_lowercase" indexed="true" stored="true"/> 
    <field name="subject" type="string_lowercase" indexed="true" stored="true"/> 
    <field name="html" type="string_lowercase" indexed="true" stored="true"/> 
    ... 
    <copyField source="first_name" dest="_text_"/> 
    <copyField source="last_name" dest="_text_"/> 
    <copyField source="email" dest="_text_"/> 
    <copyField source="subject" dest="_text_"/> 
    <copyField source="html" dest="_text_"/> 
    ... 
</schema> 
+0

Quelle est la définition du champ 'html' et son type dans votre schéma? – MatsLindh

+0

@MatsLindh J'ai mis à jour la question avec un extrait de 'managed-schema'. Est-ce ce que vous demandez? – Richard

+0

Je pense que vous confondez la structure de l'entité lors de l'importation - le résultat est un document unique. Puisque 'html' est à valeur unique, une seule valeur sera insérée. Si vous le faites multiValued, il contiendra tous les messages associés au thread. Si vous voulez un document par courrier dans un fil, vous voulez probablement faire une jointure avec le HTML et obtenir un document par mail avec ses métadonnées. – MatsLindh

Répondre

1

Si vous voulez que tous les e-mails dans un seul champ, ce champ doit être défini comme multiValued="true" - sinon vous ne fera qu'indexer l'une des entités dépendantes.