搜尋解決方案-solr
一、Solr的安裝與配置
1.1 什麼是Solr
Solr是一個開源搜尋平臺,用於構建搜尋應用程式。它建立在Lucene(全文搜尋引擎)之上。Solr是企業級的,快速的和高度可擴充套件的。使用Solr構建的應用程式非常複雜,可提供高效能。
通過使用類似REST的HTTP API,確保了幾乎能使用任何程式語言來使用solr。
Solr可以和Hadoop一起使用。由於Hadoop處理大量資料,Solr幫助我們從這麼大的源中找到所需的資訊。不僅限於搜尋,Solr也可以用於儲存目的。像其他NoSQL資料庫一樣,它是一種分關係資料儲存和處理技術。
總是,Solr是一個可擴充套件的,可部署,搜尋/儲存引擎,優化搜尋大量以文字為中心的資料。
1.2 Solr安裝
- 安裝Tomcat,解壓縮就可以了
- 解壓solr
- 把solr下的dist目錄 solr-4.10.3.war 部署到Tomcat\webapps 下(去掉版本號)。
- 啟動Tomcat解壓縮war包
- 包solr下example/lib/ext目錄下的所有的jar包新增到solr的工程中(\WEB-INF\lib目錄下)。
- 建立一個solrhome。solr下的/example/solr目錄就是一個solrhome。複製此目錄到D盤改名為solrhome
- 關聯solr及solrhome。需要修改solr工程的web.xml檔案
1<env-entry> 2 <env-entry-name>solr/home</env-entry-name> 3 <env-entry-value>d:\solrhome</env-entry-value> 4 <env-entry-type>java.lang.String</env-entry-type> 5 </env-entry>
- 啟動Tomcat
訪問:http://localhost:8080/solr/
1.3 中文分析器IK Analyzer
1.IK Analyzer簡介
一個開源的,基於Java語言開發的輕量級的中文分詞工具包
2.IK Analyzer配置
步驟:
1、把IKAnalyzer2012FF_u1.jar新增到solr工程的lib目錄下
2、建立WEB-INF/classes 資料夾,把擴充套件詞典、停用詞詞典、配置檔案放到solr工程的WEB-INF/classes目錄下。
3、修改Solrhome的scheme.xml檔案,配置一個FieldType,使用IKAnalyzer
1 <fieldType name="text_ik" class="solr.TextField"> 2 <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> 3 </fieldType>
1.4 配置域
域相當於資料庫的表字段,使用者存放資料,因此使用者根據業務需要去定義相關的Field(域),一般來說,每一種域對應著一種資料,使用者對同一種資料進行相同的操作
域的常用屬性:
- name:指定域的名稱
- type:指定域的型別
- indexed:是否索引
- stored:是否儲存
- required:是否必須
- multiValue的:是否多值
1.域 -- field
修改solrhome的schema.xml檔案,設定業務系統Field -- 為下面的demo做鋪墊
1 <field name="item_goodsid" type="long" indexed="true" stored="true"/> 2 <field name="item_title" type="text_ik" indexed="true" stored="true"/> 3 <field name="item_price" type="double" indexed="true" stored="true"/> 4 <field name="item_image" type="string" indexed="false" stored="true" /> 5 <field name="item_category" type="string" indexed="true" stored="true" /> 6 <field name="item_seller" type="text_ik" indexed="true" stored="true" /> 7 <field name="item_brand" type="string" indexed="true" stored="true" />
2.複製域 -- copyFiled
1 <field name="item_keywords" type="text_ik" indexed="true" stored="false" 2 multiValued="true"/> 3 <copyField source="item_title" dest="item_keywords"/> 4 <copyField source="item_category" dest="item_keywords"/> 5 <copyField source="item_seller" dest="item_keywords"/> 6 <copyField source="item_brand" dest="item_keywords"/>
3.動態域 -- dynamicField
當我們需要動態擴充欄位時,就需要使用到動態域,假設搜尋物件為一個商品
1 <dynamicField name="spec*" type="string" indexed="true" stored="true" />
二、Spring Data Solr入門
2.1 Spring Data Solr簡介
Spring Data Solr是為了方便Solr的一個封裝,其底層是對SolrJ(官方API)的封裝。
2.2 Spring Data Solr入門小Demo
1.搭建工程
- pom.xml中引入依賴
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>com.pinyougou</groupId> 4 <artifactId>Spring-Data-Solr-Demo</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 7 <dependencies> 8 <!-- spring-data-solr --> 9 <dependency> 10 <groupId>org.springframework.data</groupId> 11 <artifactId>spring-data-solr</artifactId> 12 <version>1.5.5.RELEASE</version> 13 </dependency> 14 15 <!-- 測試用 --> 16 <dependency> 17 <groupId>org.springframework</groupId> 18 <artifactId>spring-test</artifactId> 19 <version>4.2.4.RELEASE</version> 20 </dependency> 21 <dependency> 22 <groupId>junit</groupId> 23 <artifactId>junit</artifactId> 24 <version>4.9</version> 25 </dependency> 26 </dependencies> 27 </project>
- 建立applicationContext-solr.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:solr="http://www.springframework.org/schema/data/solr" 7 xsi:schemaLocation="http://www.springframework.org/schema/data/solr 8 http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd 9 http://www.springframework.org/schema/beans 10 http://www.springframework.org/schema/beans/spring-beans.xsd 11 http://www.springframework.org/schema/context 12 http://www.springframework.org/schema/context/spring-context.xsd"> 13 14 <!-- solr 伺服器地址 --> 15 <solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" /> 16 17 <!-- solr 模板,使用 solr 模板可對索引庫進行 CRUD 的操作 --> 18 <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate"> 19 <constructor-arg ref="solrServer" /> 20 </bean> 21 </beans>
2.建立搜尋對應的商品類
1 public class TbItem implements Serializable { 2 3 @Field 4 private Long id; 5 6 @Field("item_title") 7 private String title; 8 9 @Field("item_price") 10 private BigDecimal price; 11 12 @Field("item_image") 13 private String image; 14 15 @Field("item_goodsid") 16 private Long goodsId; 17 18 @Field("item_category") 19 private String category; 20 21 @Field("item_brand") 22 private String brand; 23 24 @Field("item_seller") 25 private String seller; 26 27 // 省略getter和setter方法 28 }
3.solrTemplate中的常用方法
1 @RunWith(SpringJUnit4ClassRunner.class) 2 @ContextConfiguration(locations = "classpath:applicationContext-solr.xml") 3 public class SolrTest { 4 5 @Autowired 6 private SolrTemplate solrTemplate; 7 8 /** 9 * 測試新增 10 */ 11 @Test 12 public void testAdd() { 13 TbItem item = new TbItem(); 14 item.setId(1L); 15 item.setBrand("華為"); 16 item.setCategory("手機"); 17 item.setGoodsId(1L); 18 item.setSeller("華為1號專賣店"); 19 item.setTitle("華為Mate9"); 20 item.setPrice(new BigDecimal(2000)); 21 22 solrTemplate.saveBean(item); 23 solrTemplate.commit(); 24 } 25 26 /** 27 * 測試根據主鍵查詢一個 28 */ 29 @Test 30 public void testFindOne() { 31 TbItem item = solrTemplate.getById(1, TbItem.class); 32 System.out.println(item.getTitle()); 33 } 34 35 /** 36 * 測試根據主鍵刪除 37 */ 38 @Test 39 public void testDele() { 40 for (int i = 2; i <= 100; i++) { 41 solrTemplate.deleteById("" + i + ""); 42 solrTemplate.commit(); 43 } 44 45 } 46 47 /** 48 * 測試新增一個集合 49 */ 50 @Test 51 public void testAddList() { 52 ArrayList<TbItem> list = new ArrayList<TbItem>(); 53 54 for (int i = 0; i < 100; i++) { 55 TbItem item = new TbItem(); 56 item.setId(i + 1L); 57 item.setBrand("華為"); 58 item.setCategory("手機"); 59 item.setGoodsId(1L); 60 item.setSeller("華為 2 號專賣店"); 61 item.setTitle("華為 Mate" + i); 62 item.setPrice(new BigDecimal(2000 + i)); 63 list.add(item); 64 } 65 66 solrTemplate.saveBeans(list); 67 solrTemplate.commit(); 68 69 } 70 71 /** 72 * 測試分頁查詢 73 */ 74 public void testPageQuery() { 75 Query query = new SimpleQuery("*:*"); 76 query.setOffset(20);// 開始索引 77 query.setRows(20);// 每頁記錄數 78 ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class); 79 List<TbItem> list = page.getContent(); 80 for (TbItem item : list) { 81 System.out.println(item.getTitle()); 82 } 83 84 } 85 86 /** 87 * 測試條件查詢 88 */ 89 public void testPageQueryMutil() { 90 Query query = new SimpleQuery("*:*"); 91 Criteria criteria = new Criteria("item_title").contains("2"); 92 criteria = criteria.and("item_title").contains("5"); 93 query.addCriteria(criteria); 94 ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class); 95 System.out.println("總記錄數:" + page.getTotalElements()); 96 List<TbItem> list = page.getContent(); 97 for (TbItem item : list) { 98 System.out.println(item.getTitle()); 99 } 100 } 101 102 /** 103 * 測試刪除所有 104 */ 105 public void testDeleAll() { 106 Query query = new SimpleQuery("*:*"); 107 solrTemplate.delete(query); 108 solrTemplate.commit(); 109 } 110 }
這裡就不一一展示了,有興趣的執行一下,有想用SpringBoot做一下,但是SpringBoot中的solrTemplate的方法和上面的有點不一樣,有看到是使用一個SolrClient的方法和上面使用的solrTemplate中差不多。下次有機會再嘗試。