全文檢索工具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中引入依賴
- <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下創(chuàng)建 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服務(wù)器地址 -->
-
- <solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" />
-
- <!-- solr模板,使用solr模板可對(duì)索引庫(kù)進(jìn)行CRUD的操作 -->
-
- <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
-
- <constructor-arg ref="solrServer" />
-
- </bean>
-
- </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