solr特点六: DIH (从数据源导入数据)

在这个结构化数据和非结构化数据的数量都很庞大的年代,经常需要从数据库、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 文件。

DataImportHandler警告

DataImportHandler不是文件 /Web 爬行器(crawler),它不直接支持从二进制文件格式中提取内容,比如 MS Office、Adobe PDF 或其他专有格式。本文没有详尽地介绍 DIH,如果要了解更多信息,请参见 参考资料

在概念上,DIH 可以分解为几个简单的部分:

  • DataSource:获取内容的数据库、Web 页面、RSS 提要或 XML 文件。
  • 文档 / 实体声明:指定 DataSource的内容与 Solr 模式之间的映射。
  • 导入:Solr 命令,使用它既可以进行完全导入,也可以只导入已经更改的实体的 增量导入
  • EntityProcessor:用于映射的代码。Solr 自带四个工具:
    • FileListEntityProcessor:在目录上迭代并导入文件。
    • SqlEntityProcessor:连接到一个数据库并导入记录。
    • CachedSqlEntityProcessor:将缓存添加到 SqlEntityProcessor
    • XPathEntityProcessor:使用 XPath 语句从 XML 文件抽取内容。
  • Transformer:用户定义的、可选的代码,用于在添加到 Solr 之前转换导入的内容。例如,DateFormatTransformer能够标准化日期。
  • 变量替代:用运行时的值替代占位符变量。

首先,我需要设置一个 SolrRequestHandler将 DIH 和 Solr 关联起来。该设置要在 solr-dw/rss/conf/solrconfig.xml 文件中进行,如清单 6 所示:

清单 6. 将 DIH 和 Solr 关联起来
 <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 所示:

清单 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 提要示例:

清单 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 所示(它包含行数和换行符,以获得良好的格式):

清单 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>
  • 第 1 行:实体名(solrFeed)。
  • 第 2 行:该项的可选主键,只有在导入增量时才用得到。
  • 第 3 行:将要获取的 URL —在这个用例中是我在 Solr 上的博客站点。
  • 第 4 行:用于从原始源映射内容的 EntityProcessor
  • 第 5 行:用于指定如何从 XML 获取记录的 XPath 表达。(XPath 提供一种在 XML 文件中指定特定元素或属性的方法。如果不熟悉 XPath 表达的话,请参阅 参考资料)。
  • 第 6 行:要使用的 DataSource的名称。
  • 第 7 行:用于将字符串解析成 java.util.Date的 DateFormatTransformer
  • 第 8 行:将通道名称(博客名称)映射到以 Solr 模式字段命名的数据源。此过程每个通道只发生一次,因此 commonField属性指定该值必须用于每一个数据项。
  • 第 9-14 行:将 RSS 提要的其他部分映射到 Solr Field
  • 第 15 行:映射出版日期,但使用 DateFormatTransformer将值解析为一个 java.util.Date对象。
  • 第 16-21 行:从数据库获取每一篇文章的评级的子实体。
  • 第 16 行query属性指定要运行的 SQL。${solrFeed.link}值被代替变量解析为每一篇文章的 URL。
  • 第 17 行:导入增量时要运行的查询。${dataimporter.last_index_time}由 DIH 提供。
  • 第 18 行:使用 JDBC DataSource
  • 第 20 行:将数据库中的评级栏映射到评级字段。如果未指定名称属性,将默认使用栏名。

下一步是运行导入。这可以通过提交 HTTP 请求来实现:

http://localhost:8983/solr/rss/dataimport?command=full-import

该请求先将所有的文档从索引中移除,然后再进行完全导入。再强调一遍,这个请求首先从索引中移除全部文档,一定要警惕这一点。您可以随时浏览 http://localhost:8983/solr/rss/dataimport 获取 DIH 的状态。在这个用例中,我的输出如清单 10 所示:

清单 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>

增量导入功能

使用数据库时,在完全导入之后,下一次只需导入那些改变了的记录。这个功能就叫做 增量导入。不幸的是,它还不能适用于 RSS 提要。要是可以的话,命令应该是这样的:
http://localhost:8983/solr/rss/dataimport?command=delta-import

您为其创建索引的文档的数量可能与我不同(因为我有可能会把其他 Solr 文章添加到提要)。为文档创建索引之后,我就可以查询索引了,就像在http://localhost:8983/solr/rss/select/?q=*%3A*&version=2.2&start=0&rows=10&indent=on中一样,它返回了带索引的全部文档,共 10 篇。

有了这些准备,您就可以使用 DIH 了。再深入一些,就是如何替换变量和如何编写Transformer了。要想学习更多有关此话题的知识,请参见 参考资料中的DataImportHandlerwiki 页面链接。

时间: 2024-09-29 09:04:26

solr特点六: DIH (从数据源导入数据)的相关文章

从json数据源导入数据

import requests url = 'https://github.com/timeline.json' r = requests.get(url) json_obj = r.json() repos = set() # we want just unique urls for entry in json_obj: try: repos.add(entry['repository']['url']) except KeyError as e: print "No key %s. Skip

solr连接数据库导入数据

本文简单讲诉 solr建立全文索引,从数据库导入数据,生成索引文件,本文建立在已经搭建好solr应用的情况下,如要了解如何部署solr服务可先看上一文:solr 安装 环境:jdk 7,solr4.10.1 ,tomcat 7 附:参考文档地址:http://wiki.apache.org/solr/DataImportHandler 1,首先在solrconfig.xml中引入dataimport 路径 : E:\solr\example\solr\collection1\conf <requ

Python数据可视化编程实战——导入数据

1.从csv文件导入数据 原理:with语句打开文件并绑定到对象f.不必担心在操作完资源后去关闭数据文件,with的上下文管理器会帮助处理.然后,csv.reader()方法返回reader对象,通过该对象遍历所读取文件的所有行. 1 #!/usr/bin/env python 2 3 import csv 4 5 filename = 'ch02-data.csv' 6 7 data = [] 8 try: 9 with open(filename) as f: 10 reader = csv

solr的DIH操作同步mysql数据

1.创建MySQL数据 CREATE TABLE `city` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '城市编号', `province_id` INT(10) UNSIGNED NOT NULL COMMENT '省份编号', `city_name` VARCHAR(25) NULL DEFAULT NULL COMMENT '城市名称', `description` VARCHAR(25) NULL DEFAULT N

solr搜索之mysql导入数据到solr(四)

1      mysql导入数据到solr 方式一:创建项目,查询出数据,一条一条add到solr中:(不推荐) 方式二:通过配置复制数据到solr中 以上已完成了在本地window8中对solr的部署,为solr添加了一个自定义的coredemo,并且引入了ik分词器. 那么该如何将本地的mysql的数据导入到solr中呢? 1.1    准备工作 1.1.1     准备数据源 mysql数据源:test库中的user表(7条数据),其中这个update_time字段是用于solr更新数据库

多表利用DIH批量导入数据并建立索引注意事项

如果希望同时对多个表进行全文检索,那我们该如何处理呢?利用DIH导入数据并建立索引时.schema.xml中配置了uniqueKey为id <uniqueKey>id</uniqueKey> 如果多表主键都为id的话索引会被覆盖 <!--deltaImportQuery和deltaQuery为增量导入时使用.--> <entity name="case" pk="id" query="SELECT id,title

Solr之搭建Solr5.2.1服务并从Mysql上导入数据

一.开启Solr服务 1.首先从solr官网下载solr-5.2.1.tgz包,解压之后为solr-5.2.1. 2.读取README.txt可知通过bin/solr start命令开启solr服务,当然可以将solr-5.2.1/bin加入环境变量里面.此时开启的服务是放在jetty下的服务,也可以放在Tomcat下,只是感觉那样挺麻烦,还需要再下载一个Tomcat包. 3.开启服务之后,默认是开启8983端口,此时就可以使用localhost:8983/solr/进行访问了:如果不能访问,通

SOLR环境搭建以及全量导入MYSQL数据

SOLR文档 前言 因为项目中要用到solr,因此花了一周多的时间研究了一下solr,其中的各种问题我就不说了,特别是这两天在研究定时增量索引的时候,心里不知道多少个XXX在奔腾,好了,废话不多说,下面把我得研究成果跟大家分享一下,另外对于SOLR是什么,大家还是自行度娘吧,让我说我也说不清楚. 版本 SOLR SOLR最新的版本是5.3,但是我没有用最新的版本,用的是4.10.4. JDK JDK的版本是jdk1.7.0_13,这里要说一下的就是4.10版本的SOLR需要1.7以上的JDK,刚

solr入门:导入数据

一.连接MySql MySQL java connector 下载地址,下载后放于solr运行库中. cp /tmp/mysql-connector-java-5.1.30.jar /usr/share/tomcat6/webapps/solr/WEB-INF/lib/ 打开并编辑solr配置文件{solr/home}: vim /home/solr-index/collection1/conf/solrconfig.xml 增加以下内容(建议加在requestHandler区域后,方便管理.)