閱讀394 返回首頁    go 阿裏雲 go 技術社區[雲棲]


剖析solr實用性

我的使用經曆

使用solr3.6版本,配合自己用lucene3.6建立的索引,搭建了一個搜索服務,前台通過http訪問solr服務,獲取由solr排序後的結果集。環境是linux ubuntu,servlet容器是tomcat。這個搜索服務是提供給php開發人員使用的。根據我現在對solr的理解和使用感受,我想說說solr這玩意兒的實用性。


我對solr的理解

solr包裝了lucene之後,將整個搜索項目放入了Servlet容器裏(jetty或者tomcat),變成一個web service。與lucene不同的是,solr把索引的定製,建立,更改,查詢全部放入自己的配置文件裏。從scheme.xml和solrconfig.xml兩個配置文件,我認為就看到了solr可以做到的一切

具體說,scheme.xml裏主要可以配置:分詞工具,每個field類型采用的solr類,索引結構(field,STORE,ANALYZE),默認搜索域,默認與或規則。作為一名使用過lucene的開發者,在看到官方一些solr構建索引的方式之後,我果斷放棄了solr來建索引。solr多種方式建立索引的方式,是為了適合不同的場景和使用需求,無論是讀xml,csv文件數據,和數據庫交互讀數據還是http方式的json更新索引,都讓我覺得不底層。當然,這是solr包裝了lucene後的結果。我覺得這種形式比較方便做工具的整合,比如你用Nutch或者別的工具爬數據,然後分析整理後變成一個http url或者存成了csv文件,緊接著通過Solr自動去讀取建立索引,最後再用solr這個web服務提供搜索服務。而至少對於我來說,我想做的是我自己更細致地來處理數據的建索引過程。借著solr與lucene的兼容性,我自己用lucene建索引並放入solr的路徑裏提供搜索。

再看solrconfig.xml,它可以配置:索引文件路徑,solr的三種緩存(filterCache, queryResultCache, documentCache),索引更新及參數配置,索引查詢時候的各種參數(默認字段,是否高亮,過濾字段,字段權重,打分公式等)。


的確,通過solr的這兩個配置,一個搜索服務很可以簡單搭建起來,但是我定義solr隻是一個數據庫層之上的東西,solr之上的代碼如果僅僅通過solr的url傳參方式得到搜索結果,隻能是得到一個很通用的搜索結果集,無法個性化定製搜索。如果要更針對個性化的需求,在solr和前台之間還需要一層中間件,這層中間件應該需要做這些事:

1. 接受到前台傳來的搜索詞,對詞進行個性化處理和賦權

2. 對搜索請求分發到不同索引文件和字段進行搜索(這裏不是指分布式分發,隻是邏輯上分發到不同索引塊)

3. 從solr獲得結果之後,再進行一些局部的排名和優化,甚至可以再過濾處理

我認為隻要你自己可以寫servlet,完全可以用lucene和servlet搭建一個比solr更具實用性和個性的搜索服務,而不像solr那麼通用和高層(針對api的底層而言)。solrj提供了solr的java api,可以使用solr的api來類似lucene一樣進行各種query的查詢和處理,但是如果沒有solrj呢?比如php,就隻能通過solr的url做一些參數的拚湊,獲得返回結果,實在有點太通用了。或者說,solr根本不是一個搜索引擎服務,否則是黑了“搜索引擎”這個詞。它隻是數據庫之上的一層數據索引層,其他的東西你自己繼續添加吧

其實就我看到的網上的一些solr資料,無非是一些solr安裝啊,配置啊,結合數據庫,結合nutch搭建了一個服務啊之類的,總結就是都很通用,技術性都不強,不能成為搜索引擎。隻是一個基於數據庫數據的一個打分ranking處理而已。


總結

solr的確配置方便,通過配置可以解決大部分問題,但是這東西太通用了,為什麼感覺是給非碼農用的?為什麼我使用過lucene之後,就不想用它建索引,而寧可自己再寫一個工程來做建索引這件事情?solr隻是一個能放入servlet容器的東西而已?對非java的語言,除了改solr源碼,你還能怎樣定製自己的搜索?

(以上問題的解決方案我將在博客裏更新,在《Apache solr 3.1 cookbook》裏有一些進階的使用方法)


最後更新:2017-04-04 07:03:34

  上一篇:go 炫酷Win 8十大令人抓狂惡作劇
  下一篇:go 看Ubuntu如何提升Linux級別