设为首页 收藏本站
查看: 712|回复: 0

[经验分享] 从数据库和其他数据源导入数据 SOLR

[复制链接]

尚未签到

发表于 2016-12-16 09:43:05 | 显示全部楼层 |阅读模式
  从数据库和其他数据源导入数据


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



  • DataImportHandler

  • MoreLikeThisComponent

  • QueryElevationComponent
    (我称之为 “编辑结果排序”)

  • SolrJ

  • 分布式搜索
    (不带有设置细节信息的架构讨论)
  如果要实践这个示例,请 下载样例应用程序
,并按以下说明进行操作:


  • 将 sample.zip 拷贝到 apache-solr-1.3.0/example/ 目录。
  • 解压缩 sample.zip

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

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

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

  • 在命令行上执行 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
。一个实体里又可以包含一个或多个实体,因此子实体就变成整体 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 篇。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-315013-1-1.html 上篇帖子: solr in Action 中文1.4 Feaures overview 下篇帖子: 基于Solr的地理位置搜索(1)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表