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
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>
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>
?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 的名字。
<?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
刪除多餘的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"/>
# 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
<listener> <listener-class> org.apache.solr.handler.dataimport.scheduler.ApplicationListener </listener-class> </listener>
<?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
<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"
<field name="hotelName" type="text_ik"indexed="true" stored="true"/> <field name="address" type="text_ik"indexed="true" stored="true"/>
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"/>
@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( ); }