全文檢索工具solr:第一章:理論知識(shí)

什么是Solr

大多數(shù)搜索引擎應(yīng)用都必須具有某種搜索功能,問(wèn)題是搜索功能往往是巨大的資源消耗并且它們由于沉重的數(shù)據(jù)庫(kù)加載而拖垮你的應(yīng)用的性能。

這就是為什么轉(zhuǎn)移負(fù)載到一個(gè)外部的搜索服務(wù)器是一個(gè)不錯(cuò)的主意,Apache Solr是一個(gè)流行的開(kāi)源搜索服務(wù)器,它通過(guò)使用類似REST的HTTP API,這就確保你能從幾乎任何編程語(yǔ)言來(lái)使用solr。

Solr是一個(gè)開(kāi)源搜索平臺(tái),用于構(gòu)建搜索應(yīng)用程序。 它建立在Lucene(全文搜索引擎)之上。 Solr是企業(yè)級(jí)的,快速的和高度可擴(kuò)展的。 使用Solr構(gòu)建的應(yīng)用程序非常復(fù)雜,可提供高性能。

為了在CNET網(wǎng)絡(luò)的公司網(wǎng)站上添加搜索功能,Yonik Seely于2004年創(chuàng)建了Solr。并在2006年1月,它成為Apache軟件基金會(huì)下的一個(gè)開(kāi)源項(xiàng)目。并于2016年發(fā)布最新版本Solr 6.0,支持并行SQL查詢的執(zhí)行。

Solr可以和Hadoop一起使用。由于Hadoop處理大量數(shù)據(jù),Solr幫助我們從這么大的源中找到所需的信息。不僅限于搜索,Solr也可以用于存儲(chǔ)目的。像其他NoSQL數(shù)據(jù)庫(kù)一樣,它是一種非關(guān)系數(shù)據(jù)存儲(chǔ)和處理技術(shù)。

總之,Solr是一個(gè)可擴(kuò)展的,可部署,搜索/存儲(chǔ)引擎,優(yōu)化搜索大量以文本為中心的數(shù)據(jù)。

 
什么是中文分析器IK Analyzer

IK Analyzer 是一個(gè)開(kāi)源的,基亍 java 語(yǔ)言開(kāi)發(fā)的輕量級(jí)的中文分詞工具包。從 2006年 12 月推出 1.0 版開(kāi)始, IKAnalyzer 已經(jīng)推出了 4 個(gè)大版本。最初,它是以開(kāi)源項(xiàng)目Luence 為應(yīng)用主體的,結(jié)合詞典分詞和文法分析算法的中文分詞組件。從 3.0 版本開(kāi)始,IK 發(fā)展為面向 Java 的公用分詞組件,獨(dú)立亍 Lucene 項(xiàng)目,同時(shí)提供了對(duì) Lucene 的默認(rèn)優(yōu)化實(shí)現(xiàn)。在 2012 版本中,IK 實(shí)現(xiàn)了簡(jiǎn)單的分詞歧義排除算法,標(biāo)志著 IK 分詞器從單純的詞典分詞向模擬語(yǔ)義分詞衍化。

 
什么是Spring Data Solr

雖然支持任何編程語(yǔ)言的能力具有很大的市場(chǎng)價(jià)值,你可能感興趣的問(wèn)題是:我如何將Solr的應(yīng)用集成到Spring中?可以,Spring Data Solr就是為了方便Solr的開(kāi)發(fā)所研制的一個(gè)框架,其底層是對(duì)SolrJ(官方API)的封裝。

 
搭建工程

    創(chuàng)建maven工程,pom.xml中引入依賴

      

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.data</groupId>
  4. <artifactId>spring-data-solr</artifactId>
  5. <version>1.5.5.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework</groupId>
  9. <artifactId>spring-test</artifactId>
  10. <version>4.2.4.RELEASE</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>junit</groupId>
  14. <artifactId>junit</artifactId>
  15. <version>4.9</version>
  16. </dependency>
  17. </dependencies>

(2)在src/main/resources下創(chuàng)建  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" xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:solr="http://www.springframework.org/schema/data/solr"
  6. xsi:schemaLocation="http://www.springframework.org/schema/data/solr
  7. http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context.xsd">
  12. <!-- solr服務(wù)器地址 -->
  13. <solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" />
  14. <!-- solr模板,使用solr模板可對(duì)索引庫(kù)進(jìn)行CRUD的操作 -->
  15. <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
  16. <constructor-arg ref="solrServer" />
  17. </bean>
  18. </beans>

@Field 注解

屬性使用@Field(“域名”)注解標(biāo)識(shí) 。   如果屬性與配置文件定義的域名稱不一致,需要在注解中指定域名稱。

    public class SkuInfo implements Serializable{
        String id;
        String spuId;
        @Field("sku_price")
        BigDecimal price;
        @Field("sku_name")
        String skuName;
        BigDecimal weight;
        @Field("sku_desc")
        String skuDesc;
        String catalog3Id;
        @Field("sku_default_img")
        String skuDefaultImg;
    .......
    }

增加(修改)

對(duì)于修改:如果id存在就認(rèn)為是修改,若不存在,就認(rèn)為是新增

創(chuàng)建測(cè)試類TestTemplate.java

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations="classpath:applicationContext-solr.xml")
    public class TestTemplate {
     
        @Autowired
        private SolrTemplate solrTemplate;
        
        @Test
        public void testAdd(){
            SkuInfo skuInfo = new SkuInfo();
            skuInfo.setId("1");
            skuInfo.setSkuName("華為");
            skuInfo.setPrice(new BigDecimal(3000.01));
            skuInfo.setCatalog3Id("2");
            skuInfo.setSkuDefaultImg("www.baidu,com");
            skuInfo.setSkuDesc("非常好");
            skuInfo.setSpuId("3");        
        solrTemplate.saveBean(skuInfo);
            solrTemplate.commit();
        }
    }

按主鍵查詢

@Test

public void testFindOne(){

   SkuInfo sku =  template.getById("1",SkuInfo.class);

        System.out.printf(sku.getSkuName());

}
按主鍵刪除

@Test

public void testDelete(){

solrTemplate.deleteById("1");

solrTemplate.commit();

}
分頁(yè)查詢

首先循環(huán)插入100條測(cè)試數(shù)據(jù)

@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("手機(jī)");

item.setGoodsId(1L);

item.setSeller("華為2號(hào)專賣店");

item.setTitle("華為Mate"+i);

item.setPrice(new BigDecimal(2000+i));

list.add(item);

}

solrTemplate.saveBeans(list);

solrTemplate.commit();

}

編寫分頁(yè)查詢測(cè)試代碼:

@Test

public void testPageQuery(){

Query query=new SimpleQuery("*:*");

query.setOffset(20);//開(kāi)始索引(默認(rèn)0)

query.setRows(20);//每頁(yè)記錄數(shù)(默認(rèn)10)

ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);

System.out.println("總記錄數(shù):"+page.getTotalElements());

List<TbItem> list = page.getContent();

showList(list);

}

//顯示記錄數(shù)據(jù)

private void showList(List<TbItem> list){

for(TbItem item:list){

System.out.println(item.getTitle() +item.getPrice());

}

}
條件查詢

 Criteria 用于對(duì)條件的封裝:

@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);//開(kāi)始索引(默認(rèn)0)

//query.setRows(20);//每頁(yè)記錄數(shù)(默認(rèn)10)

ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);

System.out.println("總記錄數(shù):"+page.getTotalElements());

List<TbItem> list = page.getContent();

showList(list);

}

 
刪除全部數(shù)據(jù)

@Test

public void testDeleteAll(){

Query query=new SimpleQuery("*:*");

solrTemplate.delete(query);

solrTemplate.commit();

}

項(xiàng)目:solrTest