使用Camel在来自不同来源的Solr中索引数据
Apache Solr是建立在Lucene之上的“流行的,快速的開源企業(yè)搜索平臺(tái)”。 為了進(jìn)行搜索(并查找結(jié)果),通常需要從不同的來源(例如內(nèi)容管理系統(tǒng),關(guān)系數(shù)據(jù)庫,舊系統(tǒng))中提取數(shù)據(jù),這是您最初的要求……然后,還要保持索引的最高難度。通過添加新數(shù)據(jù),更新現(xiàn)有記錄,刪除過時(shí)數(shù)據(jù)來確定日期。 新數(shù)據(jù)源可能與初始數(shù)據(jù)源相同,但也可能是Twitter,AWS或其余端點(diǎn)之類的數(shù)據(jù)源。
Solr可以理解不同的文件格式,并提供大量的數(shù)據(jù)選項(xiàng)
索引 :
但是在現(xiàn)實(shí)生活中,用數(shù)百萬個(gè)文檔,數(shù)十個(gè)轉(zhuǎn)換,過濾,內(nèi)容豐富,復(fù)制,并行處理來索引來自不同來源的數(shù)據(jù)不僅需要更多。 解決這種挑戰(zhàn)的一種方法是重新發(fā)明輪子:編寫少量自定義應(yīng)用程序,將它們與一些腳本結(jié)合起來或運(yùn)行cronjobs。 另一種方法是使用一種靈活的工具,該工具設(shè)計(jì)為可配置和可插入的,可以幫助您輕松擴(kuò)展和分配負(fù)載。 這樣的工具是Apache Camel,它現(xiàn)在也具有Solr 連接器 。
一切始于幾個(gè)月前,在Sourcesense的大本營期間,我和我的同事Alex在這里嘗試不同的項(xiàng)目,以實(shí)現(xiàn)將數(shù)據(jù)索引到Solr中的管道。 不出所料,我們發(fā)現(xiàn)了Camel,經(jīng)過幾天的配對(duì),我們已經(jīng)準(zhǔn)備好將最初的Solr組件版本提交給Camel,并由Ben Oday進(jìn)行了進(jìn)一步擴(kuò)展。 目前,它具有功能齊全的Solr連接器,該連接器在后臺(tái)使用SolrJ,并允許您:配置SolrServer和StreamingUpdateSolrServer的所有參數(shù); 支持以下操作:insert,add_bean,delete_by_id,delete_by_query,commit,rolback,optimize; 索引文件,SolrInputDocument實(shí)例,具有批注或單個(gè)消息頭的Bean。
創(chuàng)建一個(gè)駱駝路線來索引關(guān)系數(shù)據(jù)庫表和本地文件系統(tǒng)中的所有數(shù)據(jù)很簡單:
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文件夾輪詢文件,讀取每個(gè)文件并將其發(fā)送到Solr端點(diǎn)。 假設(shè)文件采用Solr可以理解的格式,則將對(duì)它們進(jìn)行索引并提交。 第三條路線將從數(shù)據(jù)庫(在內(nèi)存中)檢索所有產(chǎn)品,將它們拆分成單獨(dú)的記錄,將每個(gè)記錄映射到Solr字段,然后進(jìn)行摘要。 幸運(yùn)的是,在2012年,軟件開發(fā)人員的生活并不那么簡單 。 如今,取而代之的是,更實(shí)際的索引要求將由以下內(nèi)容組成:
如果文件獲得批準(zhǔn),請盡快提交,否則每10分鐘提交一次。
駱駝如何為您提供幫助? 駱駝支持包括S3在內(nèi)的大多數(shù)流行的Amazon API。 使用aws-s3組件,可以從S3存儲(chǔ)桶中讀取文件,然后對(duì)批準(zhǔn)的文檔應(yīng)用過濾器,以便將它們發(fā)送到單獨(dú)的路由中以進(jìn)行即時(shí)提交。
<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>通過調(diào)用XXX外部服務(wù)來豐富經(jīng)緯度的地址數(shù)據(jù),以方便在Solr中進(jìn)行空間搜索。
<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記錄中讀取數(shù)據(jù),并且每條路線都將使用客戶地址字段調(diào)用google的maps API來獲取經(jīng)度和緯度。 使用XPath從響應(yīng)中提取坐標(biāo),然后將其合并回Customer對(duì)象。 很簡單,不是嗎。
3.在我們的內(nèi)容管理系統(tǒng)中,此/那個(gè)/路徑下的內(nèi)容編入索引,并監(jiān)視更新。
<route><from uri="jcr://user:pass@repository/import/inbox/signal?eventTypes=3&deep=true&synchronous=false"/><to uri="direct:index"/> </route>Camel有一個(gè)jcr連接器,使您可以在任何Java內(nèi)容存儲(chǔ)庫中創(chuàng)建內(nèi)容。 CAMEL-5155中還提交了一項(xiàng)改進(jìn),該改進(jìn)將允許很快從JCR v.2支持存儲(chǔ)庫中讀取內(nèi)容。 如果幸運(yùn)的話,并且您的CMS支持CMIS,則可以出于相同目的使用來自github的camel-cmis連接器。
4.聆聽有關(guān)我們產(chǎn)品/公司的推文,進(jìn)行情感分析,并僅索引積極的推文。
<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的實(shí)時(shí)a??pi偵聽tweet,對(duì)tweet進(jìn)行url編碼,并調(diào)用tweetsentiments API進(jìn)行情感分析。 此外,它將應(yīng)用限制,因此每秒鐘調(diào)用次數(shù)最多受限制,因此每1500毫秒最多僅發(fā)出一個(gè)請求。 然后,該路由將在應(yīng)用索引之前應(yīng)用過濾器以忽略所有否定推文。
如您所見,Camel可以輕松地與許多不同的系統(tǒng)(包括Solr)進(jìn)行交互,即使您有非常自定義的應(yīng)用程序,編寫連接器也并不困難。 但這只是故事的一方面。 另一方面,還有Camel實(shí)施的企業(yè)集成模式的完整列表,這些通道對(duì)于任何嚴(yán)重的數(shù)據(jù)攝取管道都是必需的:路由器,轉(zhuǎn)換器,過濾器,拆分器,聚合器,Content Enricher,負(fù)載均衡器…最后但并非最不重要的:異常處理,日志記錄,監(jiān)視,DSL……兩個(gè)詞: 駱駝巖!
PS :示例的完整源代碼可以在我的github帳戶上找到。
參考: 使用來自O(shè)FBIZian博客的JCG合作伙伴 Bilgin Ibryam的Camel在來自不同來源的Solr中建立索引數(shù)據(jù) 。
翻譯自: https://www.javacodegeeks.com/2013/03/indexing-data-in-solr-from-disparate-sources-using-camel.html
總結(jié)
以上是生活随笔為你收集整理的使用Camel在来自不同来源的Solr中索引数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简易征收不用备案了吗(简易征收不备案可以
- 下一篇: IntelliJ IDEA:使用Goog