`
yinwufeng
  • 浏览: 287060 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

从数据库和其他数据源导入数据 SOLR

阅读更多

从数据库和其他数据源导入数据

Solr 1.3 拥有很多功能强大的特性,这使它充满了吸引力。本文剩余的部分将介绍新 Solr 特性,以及将它们合并到您的应用程序中的方法。为了展示这些内容,我将构建一个简单的应用程序,它将 RSS 提要和该提要的评级结合起来。评级将储存在一个数据库中,RSS 提要来自我的 Lucene 博客的 RSS 提要。完成这个简单的设置后 ??? 我将展示如何使用:

如果要实践这个示例,请 下载样例应用程序 ,并按以下说明进行操作:

  1. 将 sample.zip 拷贝到 apache-solr-1.3.0/example/ 目录。

  2. 解压缩 sample.zip

  3. 启动(或重启动)Solr:java -Dsolr.solr.home=solr-dw -jar start.jar

  4. 以数据库管理员的身份创建一个名为 solr_dw 的数据库用户。具体做法请参看数据库说明。在 PostgreSQL 中,我的创建方法为:create user solr_dw;

  5. 为上述用户创建一个名为 solr_dw 的数据库:create database solr_dw with OWNER = solr_dw;

  6. 在命令行上执行 src/sql/create.sql 语句:psql -U solr_dw -f create.sql solr_dw 。我的输出为:
     gsi@localhost>psql -U solr_dw -f create.sql solr_dw 
     psql:create.sql:1: ERROR:  table "feeds" does not exist 
     psql:create.sql:2: NOTICE:  CREATE TABLE / PRIMARY KEY will create \ 
      implicit index "feeds_pkey" for table "feeds"
     CREATE TABLE 
     INSERT 0 1 
     INSERT 0 1 
     INSERT 0 1 
     INSERT 0 1 
     INSERT 0 1 
    

在这个结构化数据和非结构化数据的数量都很庞大的年代,经常需要从数据库、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 。一个实体里又可以包含一个或多个实体,因此子实体就变成整体 DocumentField 结构。

至此,来自 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.DateDateFormatTransformer
  • 第 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 篇。

分享到:
评论

相关推荐

    solr7.4数据库导入Demo(mysql数据库)

    接着,创建`data-config.xml`文件,定义数据源和数据实体。在这个例子中,我们将使用MySQL数据库,所以配置如下: ```xml * FROM your_table"&gt; &lt;!-- Define fields mapping from database columns to Solr ...

    Solr数据库插入(全量和增量)索引

    DIH 是 Solr 中的一个工具,用于将数据从外部数据源导入 Solr 索引库中。使用 DIH,我们可以将数据从 Oracle 数据库中提取出来,然后将其插入 Solr 索引库中。 增量索引 增量索引是指将新添加或更新的数据插入 ...

    跟益达学Solr5之从MySQL数据库导入数据并索引

    - **DataImportHandler (DIH)**:Solr提供了一个名为DIH的组件,用于从外部数据源,如MySQL,导入数据。DIH支持增量更新和全量导入,确保数据库中的数据变化能实时反映到Solr索引中。 - **连接配置**:配置DIH时,...

    solr5.3.1 导入mysql数据

    4. **增量导入和 delta-import**: 如果数据源有实时更新,可以使用增量导入功能只导入自上次导入以来发生变化的记录,提高效率。 在实际应用中,我们还需要关注性能优化、安全性、集群部署等方面。例如,可以通过...

    solr连接数据库配置

    DIH是Solr的一个模块,它可以定期从外部数据源(如关系型数据库)中抓取数据并将其索引到Solr。这个过程通常分为四个主要步骤: Full Import、Delta Import、Commit 和 Optimize。 1. **Full Import**:这是第一次...

    solr6 增量导入demo

    1. DataImportHandler(DIH):Solr6使用DIH进行数据导入,它是Solr内置的一个处理程序,可以连接到各种数据源(如数据库),并将数据导入到Solr索引中。DIH支持增量导入,通过跟踪数据库的LastModified时间戳或者...

    solr4.7从数据库导数据[归类].pdf

    这个文件定义了数据源和要导入的实体。以下是一个示例配置: ```xml url="jdbc:jtds:sqlserver://localhost/MyHousekeeper" user="sa" password="123456"/&gt; query="SELECT payId,payName,payMoney,...

    solr定时自动同步数据库需要用到的apache-solr-dataimportscheduler.jar包

    DIH允许Solr从各种数据源,如关系型数据库MySQL,导入数据。 在标题提到的"solr定时自动同步数据库需要用到的apache-solr-dataimportscheduler.jar包"中,`apache-solr-dataimportscheduler.jar`是用于实现Solr数据...

    solr在tomcat下的搭建和配置数据库

    这里通过`data-config.xml`文件配置了Solr的数据源连接以及SQL查询语句,使得Solr能够从数据库中读取数据并索引。 **总结** 以上步骤详细介绍了如何在Tomcat环境下搭建Solr服务,并配置Solr与数据库之间的连接。...

    Solr数据库连接[SQL,Oracle]

    2. 编写一个数据导入处理器(Data Import Handler, DIH)的配置文件,通常位于`solrconfig.xml`中,定义数据源和查询语句。 3. 在`data-config.xml`中设置JDBC连接参数,包括URL、用户名、密码和驱动类名。 4. 使用...

    solr运行配置与数据库数据导入到solr

    5. **导入数据库数据**:为了实现数据库数据导入,将JDBC驱动和`apache-solr-dataimporthandler-3.6.0.jar`复制到`solr.war`解压后的`WEB-INF/lib`目录。然后,将`example-DIH`目录下的内容覆盖到Solr Home的相应...

    solr-dataimportscheduler-1.4.jar 增量定时同步数据到solr.rar

    它通过一个配置文件(通常是`data-config.xml`)来定义如何从数据库或其他数据源提取数据,然后将这些数据转化为适合Solr索引的格式。DIH支持多种数据源,包括MySQL、Oracle、SQL Server等常见数据库。 2. **增量...

    solr-dataimport-scheduler.jar 可使用于solr7.x版本

    为了保持索引与源数据的一致性,Solr引入了DIH,这是一个内建的机制,用于从关系数据库、XML文件等外部数据源导入数据,并将其转化为Solr可以处理的索引格式。 数据导入调度器(Data Import Scheduler)是DIH的一个...

    solr4.7从数据库导数据[参照].pdf

    ### Solr 4.7 从数据库导入数据创建索引详解 #### 一、概述 在实际工程应用中,从数据库导出数据并创建索引来优化搜索效率是一种常见的做法。本文将详细介绍如何使用Solr 4.7从SQL Server 2005数据库中导入数据并...

    solr配置中文解析器和将数据导入solr索引库时所需的jar包

    在实际操作中,你可能需要根据具体的数据源和需求选择并添加额外的jar包。确保所有必要的依赖都已添加,并且与Solr的版本兼容,否则可能会导致导入失败或者运行时错误。 总之,配置Solr以支持中文解析器是优化中文...

    solr京东案例包括项目资料和数据库

    这涉及数据源的连接、数据转换(如JSON、XML格式)以及使用Solr的DataImportHandler(DIH)或其他工具进行数据导入。 3. **查询与搜索优化**:Solr提供了丰富的查询API,可以实现多种复杂的搜索逻辑,例如模糊匹配...

    Solr定时更新Solr定时更新

    而定时更新功能是Solr的一个重要特性,它允许用户定期地、自动地从数据源导入新数据或者更新已有数据,以保持索引与实际数据的一致性。 在Solr中,定时更新主要通过DataImportHandler(DIH)实现,这是一个用于将...

    solr增量导入更新索引包

    Solr,作为一款流行的开源全文搜索引擎,经常被用于大规模数据的快速检索。...通过理解并正确应用上述知识点,你可以有效地管理和维护Solr的增量导入更新索引,确保系统的高效运行和数据的实时性。

Global site tag (gtag.js) - Google Analytics