使用Camel在来自不同来源的Solr中索引数据

Apache Solr是建立在Lucene之上的“流行的,快速的开源企业搜索平台”。 为了进行搜索(并查找结果),通常需要从不同的来源(例如内容管理系统,关系数据库,旧系统)中提取数据,这是您最初的要求……然后,还要保持索引的最高难度。通过添加新数据,更新现有记录,删除过时数据来确定日期。 新数据源可能与初始数据源相同,但也可能是Twitter,AWS或其余端点之类的数据源。

Solr可以理解不同的文件格式,并提供大量的数据选项
索引 :

  1. 直接HTTP和远程流传输–通过发布用于直接索引的文件或用于远程流传输的文件路径,允许您通过HTTP与Solr进行交互。
  2. DataImportHandler –是一个模块,可从关系数据库或文件系统中同时导入增量增量和增量增量。
  3. SolrJ –一个使用Apache Commons HTTP Client访问Solr的Java客户端。

但是在现实生活中,用数百万个文档,数十个转换,过滤,内容丰富,复制,并行处理来索引来自不同来源的数据不仅需要更多。 解决这种挑战的一种方法是重新发明轮子:编写少量自定义应用程序,将它们与一些脚本结合起来或运行cronjobs。 另一种方法是使用一种灵活的工具,该工具设计为可配置和可插入的,可以帮助您轻松扩展和分配负载。 这样的工具是Apache Camel,它现在也具有Solr 连接器 。

一切始于几个月前,在Sourcesense的大本营期间,我和我的同事Alex在这里尝试不同的项目,以实现将数据索引到Solr中的管道。 不出所料,我们发现了Camel,经过几天的配对,我们已经准备好将最初的Solr组件版本提交给Camel,并由Ben Oday进行了进一步扩展。 目前,它具有功能齐全的Solr连接器,该连接器在后台使用SolrJ,并允许您:配置SolrServer和StreamingUpdateSolrServer的所有参数; 支持以下操作:insert,add_bean,delete_by_id,delete_by_query,commit,rolback,optimize; 索引文件,SolrInputDocument实例,具有批注或单个消息头的Bean。

创建一个骆驼路线来索引关系数据库表和本地文件系统中的所有数据很简单:

public void configure() {
from("timer://clear?repeatCount=1").to("direct:clearIndex");from("file:src/data?noop=true").to("direct:insert");from("timer://database?repeatCount=1").to("sql:select * from products?dataSourceRef=productDataSource").split(body()).process(new SqlToSolrMapper()).to("direct:insert");from("direct:insert").setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_INSERT)).to(SOLR_URL).setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_COMMIT)).to(SOLR_URL);from("direct:clearIndex").setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_DELETE_BY_QUERY)).setBody(constant("*:*")).to(SOLR_URL).setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_COMMIT)).to(SOLR_URL);
}

上面的方法将首先删除所有文档,然后再删除提交,以清除索引。 然后它将开始从src / data文件夹轮询文件,读取每个文件并将其发送到Solr端点。 假设文件采用Solr可以理解的格式,则将对它们进行索引并提交。 第三条路线将从数据库(在内存中)检索所有产品,将它们拆分成单独的记录,将每个记录映射到Solr字段,然后进行摘要。 幸运的是,在2012年,软件开发人员的生活并不那么简单 。 如今,取而代之的是,更实际的索引要求将由以下内容组成:

如果文件获得批准,请尽快提交,否则每10分钟提交一次。

骆驼如何为您提供帮助? 骆驼支持包括S3在内的大多数流行的Amazon API。 使用aws-s3组件,可以从S3存储桶中读取文件,然后对批准的文档应用过滤器,以便将它们发送到单独的路由中以进行即时提交。

<route><from uri="aws-s3://MyBucket?delay=5000&maxMessagesPerPoll=5"/><choice><when><xpath>/add/doc[@status='approved']</xpath><to uri="direct:indexAndCommit"/></when><otherwise><to uri="direct:index"/></otherwise></choice>
</route>
<route><from uri="timer://commit?fixedRate=true&period=600s"/><from uri="direct:commit"/>
</route>

通过调用XXX外部服务来丰富经纬度的地址数据,以方便在Solr中进行空间搜索。

<route id="fromDB"><from uri="jpa://com.ofbizian.pipeline.Customer?consumer.namedQuery= newCustomers&maximumResults=10&delay=5000"/><enrich uri="direct:coordinateEnricher" strategyRef="latLongAggregationStrategy"/><to uri="direct:index"/></route><route><from uri="direct:coordinateEnricher"/><setHeader headerName="CamelHttpQuery"><simple>address='${body.address}'&sensor=false</simple></setHeader><to uri="http://maps.google.com/maps/api/geocode/xml"/><setHeader headerName="lat"><xpath resultType="java.lang.Double">//result[1]/geometry/location/lat/text()</xpath></setHeader><setHeader headerName="lng"><xpath resultType="java.lang.Double">//result[1]/geometry/location/lng/text()</xpath></setHeader></route>

上面的路线一次从“客户”表10记录中读取数据,并且每条路线都将使用客户地址字段调用google的maps API来获取经度和纬度。 使用XPath从响应中提取坐标,然后将其合并回Customer对象。 很简单,不是吗。

3.在我们的内容管理系统中,此/那个/路径下的内容编入索引,并监视更新。

<route><from uri="jcr://user:pass@repository/import/inbox/signal?eventTypes=3&deep=true&synchronous=false"/><to uri="direct:index"/>
</route>

Camel有一个jcr连接器,使您可以在任何Java内容存储库中创建内容。 CAMEL-5155中还提交了一项改进,该改进将允许很快从JCR v.2支持存储库中读取内容。 如果幸运的话,并且您的CMS支持CMIS,则可以出于相同目的使用来自github的camel-cmis连接器。

4.聆听有关我们产品/公司的推文,进行情感分析,并仅索引积极的推文。

<route id="fromTwitter"><from uri="twitter://streaming/filter?type=event&keywords=productName&consumerKey={{consumer.key}}&consumerSecret={{consumer.secret}}"/><setHeader headerName="CamelHttpQuery"><language language="beanshell">"q=" + java.net.URLEncoder.encode(request.getBody().getText(), "UTF-8")</language></setHeader><throttle timePeriodMillis="1500"><constant>1</constant><to uri="http://data.tweetsentiments.com:8080/api/analyze.xml"/><setHeader headerName="sentiment"><xpath resultType="java.lang.Double">/sentiment/value/text()</xpath></setHeader><filter><simple>${in.header.sentiment} > 0</simple><to uri="direct:index"/></filter></throttle>
</route>

这条路线将使用Twitter的实时a​​pi侦听tweet,对tweet进行url编码,并调用tweetsentiments API进行情感分析。 此外,它将应用限制,因此每秒钟调用次数最多受限制,因此每1500毫秒最多仅发出一个请求。 然后,该路由将在应用索引之前应用过滤器以忽略所有否定推文。

如您所见,Camel可以轻松地与许多不同的系统(包括Solr)进行交互,即使您有非常自定义的应用程序,编写连接器也并不困难。 但这只是故事的一方面。 另一方面,还有Camel实施的企业集成模式的完整列表,这些通道对于任何严重的数据摄取管道都是必需的:路由器,转换器,过滤器,拆分器,聚合器,Content Enricher,负载均衡器…最后但并非最不重要的:异常处理,日志记录,监视,DSL……两个词: 骆驼岩!

PS 示例的完整源代码可以在我的github帐户上找到。

参考: 使用来自OFBIZian博客的JCG合作伙伴 Bilgin Ibryam的Camel在来自不同来源的Solr中建立索引数据 。

翻译自: https://www.javacodegeeks.com/2013/03/indexing-data-in-solr-from-disparate-sources-using-camel.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS画各种二维图形

1.效果 2.源码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><style type"text/css">#triangle_top{display: inline-block;width:0;height:0;border-left:50px solid transparent;bor…

成都网站建设企业网站备案需要哪些资料?

一、企业备案所需资料&#xff1a;①主办单位有效证件扫描件&#xff08;营业执照&#xff09;&#xff1b;②主办单位负责人有效证件复印件&#xff08;身份证&#xff09;&#xff1b;③主办单位负责人法人授权书扫描件&#xff08;主体负责人是法人&#xff0c;这个就不用上…

数据库的开启与关闭

今天&#xff0c;为了一些原因&#xff0c;要重启数据库&#xff0c;但因为当时安装的时候&#xff0c;同学随便装了&#xff0c;导致很多文件都找不到&#xff0c;想使用绝对路径重启数据的计划卡死在了路上。以下&#xff0c;我写下我的数据库开启、关闭的方法&#xff0c;方…

leetcode怎么用时间刷_刷完700多题后的首次总结:LeetCode应该怎么刷?

推荐观看&#xff1a;java技术进阶&#xff1a;膜拜&#xff01;字节大神总结的666页大师级算法宝典&#xff0c;分分钟团灭LeetCode​zhuanlan.zhihu.com2020最新马士兵老师联手左程云老师丨数据结构与算法丨面试BATJ必备​www.bilibili.com我是大二的时候开始接触LeetCode的&…

IntelliJ IDEA:使用Google Guava生成equals,hashCode和toString

问题 在Java领域&#xff0c;我们经常需要编写equals &#xff0c; hashCode和toString方法。 老实说&#xff0c;这通常只是一个样板义务。 得益于智能IDE&#xff0c;我们通常不再自己这样做。 我们只是让和IDE一起努力。 不过有一个问题。 生成的代码通常非常丑陋。 让我们…

css代码整理

width&#xff1a;&#xff08;宽度&#xff09; height&#xff1a;&#xff08;高度&#xff09; border&#xff1a;1px solid red&#xff1b;&#xff08;边框 &#xff1a;边框粗细 显示 颜色&#xff09; border-radius&#xff1a;10deg&#xff1b;&#xff08;边框…

Spring动态切换多数据源解决方案

Spring动态配置多数据源&#xff0c;即在大型应用中对数据进行切分&#xff0c;并且采用多个数据库实例进行管理&#xff0c;这样可以有效提高系统的水平伸缩性。而这样的方案就会不同于常见的单一数据实例的方案&#xff0c;这就要程序在运行时根据当时的请求及系统状态来动态…

Appscan_web安全测试工具 (含修改启动浏览器的方法)

安全测试应该是测试中非常重要的一部分&#xff0c;但他常常最容易被忽视掉。 尽管国内经常出现各种安全事件&#xff0c;但没有真正的引起人们的注意。不管是开发还是测试都不太关注产品的安全。当然&#xff0c;这也不能怪我们苦B的“民工兄弟”。因为公司的所给我们的时间与…

传说之下地图素材_【开阔眼界】地图上的史记——名著轻松读

购买链接&#xff1a;https://j.youzan.com/Zns-38我读了无数次《史记》&#xff0c;每次都是读了开头没几页就放弃&#xff0c;文言文看不懂&#xff0c;翻译的白话文内容又太枯燥&#xff0c;现在居然有图画版的史记&#xff0c;还附有说明&#xff0c;真是太好了&#xff0c…

使用执行程序和ThreadPoolExecutor的Java线程池示例

线程池管理工作线程池&#xff0c;它包含一个队列&#xff0c;使任务等待执行。 线程池管理可运行线程的集合&#xff0c;工作线程从队列中执行可运行线程。 java.util.concurrent.Executors提供java.util.concurrent.Executor接口的实现&#xff0c;以在Java中创建线程池。 让…

H5_ 多媒体video,autio使用示例

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>AV</title>6 </head>7 <body>8 <div class"content">9 <p>注意:audio标签设置…

mysql中ibdata1过大的问题

ibdata1文件是什么&#xff1f; 答&#xff1a; ibdata1是一个用来构建innodb系统表空间的文件&#xff0c;这个文件包含了innodb表的元数据、撤销记录、修改buffer和双写buffer。如果file-per-table选项打开的话&#xff0c;该文件则不一定包含所有表的数据。当innodb_file_pe…

go int 转切片_「快学 Go 语言」第 4 课——低调的数组

数组就是一篇连续的内存&#xff0c;几乎所有的计算机语言都有数组&#xff0c;只不过 Go 语言里面的数组其实并不常用&#xff0c;这是因为数组是定长的静态的&#xff0c;一旦定义好长度就无法更改&#xff0c;而且不同长度的数组属于不同的类型&#xff0c;之间不能相互转换…

走向REST:将Tomcat与Spring和JAX-RS嵌入(Apache CXF)

这篇文章是上一篇文章的逻辑延续。 唯一的区别是我们将使用的容器&#xff1a;它将是我们的老兄Apache Tomcat而不是Jetty 。 令人惊讶的是&#xff0c;嵌入最新的Apache Tomcat 7非常容易&#xff0c;因此现在让我展示一下。 我不会重复完整的上一篇文章 &#xff0c;因为除了…

移动端下,点击a标签背景高亮问题的解决方法

在制作某个移动端项目的时候&#xff0c;发现当我们点击链接&#xff0c;input标签或者div盒子的时候&#xff0c;整个标签会出现颜色块并会闪烁一下&#xff0c;不仅影响美观&#xff0c;而且会极大降低了用户体验。  解决方案&#xff1a;-webkit-tap-highlight-color: tra…

Sublime Text 3 Mac常用快捷键与注意事项

大多数情况下容易忘记的快捷键&#xff0c;在此整理了一下。 编辑快捷键&#xff1a;cmd L&#xff1a;选择行&#xff08;重复按下将下一行加入选择&#xff09;&#xff1b;cmd D&#xff1a;选择词&#xff08;重复按下时多重选择相同的词进行多重编辑&#xff09;&#xff…

Python 基础知识整理-2

条件语句  if else 循环语句  while  for 循环之break continue break语句用来终止循环语句&#xff0c;即循环条件没有False条件或者序列还没被完全递归完&#xff0c;也会停止执行循环语句。 break语句用在while和for循环中。 continue 语句用来告诉Python跳过当前循…

js实现oss批量下载文件_js下载文件到本地各种方法总结

一、此方法火狐有些版本是不支持的window.location.href https://*****.oss-cn-**.aliyuncs.com/*********;二、为了解决火狐有些版本不支持,可以改成这种方式window.locationhttps://*****.oss-cn-**.aliyuncs.com/*********;三、该方法IE和火狐都可以,url表示要下载的文件路径…

Couchbase 101:从Java应用程序创建视图(MapReduce)

使用Couchbase 2.0开发新应用程序时&#xff0c;有时需要从代码中动态创建视图。 例如&#xff0c;在安装应用程序&#xff0c;编写一些测试时&#xff0c;可能会需要此方法&#xff1b;或者&#xff0c;在构建框架时&#xff0c;您也可以使用它&#xff0c;并希望动态创建视图…

函数的参数详解

# 函数的参数定义函数的时候&#xff0c;我们把参数的名字和位置确定下来&#xff0c;函数的接口定义就算完成了。 对于函数的调用者来说&#xff0c;只需要知道如何传递正确的参数&#xff0c;以及函数将返回什么样的值就够了 函数内政部的复杂逻辑被封装起来&#xff0c;调用…