老牌全文搜索引擎 Solr

介紹

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


Solr優勢

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

Facet特性提供了對某一字段下的標籤進行聚合統計的功能



集成中文分詞IK Analyzer





後臺管理

服務啓動後咱們便能訪問管理界面了,地址欄輸入:
ip:8983 #ip爲solr服務所在主機ip


管理界面 - Overview菜單

    截圖以下:

    功能簡介:

numDocs:當前系統中的文檔數量,可能大於推送的文件個數,由於一個推送文件可能包含多個文檔(即多個<doc>標籤)
maxDoc:可能比numDocs的值要大,由於solr中的一次更新操做也會致使maxDoc增大
deletedDocs:文檔的更新也會致使deltedDocs的值也會加1




管理界面 - query菜單

    截圖下:


    功能簡介:

q輸入框:
指定搜索語法,如搜索city字段爲上海的文檔, 語法爲 city:上海
相關文章
相關標籤/搜索