什么是Solr
大多数搜索引擎应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗,并且它们会由于沉重的数据库加载而拖垮你的应用的性能。
这就是为什么转移负载到一个外部的搜索服务器的主要原因,Apache Solr是一个流行的开源搜索服务器,它通过使用类似REST的HTTP API,确保你能从几乎任何编程语言来使用solr。Solr是一个开源搜索平台,用于构建搜索应用程序。 它建立在Lucene(全文搜索引擎)之上。Solr是企业级的,快速的,高度可扩展的
总之,Solr是一个可扩展的,可部署,搜索/存储引擎,优化搜索大量以文本为中心的数据,我们常用这中搜索引擎来实现我们的工作,而不是在数据库中来实现我们的搜索功能,能够加快我们的工作效率等
中文分析器IK Analyzer
IK Analyzer简介
IK Analyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。从 3.0 版本开始,IK 发展为面向 Java 的公用分词组件,独立 Lucene 项目,同时提供了对 Lucene 的默认优化实现。在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化
IK Analyzer配置
上传文件到相对对应的solar路径,并填写其相对于的数据到对应的schema.xml文件,即是配置ik分词器到对应的搜索引擎中
Spring Data Solr入门
Spring Data Solr简介
经过上面的安装和配置大家应该已经知道如何配置Solr,那么就会思考一个问题了:这个solr项目和我们实际的项目查询有什么关系呢?是怎么结合的呢?
solr官方提供了solrj API,就是一个jar文件,我们可以通过solr官方提供的接口来实现本地项目和solr项目的交互;而这里我们要介绍的是Spring Data Solr,它是Spring Data家族对solrj进行封装后的框架。
创建项目并导入相关的pom文件中依赖
<dependencies>
<!--显然是solr各层的相关的数据的整合 桌面的各层的业务的逻辑的体现-->
<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.12</version>
</dependency>
</dependencies>
配置相关的solr的配置文件
<!-- solr服务器地址 可以查询其相对应的其服务器地址-->
<solr:solr-server id="solrServer" url="http://192.168.220.130:8080/solr/collection1"/>
<!-- solr模板,使用solr模板可对索引库进行CRUD操作 -->
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<!--构造方法,将其服务的地址给传递出来,可以在工程中直接引用-->
<constructor-arg ref="solrServer"/>
</bean>
配置其相关的实体类(表实合一)
package com.offcn;
import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.solr.core.mapping.Dynamic;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
public class TbItem implements Serializable {
@Field
private Long id;
@Field("item_title")
private String title;
private String sellPoint;
@Field("item_price")
private BigDecimal price;
private Integer stockCount;
private Integer num;
private String barcode;
@Field("item_image")
private String image;
private Long categoryid;
private String status;
private Date createTime;
@Field("item_updatetime")
private Date updateTime;
private String itemSn;
private BigDecimal costPirce;
private BigDecimal marketPrice;
private String isDefault;
@Field("item_goodsid")
private Long goodsId;
private String sellerId;
private String cartThumbnail;
@Field("item_category")
private String category;
@Field("item_brand")
private String brand;
private String spec;
@Field("item_seller")
private String seller;
@Dynamic
@Field("item_spec_*")
private Map<String,String> specMap;
public Map<String, String> getSpecMap() {
return specMap;
}
public void setSpecMap(Map<String, String> specMap) {
this.specMap = specMap;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSellPoint() {
return sellPoint;
}
public void setSellPoint(String sellPoint) {
this.sellPoint = sellPoint;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Integer getStockCount() {
return stockCount;
}
public void setStockCount(Integer stockCount) {
this.stockCount = stockCount;
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public String getBarcode() {
return barcode;
}
public void setBarcode(String barcode) {
this.barcode = barcode;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public Long getCategoryid() {
return categoryid;
}
public void setCategoryid(Long categoryid) {
this.categoryid = categoryid;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public String getItemSn() {
return itemSn;
}
public void setItemSn(String itemSn) {
this.itemSn = itemSn;
}
public BigDecimal getCostPirce() {
return costPirce;
}
public void setCostPirce(BigDecimal costPirce) {
this.costPirce = costPirce;
}
public BigDecimal getMarketPrice() {
return marketPrice;
}
public void setMarketPrice(BigDecimal marketPrice) {
this.marketPrice = marketPrice;
}
public String getIsDefault() {
return isDefault;
}
public void setIsDefault(String isDefault) {
this.isDefault = isDefault;
}
public Long getGoodsId() {
return goodsId;
}
public void setGoodsId(Long goodsId) {
this.goodsId = goodsId;
}
public String getSellerId() {
return sellerId;
}
public void setSellerId(String sellerId) {
this.sellerId = sellerId;
}
public String getCartThumbnail() {
return cartThumbnail;
}
public void setCartThumbnail(String cartThumbnail) {
this.cartThumbnail = cartThumbnail;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getSpec() {
return spec;
}
public void setSpec(String spec) {
this.spec = spec;
}
public String getSeller() {
return seller;
}
public void setSeller(String seller) {
this.seller = seller;
}
@Override
public String toString() {
return "TbItem{" +
"id=" + id +
", title='" + title + '\'' +
", sellPoint='" + sellPoint + '\'' +
", price=" + price +
", stockCount=" + stockCount +
", num=" + num +
", barcode='" + barcode + '\'' +
", image='" + image + '\'' +
", categoryid=" + categoryid +
", status='" + status + '\'' +
", createTime=" + createTime +
", updateTime=" + updateTime +
", itemSn='" + itemSn + '\'' +
", costPirce=" + costPirce +
", marketPrice=" + marketPrice +
", isDefault='" + isDefault + '\'' +
", goodsId=" + goodsId +
", sellerId='" + sellerId + '\'' +
", cartThumbnail='" + cartThumbnail + '\'' +
", category='" + category + '\'' +
", brand='" + brand + '\'' +
", spec='" + spec + '\'' +
", seller='" + seller + '\'' +
", specMap=" + specMap +
'}';
}
}
建立相关的测试类
package com.offcn;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
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;
/**
* @author liugang
* @version 1.0
* @date 2019/11/28
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring_solr.xml")
public class SolrDemo1 {
@Autowired
SolrTemplate solrTemplate;
@Test
public void addSourceToSolr(){
TbItem item = new TbItem();
item.setId(3L);
item.setBrand("蛤蛤");
item.setCategory("手机pluse");
item.setGoodsId(1L);
item.setSeller("小米1号专卖店");
item.setTitle("红米Mate9");
item.setPrice(new BigDecimal(2200));
solrTemplate.saveBean(item);
solrTemplate.commit();
}
@Test
public void queryId(){
TbItem byId = solrTemplate.getById(856645, TbItem.class);
System.out.println(byId);
}
@Test
public void createListDataBeat(){
ArrayList<TbItem> tbItems = new ArrayList<>();
for (int i = 0; i < 200; i++) {
TbItem item = new TbItem();
item.setId(Long.valueOf(i));
item.setBrand("摩托多拉");
item.setCategory("手机");
item.setGoodsId(1L);
item.setSeller("摩托多拉"+i+"号专卖店");
item.setTitle("摩托多拉"+i);
item.setPrice(new BigDecimal(2000+i));
tbItems.add(item);
}
solrTemplate.saveBeans(tbItems);
solrTemplate.commit();
}
@Test
public void pageQuery(){
SimpleQuery simpleQuery = new SimpleQuery("*:*");
simpleQuery.setOffset(10);
simpleQuery.setRows(5);
ScoredPage<TbItem> tbItems = solrTemplate.queryForPage(simpleQuery, TbItem.class);
//获取数据在库总量
System.out.println(tbItems.getTotalElements());
//设置我们设置的中参数,判断一共多少页
System.out.println(tbItems.getTotalPages());
for (TbItem tbItem : tbItems) {
System.out.println(tbItem);
}
}
/**
* 模糊查询
*/
@Test
public void searyQueryData(){
SimpleQuery simpleQuery = new SimpleQuery("*:*");
Criteria criteria = new Criteria("item_title").contains("2");
criteria = criteria.and("item_price").greaterThan(2020);
simpleQuery.addCriteria(criteria);
simpleQuery.addSort(new Sort(Sort.Direction.DESC, "item_price"));
simpleQuery.setOffset(10);
simpleQuery.setRows(10);
ScoredPage<TbItem> tbItems = solrTemplate.queryForPage(simpleQuery, TbItem.class);
System.out.println(tbItems.getTotalElements());
System.out.println(tbItems.getTotalPages());
for (TbItem tbItem : tbItems) {
System.out.println(tbItem.toString());
}
}
/**
* 第一,solr引擎中需要存在样本数据
* 第二,根据solrTempate的相关api进行操作
*/
}