天天看點

[Erlang 0104] 當Erlang遇到Solr  Solr esolr擴充

   Solr (pronounced "solar") is an open source enterprise search platform from the Apache Lucene project. Its major features include full-text search, hit highlighting, faceted search, dynamic clustering, database integration, and rich document (e.g., Word, PDF) handling. Providing distributed search and index replication, Solr is highly scalable. Solr is the most popular enterprise search engine. Solr 4 adds NoSQL features.    Solr is written in Java and runs as a standalone full-text search server within a servlet container such as Apache Tomcat or Jetty. Solr uses the Lucene Java search library at its core for full-text indexing and search, and has REST-like HTTP/XML and JSON APIs that make it usable from most popular programming languages. Solr's powerful external configuration allows it to be tailored to many types of application without Java coding, and it has a plugin architecture to support more advanced customization.

2014-2-17 15:03:21 補充一點Solr的東西:

Solr 可以做到 NEAR-Real-time Search ,  這個應該歸功于softcommit

Solr 4 之前的版本隻有送出到Lucene索引才能檢索到,現在可以做到Real Time Get;換句話話說一個剛剛送出的資料,還沒有Commit,現在是可以做修改的;能夠做到這點是因為Transcation log,資料送出到Solr會寫入transaction log.這個設計解耦了update durability和update visibility 

目前Solr 4.x還是需要以文檔為機關進行資料更新,重新做索引;換句話說新增字段的時候每條資料都要重新處理,重新做索引

Solr在任意時刻隻有一個Active Searcher,Active Searcher有一份隻讀的Lucene索引快照.換句話說,當有新内容送出到Solr之後,這條資料對目前的Searcher是不可見的;新條目從不可見到可見:關閉目前的Searcher然後打開一個新的Searcher,新的Searcher會加載最新的索引的快照;這就是我們Commit資料到Solr的本質,關閉Old Searcher的時候會等把目前in-progress請求全部處理完;Old Searcher中緩存的資料也會被清理掉,這樣是有道理的,有的資料可能已經删除了,可能有新資料了;New Searcher需要做一些預計算,是以Solr會有一個Warming Searcher的設計:等待New Searcher預熱完畢再關閉之前的Searcher,這樣搜尋性能不會有明顯的下降,對于Solr重新啟動的情況,要看useColdSearcher是否開啟,如果是false那就要阻塞到Searcher完成預熱;Warming Searcher有兩種方式:1.從old cache複制 2.執行cache warming queries,這個語句是開發者根據自己的業務定制的,不能用預設的;因為開啟之後會有性能損失,預設是注釋掉的,由開發者根據實際情況執行定制;一旦達到maxWarmingSearchers的數量上限,Commit就會失敗,預熱太多個Searcher會消耗CPU和Memeory;

 filtercache相當于緩存了若幹資料分組結果,但是如果資料分組數量有限,命中率太低,那效果可以想象非常差;這個政策如果使用不當,就會浪費記憶體,比如:過濾條件過于複雜極小機率命中;solrconfig.xml中有對應的配置節,可以配置autowarmcount,自動預熱是從old searcher中提取一些語句在new searcher中執行;autowarm會影響new searcher的啟動速度,如果commit比較快,要求不停的建立新的searcher,就悲劇了;是以autowarmcount設定的值一般比較小;

queryResultWindowsSize 可以預取分頁資料.queryResultMaxDocsCached 每條檢索語句最多傳回多少條文檔;enableLazyFieldLoading可以優化取文檔部分字段的情況,延遲加載的字段在用到的時候再請求;

segement merging是怎麼回事?一份Luncene索引由若幹個Segement構成,每一個查詢都要在所有的Segement裡面拿結果,Segment太多會影響性能;是以需要用合并機制

  搭建全文搜尋服務Solr的确是一個不錯的選擇,分分鐘就可以搭建起來Solr的環境,配置好IK什麼的,那Erlang應用如何使用Solr服務呢?從上面維基百科的介紹中,我們可以捕捉到一些資訊:REST-full API,XML,JSON,HTTP.看到這裡已經全是我們熟悉的技術方案了,我們深入進去看下:

     |> Add/Update documents esolr:add/2

     |> Delete documents esolr:delete/2

     |> Search esolr:search/3

先看看怎麼使用這些上面的接口:

[Erlang 0104] 當Erlang遇到Solr  Solr esolr擴充
[Erlang 0104] 當Erlang遇到Solr  Solr esolr擴充

測試結果如下:

[Erlang 0104] 當Erlang遇到Solr  Solr esolr擴充
[Erlang 0104] 當Erlang遇到Solr  Solr esolr擴充

 

代碼實作 

  翻開代碼,下面這個方法包含了大部分技術要點:

[Erlang 0104] 當Erlang遇到Solr  Solr esolr擴充
[Erlang 0104] 當Erlang遇到Solr  Solr esolr擴充
[Erlang 0104] 當Erlang遇到Solr  Solr esolr擴充
[Erlang 0104] 當Erlang遇到Solr  Solr esolr擴充

在parse_search_response方法裡面gen_server:reply調用最終完成了對請求的應答.

XML & Json

既然要處理XML,當然要用到xmerl子產品了,encode_*系列子產品基本上都是用它完成資料的encode,比如:

 HTTPResponse解析還會用到xmerl_scan,xmerl_xpath

[Erlang 0104] 當Erlang遇到Solr  Solr esolr擴充
[Erlang 0104] 當Erlang遇到Solr  Solr esolr擴充

 除了XML之外,還要解析JSON,這裡使用的是RFC4627.

ok,今天就到這裡.

最後小圖一張 Miss Nine

[Erlang 0104] 當Erlang遇到Solr  Solr esolr擴充