Spring Data Solr

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)solrexample/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;
    }
}
User類

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());
        }
    }
相關文章
相關標籤/搜索