Solr是一個Java開發的基於Lucene的 企業級 開源 全文搜索 平臺。 它採用的是反向索引,即從關鍵字到文檔的映射過程。 Solr的資源以Document爲對象進行存儲,每一個文檔由一系列的 Field 構成,每一個Field 表示資源的一個屬性。 文檔的Field能夠被索引, 以提工高性能的搜索效率。 通常狀況下文檔都包含一個能惟一表示該文檔的id字段。
如某房屋租賃站點的租房頻道, 其房屋搜索功能可經過Solr來實現,每條租房信息就是solr中的一篇文檔。 solr能夠基於編譯好的全文索引, 提供高性能的標籤篩選租房信息,甚至是自定義關鍵字的高效搜索,查詢結果的統計效率也極好。
1. Sphinx 相較於solr,與數據庫整合較好,操做更簡單,性能更好。 可是須要商業受權。
2. Lucene 底層的索引程序 Java類庫。
3. Solr 基於lucene,相較於Sphinx,更成熟完善,實時索引,擴展性好,支持特性多,對中文分詞支持更好。在穩定的前提下, 業界用Solr的最多。
4. Elasticsearch 基於lucene,較之於solr有更好的分佈式支持。
java
1. 相較於Mysql有更好的文本搜索性能 2. 高效、靈活的緩存功能 3. 高亮顯示搜索結果 4. 基於Solr的查詢完全杜絕了在Mysql中存在的sql注入安全問題 5. 基於Solr的facet特性提供標籤聚合統計功能,實現商品在不一樣篩選標籤下的計數統計,進而能人性化的將產品數目爲0的篩選標籤灰化,一樣的功能在mysql中則難以實現 6. 提供基於Web的管理界面
#新版本的solr 5.x不依賴於tomcat,可獨立運行服務,只需安裝java環境 #安裝jdk sudo yum install java-1.7.0-openjdk #官網下載solr發行版 wget http://www.us.apache.org/dist/lucene/solr/5.3.1/solr-5.3.1.tgz tar -zxvf solr-5.3.1.tgz #配置環境變量 sudo vim /etc/profile #追加一行 export PATH=PATH:solr安裝目錄/bin #加載配置文件 . /etc/profile #測試solr是否能正常運行 solr status #回顯No Solr nodes are running.說明solr安裝成功 #若是從便於管理的角度, 能夠把solr註冊爲service solr安裝目錄/bin/install_solr_service.sh
## 啓動solr服務,運行一個solr實例 solr start #啓動solr爲獨立模式 standalone (core) 或者 solr start -cloud #啓動solr爲雲模式 SolrCloud mode (collection) ## solr服務狀態 solr status ## solr服務啓動後,咱們能夠在當前solr實例下建立core ## 之後的文檔索引處理都將基於一個core來進行 solr create -c corename #獨立模式將建立core,雲模式將建立collection ## solr自帶了幾個參考實例(每一個實例預置了若干core),能夠經過以下方式運行實例 solr -e exampleName #exampleName包括 cloud : SolrCloud example dih : Data Import Handler (rdbms, mail, rss, tika) schemaless : Schema-less example (schema is inferred from data during indexing) techproducts : Kitchen sink example providing comprehensive examples of Solr features
數據導入前須要配置schema和solrconfig, 而後能夠按稍後的任意方法推送數據到solr中
node
############################################ Schema配置 ############################################### Schema的意義相似於關係數據庫中的表結構,它描述了solr中文檔的字段結構、字段類型等 其中主要包含field, uniqueKey, fieldType的定義 咱們在 server/solr/bbs/conf 目錄下,建立schema.xml,來描述Schema 定義field(描述solr文檔中每一個字段的特性): <field name="" type="" indexed="true" stored="true" required="true" /> 屬性: name 字段名稱(必選字段) type 字段類型(必選字段), 可選類型定義在當前schema.xml的一系列fieldType節點中 indexed 該字段是否要被索引,從而字段可進行搜索和排序 stored 該字段是否存儲,仍是僅建索引, true時查詢結果可返回該字段值。若是該字段僅用於搜索不須要查詢結果,建議設false提升性能 required 該字段是否必選 default 該字段默認值 multiValued 若字段包含多個值須要設爲true docValues 若字段有文檔值則須要true,在faceting, grouping, sorting and function queries時有用,通常能加速索引的載入 omitNorms true時將忽略字段規範,可解除字段長度一致性限制,提高該字段的索引時間,節省內存 termVectors 是否存儲該字段的詞向量,若是字段作MoreLikeThis的類似性查詢,則應設true來提高性能。高亮功能依賴此項 termPositions 是否存儲詞向量的位置信息,這會增長存儲成本。高亮功能依賴此項 termOffsets 是否存儲詞向量的位偏移信息,這會增長存儲成本。高亮功能依賴此項 定義uniqueKey(指定惟一標識文檔的字段): 常見爲: <uniqueKey>id</uniqueKey> 定義fieldType: 描述了solr文檔字段的可用類型, 通常有:string, boolean, int, float, long, date ... 例如: <fieldType name="string" class="solr.StrField" sortMissingLast="true" /> fieldType除了傳統類型,亦可定義中文分詞器引入的字段類型 ############################################ solrconfig配置 ############################################### solrconfig是solr的配置文件,它描述了solr的索引存儲路徑,請求處理器(/query、/export等)及緩存策略等 文件位於: server/solr/corename/conf/solrconfig.xml:
這裏介紹兩類經常使用的導入數據方法,其餘方法請參考官方手冊
mysql
方法1:Post命令接口 - 推送格式化文件數據到Solr中
web
post -c corename files|directories #支持json、xml、csv、excel、word、pdf等等格式的文件 例如推送xml格式爲例的一篇文檔: post -c corename exam.xml ## exam.xml <add> <doc> <field name="id">SOLR1000</field> <field name="name">湯臣一品</field> <field name="city">上海</field> <field name="country">中國</field> <field name="desc">牛逼哄哄的高端住宅</field> <field name="date">2010-01-17T00:00:00.000Z</field> </doc> </add>
方法2:DIH(DataImportHandler)方法 - 導入其餘數據源的數據到Solr中sql
DIH包含多種導入類型:shell
1.從DB導入
數據庫
2.從RSS導入
apache
3.從IMAP郵件服務導入
django
4.從其餘solr core拷貝
json
5.經過Tika集成從其餘格式文檔如HTML, PDF, Doc導入
更多細節可參考solr自帶dih樣例
這裏介紹DIH中的MysqlDB導入類型
安裝java-mysql鏈接驅動: sudo yum install mysql-connector-java cp mysql-connector-java.jar server/solr-webapp/webapp/WEB_INF/lib/ 拷貝 dist/solr-dataimporthandler-5.3.1.jar 到 server/solr-webapp/webapp/WEB_INF/lib/ 修改solr配置文件 server/solr/corename/conf/solrconfig.xml: 添加: <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler> 還要添加: <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-\d.*\.jar"/> (在 regex="solr-cell-\d.*\.jar" 以前添加 ) 建立data-config.xml: <?xml version="1.0" encoding="UTF-8" ?> <dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/django_blog" user="root" password=""/> <document name="blog"> <entity name="blog_blog" pk="id" query="select id,title,content from blog_blog" deltaImportQuery="select id,title,content from blog_blog where ID='${dataimporter.delta.id}'" deltaQuery="select id from blog_blog where add_time > '${dataimporter.last_index_time}'" deletedPkQuery="select id from blog_blog where id=0"> <field column="id" name="id" /> <field column="title" name="title" /> <field column="content" name="content"/> </entity> </document> </dataConfig> ## data-config.xml說明: query 用於初次導入到索引的sql語句。 若數據表中的數據量很是大,不能一次索引完,則分批完成。查詢語句query設置兩個參數:${dataimporter.request.length} ${dataimporter.request.offset} query=」select id,title,content from blog_blog limit ${dataimporter.request.length} offset ${dataimporter.request.offset}」 請求:http://localhost:8983/solr/collection2/dataimport?command=full-import&commit=true&clean=false&offset=0&length=10000 deltaImportQuery 根據ID取得須要進入的索引的單條數據。 deltaQuery 用於增量索引的sql語句,用於取得須要增量索引的ID。 deletedPkQuery 用於取出須要從索引中刪除文檔的的ID
#########################################################################
基於http的get請求 可用參數: q #搜索關鍵字 fl #指定返回字段 wt #指定返回格式 index #是否縮進 sort #指定排序字段,默認按score倒序 hl #指定高亮字段, 用法:hl=true&hl.fl=filedName 例子: ask &indent=true
#########################################################################
Solr數據更新只需導入id相同的文檔便可。 solr會根據文檔的id字段惟一標識文檔,若是導入的文檔的id已經存在solr中,那麼這份文檔就被最新導入的同id的文檔自動替換。
#########################################################################
post -c corename "<delete><id>SOLR1000</id></delete>" #刪除指定id文檔 post -c corename "<delete><query>city:上海</query></delete>" #搜索刪除查詢匹配文檔 post -c corename "<delete><query>city:上海 AND country:中國</query></delete>" #搜索刪除多個條件的查詢匹配文檔 post -c corename "<delete><query>*:*</query></delete>" #清空solr文檔
Facet特性提供了對某一字段下的標籤進行聚合統計的功能
服務啓動後咱們便能訪問管理界面了,地址欄輸入: ip:8983 #ip爲solr服務所在主機ip
截圖以下:
功能簡介:
numDocs:當前系統中的文檔數量,可能大於推送的文件個數,由於一個推送文件可能包含多個文檔(即多個<doc>標籤) maxDoc:可能比numDocs的值要大,由於solr中的一次更新操做也會致使maxDoc增大 deletedDocs:文檔的更新也會致使deltedDocs的值也會加1
截圖下:
功能簡介:
q輸入框: 指定搜索語法,如搜索city字段爲上海的文檔, 語法爲 city:上海