DataImportHandler n'indexe pas la table MySQL dans l'administrateur Solr
-
21-12-2019 - |
Question
J'essaie d'indexer la table MySQL dans Solr à l'aide de DataImportHandler, mais il ne semble pas y avoir d'indexation.
données-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/solr_tut"
user="root"
password=""/>
<document>
<entity name="product_id"
query="select product_id,name,description from products">
</entity>
</document>
</dataConfig>
solrconfig.xml
<lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
<lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
Quand j'essaie d'indexer dans solr admin (http://localhost:8080/solr/dataimport?command=full-import
) je reçois cette réponse
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">19</int>
</lst>
<lst name="initArgs">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</lst>
<str name="command">full-import</str>
<str name="status">idle</str>
<str name="importResponse"/>
<lst name="statusMessages">
<str name="Total Requests made to DataSource">1</str>
<str name="Total Rows Fetched">4</str>
<str name="Total Documents Skipped">0</str>
<str name="Full Dump Started">2014-01-10 10:38:00</str>
<str name="">
Indexing completed. Added/Updated: 0 documents. Deleted 0 documents.
</str>
<str name="Committed">2014-01-10 10:38:00</str>
<str name="Total Documents Processed">0</str>
<str name="Time taken">0:0:0.33</str>
</lst>
<str name="WARNING">
This response format is experimental. It is likely to change in the future.
</str>
</response>
Après si je cherche (http://localhost:8080/solr/select?q=*:*
), j'obtiens 0 résultat.
Mise à jour-1 : schéma.xml
La solution
Vous venez de manquer le mappage des colonnes du jeu de résultats avec les champs des documents.Vous devez le faire dans le entity
élément de votre data-config.xml
.
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/solr_tut"
user="root"
password=""/>
<document>
<entity name="product_id"
query="select product_id,name,description from products">
<!-- this is the place where you map the columns of your result set
to fields of the new solr document -->
<field column="PRODUCT_ID" name="id" />
<field column="NAME" name="name" />
<field column="DESCRIPTION" name="description" />
</entity>
</document>
</dataConfig>
Dans votre cas, vous avez manqué une cartographie vitale. product_id
à id
.Solr peut détecter automatiquement les mappages, si le nom de la colonne et le nom du champ dans le schéma sont égaux, comme indiqué dans le wiki
Dans l'exemple ci-dessus, il existe des mappages de champs avec des champs Solr.Il est possible d'éviter totalement les entrées de champs dans les entités si les noms des champs sont les mêmes (la casse n'a pas d'importance) que ceux du schéma Solr.
Mais comme je l'ai dit, dans votre situation, ce n'est pas le cas. product_id
et id
diffèrent.Depuis votre id
le champ est required
ces documents ne figureront pas dans l’index.
Plus d'informations peuvent être trouvées dans le wiki de Solr à propos du DataImportHandler ou dans le guide de référence.