标签:
在这个结构化数据和非结构化数据的数量都很庞大的年代,经常需要从数据库、XML/HTML 文件或其他数据源导入数据,并使数据可搜索。过去,要编写自定义代码才能创建到数据库、文件系统或 RSS 提要的自定义连接。但现在,Solr 的 DataImportHandler(DIH)填补了这个空白,它使您能够从数据库(通过 JDBC)、RSS 提要、Web 页面和文件中导入数据。DIH 位于 apache-1.3.0/contrib/dataimporthandler 中,是 apache-1.3.0/dist/apache-solr-dataimporthandler-1.3.0.jar 中的一个 JAR 文件。
在概念上,DIH 可以分解为几个简单的部分:
DataSource:获取内容的数据库、Web 页面、RSS 提要或 XML 文件。DataSource的内容与 Solr 模式之间的映射。EntityProcessor:用于映射的代码。Solr 自带四个工具:
FileListEntityProcessor:在目录上迭代并导入文件。SqlEntityProcessor:连接到一个数据库并导入记录。CachedSqlEntityProcessor:将缓存添加到 SqlEntityProcessor。XPathEntityProcessor:使用 XPath 语句从 XML 文件抽取内容。Transformer:用户定义的、可选的代码,用于在添加到 Solr 之前转换导入的内容。例如,DateFormatTransformer能够标准化日期。首先,我需要设置一个 SolrRequestHandler将 DIH 和 Solr 关联起来。该设置要在 solr-dw/rss/conf/solrconfig.xml 文件中进行,如清单 6 所示:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">rss-data-config.xml</str> </lst> </requestHandler>
该配置表明:我可以通过 http://localhost:8983/solr/rss/dataimport 找到 DataImportHandler实例;该实例必须使用一个名为 rss-data-config.xml 的配置文件(位于 solr_dw/rss/conf 目录)来获取它的设置信息。到目前为止,一切都相当简单。
拨开下一层面纱,rss-data-config.xml 文件就是声明和使用 DataSource、实体和 Transformer的地方。在这个例子中,首先遇到的 XML 标记(在根元素后面)为 DataSource声明,如清单 7 所示:
DataSource声明 <dataSource name="ratings" driver="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/solr_dw" user="solr_dw" />
<dataSource name="rss" type="HttpDataSource" encoding="UTF-8"/>
清单 7 中的第一个声明设置一个与我的数据库相连接的 DataSource。它被命名为 ratings,因为我的评级信息就储存在里面。注意,虽然我没有为数据库用户设置密码,但实际可以向标记添加密码属性。如果了解 JDBC 设置的话,那么就应该很熟悉这个 DataSource声明了。第二个DataSource名为 rss,它声明内容将要通过 HTTP 来获取。稍后将声明这个 DataSource的 URL。
下一个值得讨论的标记是 <entity>标记。它用来指定如何将 RSS 提要和数据库的内容映射到 Solr Document。一个实体就是被索引为一个单一文档的内容单位。例如,在一个数据库中,实体声明规定了如何将每一行转换成 Document中的 Field。一个实体里又可以包含一个或多个实体,因此子实体就变成整体 Document的 Field结构。
至此,来自 rss-data-config.xml 的带注释的示例可以清楚地说明与实体相关的大部分信息。在这个例子中,主实体从一个 RSS 提要获取内容,并将其与数据库中的行相关联以获得评级。清单 8 是一个缩略的 RSS 提要示例:
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title>Grant‘s Grunts: Lucene Edition</title>
<link>http://lucene.grantingersoll.com</link>
<description>Thoughts on Apache Lucene, Mahout,
Solr, Tika and Nutch</description>
<pubDate>Wed, 01 Oct 2008 12:36:02 +0000</pubDate>
<item>
<title>Charlotte JUG >> OCT 15TH - 6PM -
Search and Text Analysis</title>
<link>http://lucene.grantingersoll.com/2008/10/01/
charlotte-jug-%c2%bb-oct-15th-6pm-search-and-text-analysis/</link>
<pubDate>Wed, 01 Oct 2008 12:36:02 +0000</pubDate>
<category><![CDATA[Lucene]]></category>
<category><![CDATA[Solr]]></category>
<guid isPermaLink="false">http://lucene.grantingersoll.com/?p=112</guid>
<description><![CDATA[Charlotte JUG >> OCT 15TH - 6PM - Search and Text Analysis
I will be speaking at the Charlotte Java Users Group on Oct. 15th, covering things
like Lucene, Solr, OpenNLP and Mahout, amongst other things.
]]></description>
</item>
</channel>
与此同时,数据库中的一行包含提要中的文章的 URL、一个评级(我随便编的)和一个修改日期。现在,我只需将它映射到 Solr 就可以了。为了完成此工作,我将逐行解释 rss-data-config.xml 中的实体声明,如清单 9 所示(它包含行数和换行符,以获得良好的格式):
1. <entity name="solrFeed"
2.pk="link"
3.url="http://lucene.grantingersoll.com/category/solr/feed"
4.processor="XPathEntityProcessor"
5.forEach="/rss/channel | /rss/channel/item"
6. dataSource="rss"
7. transformer="DateFormatTransformer">
8. <field column="source" xpath="/rss/channel/title"
commonField="true" />
9. <field column="source-link" xpath="/rss/channel/link"
commonField="true" />
10. <field column="title" xpath="/rss/channel/item/title" />
11. <field column="link" xpath="/rss/channel/item/link" />
12. <field column="description"
xpath="/rss/channel/item/description" />
13. <field column="category" xpath="/rss/channel/item/category" />
14. <field column="content" xpath="/rss/channel/item/content" />
15. <field column="date" xpath="/rss/channel/item/pubDate"
dateTimeFormat="EEE, dd MMM yyyy HH:mm:ss Z" />
16. <entity name="rating" pk="feed"
query="select rating from feeds where feed = ‘${solrFeed.link}‘"
17. deltaQuery="select rating from feeds where feed = ‘${solrFeed.link}‘
AND last_modified > ‘${dataimporter.last_index_time}‘"
18. dataSource="ratings"
19. >
20. <field column="rating" name="rating"/>
21. </entity>
22. </entity>
solrFeed)。EntityProcessor。DataSource的名称。java.util.Date的 DateFormatTransformer。commonField属性指定该值必须用于每一个数据项。Field。DateFormatTransformer将值解析为一个 java.util.Date对象。query属性指定要运行的 SQL。${solrFeed.link}值被代替变量解析为每一篇文章的 URL。${dataimporter.last_index_time}由 DIH 提供。DataSource。下一步是运行导入。这可以通过提交 HTTP 请求来实现:
http://localhost:8983/solr/rss/dataimport?command=full-import
该请求先将所有的文档从索引中移除,然后再进行完全导入。再强调一遍,这个请求首先从索引中移除全部文档,一定要警惕这一点。您可以随时浏览 http://localhost:8983/solr/rss/dataimport 获取 DIH 的状态。在这个用例中,我的输出如清单 10 所示:
<response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">0</int> </lst> <lst name="initArgs"> <lst name="defaults"> <str name="config">rss-data-config.xml</str> </lst> </lst> <str name="status">idle</str> <str name="importResponse"/> <lst name="statusMessages"> <str name="Total Requests made to DataSource">11</str> <str name="Total Rows Fetched">13</str> <str name="Total Documents Skipped">0</str> <str name="Full Dump Started">2008-10-03 10:51:07</str> <str name="">Indexing completed. Added/Updated: 10 documents. Deleted 0 documents.</str> <str name="Committed">2008-10-03 10:51:18</str> <str name="Optimized">2008-10-03 10:51:18</str> <str name="Time taken ">0:0:11.50</str> </lst> <str name="WARNING">This response format is experimental. It is likely to change in the future.</str> </response>
您为其创建索引的文档的数量可能与我不同(因为我有可能会把其他 Solr 文章添加到提要)。为文档创建索引之后,我就可以查询索引了,就像在http://localhost:8983/solr/rss/select/?q=*%3A*&version=2.2&start=0&rows=10&indent=on中一样,它返回了带索引的全部文档,共 10 篇。
有了这些准备,您就可以使用 DIH 了。再深入一些,就是如何替换变量和如何编写Transformer了。要想学习更多有关此话题的知识,请参见 参考资料中的DataImportHandlerwiki 页面链接。
标签:
原文地址:http://www.cnblogs.com/lvfeilong/p/123dfdsfd.html