1. 程式人生 > >搜尋解決方案-solr

搜尋解決方案-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中差不多。下次有機會再嘗試。