使用Camel在来自不同来源的Solr中索引数据
Apache Solr是建立在Lucene之上的“流行的,快速的開源企業搜索平臺”。 為了進行搜索(并查找結果),通常需要從不同的來源(例如內容管理系統,關系數據庫,舊系統)中提取數據,這是您最初的要求……然后,還要保持索引的最高難度。通過添加新數據,更新現有記錄,刪除過時數據來確定日期。 新數據源可能與初始數據源相同,但也可能是Twitter,AWS或其余端點之類的數據源。
Solr可以理解不同的文件格式,并提供大量的數據選項
索引 :
但是在現實生活中,用數百萬個文檔,數十個轉換,過濾,內容豐富,復制,并行處理來索引來自不同來源的數據不僅需要更多。 解決這種挑戰的一種方法是重新發明輪子:編寫少量自定義應用程序,將它們與一些腳本結合起來或運行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
總結
以上是生活随笔為你收集整理的使用Camel在来自不同来源的Solr中索引数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简易征收不用备案了吗(简易征收不备案可以
- 下一篇: 惠阳区房管局备案查询官网(惠阳区房管局备