solr的安裝(windows)和使用

介紹

  • Solr是一個基於Lucene的Java搜索引擎服務器。Solr 提供了層面搜索、命中醒目顯示而且支持多種輸出格式(包括 XML/XSLT 和 JSON 格式)。它易於安裝和配置,並且附帶了一個基於 HTTP 的管理界面。Solr已經在衆多大型的網站中使用,較爲成熟和穩定。Solr 包裝並擴展了 Lucene,因此Solr的基本上沿用了Lucene的相關術語。更重要的是,Solr 建立的索引與php

  • Lucene 搜索引擎庫徹底兼容。經過對 Solr 進行適當的配置,某些狀況下可能須要進行編碼,java

  • Solr 能夠閱讀和使用構建到其餘 Lucene 應用程序中的索引。此外,不少 Lucene 工具(如 Nutch、 Luke)也可使用Solr 建立的索引。 總結一下:solr是一個java搜索引擎服務器(是一套war程序),內部集成了Lucene(apache提供的一些對搜索引擎作支持的jar包)。mysql

Solr服務搭建

  • 官網下載solr4.9.1的程序安裝包。 下載地址:http://archive.apache.org/dist/lucene/solr/
  • 解壓solr的zip包
  • 將dist\solr-4.9.1.war文件複製到tomcat的webapps目錄下,並將文件命名爲solr.war
  • 複製solr解壓包下example\lib\ext 下全部的jar 到tomcat 的lib目錄下
  • 在計算機本地新建一個文件夾solr_home(固然你能夠隨便起名字), 而後複製solr-4.9.1\example\solr 下的全部文件到 solr_home下
  • 啓動tomcat,待tomcat啓動成功後,關閉tomcat。打開tomcat的webapps目錄。注意,此時solr的war包以及被解壓成solr文件夾。刪除tomcat 的webapps目錄下的solr的war包,保留solr文件夾。
  • 修改配置文件apache-tomcat-7.0.67\webapps\solr\WEB-INF\web.xml
env-entry>
	<env-entry-name>solr/home</env-entry-name> 
	<env-entry-value> D:/solr_home</env-entry-value>
	<env-entry-type>java.lang.String</env-entry-type>
</env-entry>

新建數據配置 core

  • 新建core(solr中把配置的每個模塊都叫core),在solr_home目錄下,拷貝collection1文件夾,並起名爲test。打開test文件夾,修改core.properties文件,將name修改成test
  • 從新啓動tomcat,並訪問solr,如出現如下界面,則表示新建testcore成功。
  • 從新啓動tomcat,並訪問solr,如出現如下界面,則表示新建testcore成功。

新增數據庫配置

  • 拷貝數據庫鏈接jar包(mysql-connector-java-5.1.18.jar)到tomcat的lib目錄
  • 以建立testcore的方式新建hotel core
  • 打開hotel的conf文件夾中的solrconfig.xml文件,在requestHandlername="/select" class="solr.SearchHandler">前面上加上一個dataimport的處理的Handler
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
      <str name="config">data-config.xml</str>
</lst>
</requestHandler>
  • 在hotel的的conf文件夾下並新建data-config.xml文件,配置以下
?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
	<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/itripdb" user="root" password="root" /> 			<document name="hotel_doc">
	<entity name="hotel" pk="id"  query=" select id,hotelName,address from itrip_hotel">
	<field column="id" name="id"/>
	<field column="hotelName" name="hotelName"/>
	<field column="address" name="address"/>
	</entity>
	</document>
</dataConfig>
dataSource是數據庫數據源。
Entity就是一張表對應的實體,pk是主鍵,query是查詢語句。
Field對應一個字段,column是數據庫裏的column名,後面的name屬性對應着Solr的Filed 的名字。
  • 打開hotel的conf目錄下的schema.xml文件
    • 保留_version_ 這個field,添加索引字段:這裏每一個field的name要和data-config.xml裏的entity的field的name同樣,一一對應。
     

<?xml version="1.0" encoding="UTF-8"?>web

<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/itripdb" user="root" password="root" /> <document name="hotel_doc"> <entity name="hotel" pk="id" query=" select id,hotelName,address from itrip_hotel"> <field column="id" name="id"/> <field column="hotelName" name=" hotelName"/> <field column="address" name=" address"/> </entity> </document> </dataConfig> ```sql

  • 修改同目錄下的schema.xml(schema.xml 是solr對數據庫裏的數據進行索引管理和數據字段展現管理的配置文件)
刪除多餘的field,保留_version_ 和test這兩個field(注意不要刪除fieldType)
添加索引字段:這裏每一個field的name要和data-config.xml裏的entity的field的name同樣,一 一 對應。紅色加粗部分爲新增內容。
<fieldname="_version_" type="long" indexed="true"stored="true"/>
<field name="id"type="string" indexed="true" stored="true"/>
<fieldname="hotelName" type="string" indexed="true"stored="true"/>
<fieldname="address" type="string" indexed="true"stored="true"/>
<uniqueKey>id</uniqueKey>
<field name="text" type="text_general"indexed="true" stored="false"multiValued="true"/>
  • 將導入數據的JAR包拷貝到webapps/solr的lib目錄下
  • 啓動Tomcat,執行數據導入。
  • 查詢數據

配置增量更新

  • 將資料中提供的apache-solr-dataimports-cheduler.jar包添加至solr的lib目錄下 注:apachesolrdataimportscheduler.jar的jar包是apache提供的用於增量更新的jar包,但 apache提供的原jar包中,代碼有BUG。該bug在教學資料提供的jar包中已經被修復,具體可參 考提供的apachesolrdataimportscheduler的源碼,在此再也不贅述。
  • 將資料中提供的apache-solr-dataimports-cheduler.jar包添加至solr的lib目錄下。
  • 增長增量更新配置文件,在solr_home文件夾下新建conf文件夾,並新建名爲 dataimport.properties的配置文件,配置以下,標紅的地方爲須要修改的地方
#  to sync or not to sync
#  1 - active; anything else - inactive syncEnabled=1
#  which cores to schedule
#  in a multi-core environment you can decide which cores you want syncronized
#  leave empty or comment it out if using single-core deployment syncCores=test,hotel
#  solr server name or IP address #  [defaults to localhost if empty] server=localhost
#  solr server port
#  [defaults to 80 if empty] port=8080
#  application name/context
#  [defaults to current ServletContextListener's context (app) name] webapp=solr
#  增量索引的參數
#  URL params [mandatory] #  remainder of URL params=/dataimport?command=delta-import&clean=false&commit=true
#  重作增量索引的時間間隔
#  schedule interval
#  number of minutes between two runs
#  [defaults to 30 if empty] interval=1
#  重作全量索引的時間間隔,單位分鐘,默認7200,即5天;
#  爲空,爲0,或者註釋掉:表示永不重作索引
#reBuildIndexInterval=7200
#  重作索引的參數
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
#  重作索引時間間隔的計時開始時間,第一次真正執行的時間
=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;  
#  兩種格式:2012-04-11 03:10:00 或者  03:10:00,後一種會自動補全日期部分爲服務啓動時的日期  
reBuildIndexBeginTime=03:10:00
  • 新增增量更新數據的監聽器,在solr的web.xml中加入如下監聽器
<listener>
<listener-class> org.apache.solr.handler.dataimport.scheduler.ApplicationListener </listener-class>  
</listener>
  • 修改導入數據查詢SQL
<?xml version="1.0"encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource"driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/itripdb"user="root" password="root" />
<document name="hotel_doc">
         <entity name="hotel" pk="id"  query="select id,hotelName,address fromitrip_hotel"           deltaImportQuery="selectid,hotelName,address from itrip_hotel where id
='${dih.delta.id}'"
             deltaQuery="SELECT id as id FROM itrip_hotel  where modifyDate>
'${dih.last_index_time}'"> 
                 <field column="id"name="id"/>
                 <field column="hotelName"name="hotelName"/>
                 <field column="address"name="address"/>
         </entity>
</document>
</dataConfig>
deltaQuery是根據dataimport.properties配置文件中的更新時間,從數據庫中查詢出,修
改日期在最後一次更新日期以後的酒店數據,並記錄其id,而deltaImportQuery的目的是將 deltaQuery查詢出的數據導入到solr中。 6. 啓動Tomcat進行測試
啓動Tomcat,訪問hotel模塊
修改數據庫中的酒店數據並同時修改該數據的modifyDate時間,
1分鐘後查詢酒店數據,肯定數據是否更新

配置分詞器

分詞器: 是從用戶輸入的一段文本中提取關鍵詞,用於其它業務操做。
常見的 JAVA分詞器: word 分詞器、Ansj 分詞器、Stanford 分詞器、IKAnalyzer 分詞器
課程選用分詞器:IKAnalyzer分詞器
solr若是是 3.x 版本的用 IKAnalyzer2012_u6.zip 若是是 4.x 版本的用 IK Analyzer
2012FF_hf1.zip,必定要對應上,要否則會配置失敗。
IK 分詞器下載地址:http://download.csdn.net/download/tjcyjd/8420639
  • 首先,下載IKAnalyzer。
  • 將ik的全部jar文件 拷貝到 webapps\solr\WEB-INF\lib 目錄下
  • 在webapps\solr\WEB-INF\下新建classes文件夾,將IKAnalyzer.cfg.xml和stopword.dic 文件拷貝到改文件夾下。
  • 在solr_home\hotel\conf\schema.xml 增長以下配置
<fieldType name="text_ik" class="solr.TextField">
<analyzer       type="index"
class="org.wltea.analyzer.lucene.IKAnalyzer"/>
isMaxWordLength="false"
    <analyzer       type="query"
class="org.wltea.analyzer.lucene.IKAnalyzer"/>   
</fieldType>
isMaxWordLength="true"
  • 修改solr_home\hotel\conf\schema.xml將hotelName和address指定成爲text_ik類型
<field name="hotelName" type="text_ik"indexed="true" stored="true"/>
<field name="address" type="text_ik"indexed="true" stored="true"/>
  • 重啓Tomcat,訪問solr測試分詞器
  • 若是分詞器出現上邊的顯示結果,則表示分詞器配置成功。

solr基本語法

  • q – 查詢字符串。
  • fl – 指定返回那些字段內容,用逗號或空格分隔多個。
  • start – 返回第一條記錄在完整找到結果中的偏移位置,0 開始,通常分頁用。
  • rows – 指定返回結果最多有多少條記錄,配合 start 來實現分頁。
  • sort – 排序,格式:sort=<field name>+<desc|asc>[,<fieldname>+<desc|asc>]„ 。示例:(inStock desc, price asc)表示先 「inStock」 降序, 再 「price」 升序,默認是相關性降序。
  • wt – (writer type)指定輸出格式,能夠有 xml, json, php, phps, 後面 solr 1.3 增長的,要用通知咱們,由於默認沒有打開。
  • fq – (filterquery)過慮查詢,做用:在 q 查詢符合結果中同時是 fq查詢符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找關鍵字 mm,而且 date_time 是 1.5.3 solr 多字段匹配針對關鍵詞多字段的搜索,solr中提供了相應的檢索機制。
多字段匹配針對關鍵詞多字段的搜索,solr中提供了相應的檢索機制。
  • 在hotel/conf/schema.xml文件中新增filed字段存儲多字段的值(紅色內容爲新增部分)
field name="_version_" type="long"indexed="true" stored="true"/>
<field name="id" type="long"indexed="true" stored="true"/>
<field name="hotelName" type="text_ik"indexed="true" stored="true"/>
<field name="address" type="text_ik"indexed="true" stored="true"/>
<field name="keyword" type="text_ik"indexed="true" stored="true"multiValued="true"/>
<copyField source="hotelName"dest="keyword"/>
<copyField source="address"  dest="keyword"/>
  • 從新執行數據導入,並查詢,出現如下結果則多字段配置正確。
  • 關鍵詞搜索,查看查詢結果是否正確

SpringData Solr 使用

  • 按主鍵查詢
@Test	 
 	public void testFindOne(){ 
 	 	TbItem item = solrTemplate.getById(1, TbItem.class); 
 	 	System.out.println(item.getTitle()); 
 	}
  • 按主鍵刪除
@Test 
 	public void testDelete(){ 
 	 	solrTemplate.deleteById("1"); 
}
  • 分頁
@Test 
 	public void testAddList(){ 
 	 	List<TbItem> list=new ArrayList(); 
 	 	 
 	 	for(int i=0;i<100;i++){  	 	 	TbItem item=new TbItem(); 
 	 	 	item.setId(i+1L); 
 	 	 	item.setBrand("華爲"); 
 	 	 	item.setCategory("手機"); 
 	 	 	item.setGoodsId(1L); 
 	item.setSeller("華爲2號專賣店"); 
item.setTitle("華爲Mate"+i); 
item.setPrice(new BigDecimal(2000+i));  
list.add(item); 
 	 
 	 
 	 	}  
solr	Template.saveBeans(list); 
 	 
 	} 	solrTemplate.commit();
  • 條件查詢
@Test 
 	public void testPageQueryMutil(){  
 	 	Query query=new SimpleQuery("*:*"); 
 	 	Criteria criteria=new Criteria("item_title").contains("2"); 
 	 	criteria=criteria.and("item_title").contains("5");  	 
 	 	query.addCriteria(criteria); 
 	 	//query.setOffset(20);//開始索引(默認0) 
 	 	//query.setRows(20);//每頁記錄數(默認10) 
 	 	ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class); 
list
 	 	System.out.println("總記錄數:"+page.getTotalElements());  	 	List<TbItem> 	 = page.getContent(); 
list
 	 	showList(	); 
 	}
相關文章
相關標籤/搜索