1.什麼是spring data solr?java
Solr是一個開源搜索平臺,用於構建搜索應用程序。簡單的來講就是做爲一個搜索引擎使用。web
2.solr的安裝(本地安裝,遠程安裝同)spring
1)解壓一個tomcat,用於運行solr項目數據庫
2)下載一個solr,而後解壓瀏覽器
3)把 solr 下的dist目錄中solr的war文件部署到tomcat\webapps下,把war的名字改成solrtomcat
4)啓動tomcat,把war解壓服務器
5)把solr下example/lib/ext 目錄下的全部的 jar 包複製到 solr 的工程WEB-INF/lib中app
6)建立一個 solrhome。把solr 下的/example/solr 目錄到D盤更名爲solrhome webapp
7)須要修改 solr 工程的 web.xml maven
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>d:\solrhome</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
8)啓動 Tomcat,在瀏覽器輸入http://localhost:8080/solr,看到以下頁面說明solr已安裝成功
9)選擇倉庫,進行查詢
3.中文分析器IK Analyzer
IK Analyzer 是一個開源的,基於java 語言開發的輕量級的中文分詞工具。
IK Analyzer配置:
1)把IKAnalyzer2012FF_u1.jar 添加到 solr 工程的 lib 目錄下
2)建立WEB-INF/classes文件夾,把擴展詞典mydict.dic、停用詞詞典ext_stopword.dic、配置文件IKAnalyzer.cfg.xml放到 solr 工程的WEB-INF/classes 目錄下。
3)修改 solrhome\collection1\conf\schema.xml 文件,在文件的尾部配置一個 FieldType。
<fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>
4.域
域至關於數據庫的表字段。
域的經常使用屬性:
name:指定域的名稱 type:指定域的類型 indexed:是否索引,當須要根據此字段查詢時爲true stored:是否存儲,設置存儲後才能查詢此字段 required:是否必須 multiValued:是否多值
1)字段域
將實體類中要保存到solr索引庫的屬性進行映射配置,與索引庫的字段進行一一對應
<field name="item_id" type="int" indexed="true" stored="true"/>
2)複製域
複製域的做用在於將某一個Field中的數據複製到另外一個域中,進行匹配查詢
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/> <copyField source="item_name" dest="item_keywords"/>
3)動態域
須要動態擴充字段時,要使用動態域
<dynamicField name="item_spec_*" type="string" indexed="true" stored="true" />
5.spring data solr入門
1)建立maven工程,名爲springdata-solr,在pom.xml中引入依賴
<dependencies> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-solr</artifactId> <version>1.5.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> </dependency> </dependencies>
2)在src/main/resources下建立spring目錄,目錄下新建applicationContext-solr.xml文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:solr="http://www.springframework.org/schema/data/solr" xsi:schemaLocation="http://www.springframework.org/schema/data/solr http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- solr服務器地址 --> <solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" /> <!-- solr模板,使用solr模板可對索引庫進行CRUD的操做 --> <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate"> <constructor-arg ref="solrServer" /> </bean> </beans>
3)建立類User並建立對應的數據庫,填充一些信息
package com.entity; public class MyUser { private int id; private String name; private String password; private String phone; private String url; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }
4)配置@Field 註解
若是實體屬性與配置文件定義的域名稱不一致,須要在註解中指定域名稱
//@Field()裏面的字段須要和solrhome的schema.xml 中域的name相同 @Fieldprivate int id; @Field("item_name") private String name; @Field("item_password") private String password; @Field("item_phone") private String phone; @Field("item_url") private String url;
5)在solrhome\collection1\conf\schema.xm配置文件中添加字段,添加後重啓tomcat服務器
<field name="item_name" type="text_ik" indexed="true" stored="true"/> <field name="item_password" type="string" indexed="true" stored="true"/>
<field name="item_phone" type="string" indexed="false" stored="true" /> <field name="item_url" type="string" indexed="false" stored="true" /> <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/> <copyField source="item_name" dest="item_keywords"/> <copyField source="item_password" dest="item_keywords"/> <copyField source="item_phone" dest="item_keywords"/> <copyField source="item_url" dest="item_keywords"/>
6)建立測試類SolrTest
package com.test; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.solr.core.SolrTemplate; import org.springframework.data.solr.core.query.Criteria; import org.springframework.data.solr.core.query.Query; import org.springframework.data.solr.core.query.SimpleQuery; import org.springframework.data.solr.core.query.result.ScoredPage; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/applicationContext-solr.xml") public class SolrTest { @Autowired private SolrTemplate solrTemplate; //在此寫操做,這些操做只是對solr的倉庫的 }
7)添加操做(在測試類中編寫,下同)
@Test public void add(){ //把數據添加到solr中 MyUser myUser=new MyUser(); myUser.setId(1); myUser.setName("測試名"); myUser.setPassword("1234"); myUser.setUrl("baidu.com"); solrTemplate.saveBean(myUser); solrTemplate.commit(); }
當執行後,在頁面進行查詢,會看到數據已經添加到solr倉庫中了
8)按主鍵查詢
@Test public void findById(){ //按主鍵查詢 MyUser id = solrTemplate.getById(1, MyUser.class); System.out.println(id);//會把對應id的信息查詢出來 }
9)按主鍵刪除
@Test public void deleteById(){ //按主鍵刪除 solrTemplate.deleteById("1"); solrTemplate.commit(); }
10)刪除所有
@Test public void deleteAll(){ //刪除所有 Query query=new SimpleQuery("*:*"); solrTemplate.delete(query); solrTemplate.commit(); }
11)批量導入數據
//批量導入數據 @Test public void addList(){ List<MyUser> list=new ArrayList<MyUser>(); for (int i = 0; i < 100; i++) { MyUser myUser=new MyUser(); myUser.setId(1+i); myUser.setName("測試名"+i); myUser.setPassword("1234"+i); myUser.setUrl("baidu.com"+i); list.add(myUser); } //saveBeans添加list集合 solrTemplate.saveBeans(list); solrTemplate.commit(); }
12)分頁查詢
@Test public void findPage(){ //分頁查詢 Query query=new SimpleQuery("*:*"); //設置起始索引 query.setOffset(10); //設置每頁顯示的條數 query.setRows(20); ScoredPage<MyUser> pages = solrTemplate.queryForPage(query, MyUser.class); //獲取總記錄數 System.out.println("總記錄數:"+pages.getTotalElements()); //獲取總頁數 System.out.println("總頁數:"+pages.getTotalPages()); //獲取分頁數據 List<MyUser> list = pages.getContent(); for (MyUser item : list) { System.out.println(item.getName()+" "+item.getUrl()); } }
13)有條件分頁查詢
@Test public void findPageMutil(){ //有條件分頁查詢 Query query=new SimpleQuery("*:*"); Criteria criteria=new Criteria("item_keywords"); //contains包含(參數不可拆分),is是相等(參數可拆分) criteria.is("試名"); query.addCriteria(criteria); //設置起始索引 query.setOffset(10); //設置每頁顯示的條數 query.setRows(20); ScoredPage<MyUser> pages = solrTemplate.queryForPage(query, MyUser.class); //獲取總記錄數 System.out.println("總記錄數:"+pages.getTotalElements()); //獲取總頁數 System.out.println("總頁數:"+pages.getTotalPages()); //獲取分頁數據 List<MyUser> list = pages.getContent(); for (MyUser item : list) { System.out.println(item.getName()+" "+item.getUrl()); } }