solr的安装
01环境准备
环境要求
- VMware Linux CentOS-6.5。
- JDK 1.7.0_07
- Tomcat-7.0.52。
02开始安装
第一步:目录准备,在usr/local/目录下创建solr目录。
并将apache-tomcat-7.0.52.tar.gz上传至Linux,安装tomcat到此目录下(上传工具可以使用FileZilla Client)。
第二步:把solr-4.10.3的压缩包上传到Linux系统。并解压得到solr-4.10.3文件夹。(我安装的是solr-4.10.3。)
第二步:将/usr/local/src/solr-4.10.3/dist目录下的solr-4.10.3.war包复制到tomcat(我tomcat安装路径为/usr/local/tomcat7)的wepapp下面改名为solr.war,并启动tomcat解压solr.war。
第三步:删除solr.war包,注意一定要先关闭tomcat再删除solr.war包,否则解压后的solr工程文件夹也会被删除。
第四步:添加solr工程依赖的jar包。将/usr/local/src/solr-4.10.3/example/lib/ext下面的所有jar包都复制到solr工程WEB-INF/lib下面。
第五步:添加solrhome:将/usr/local/src/solr-4.10.3/example下面的solr目录,复制到/usr/local/solr/下面,并改名为solrhome。
第六步:修改solr工程的配置web.xml文件。将web.xml中的 env-entry 标签中的env-entry-value路径改为/usr/local/solr/solrhome,注意要去掉 env-entry 标签的注释
第七步:启动Tomcat,在浏览器中输入http://192.168.25.200:8080/solr。访问solr页面。出现下面页面代表安装成功。
SpringDataSolr的使用
IK Analyzer
IK Analyzer 是一个开源的,基亍 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。从 3.0 版本开始,IK 发展为面向 Java 的公用分词组件,独立亍 Lucene 项目,同时提供了对 Lucene 的默认优化实现。在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化。
配置IK Analyzer
- 1、把IKAnalyzer2012FF_u1.jar 添加到 solr 工程的 lib 目录下
- 2、创建WEB-INF/classes文件夹 把扩展词典、停用词词典、配置文件放到 solr 工程的 WEB-INF/classes 目录下。
- 3、修改 Solrhome 的 schema.xml 文件,配置一个 FieldType,使用 IKAnalyzer
配置域
域相当于数据库的表字段,用户存放数据,因此用户根据业务需要去定义相关的Field(域),一般来说,每一种对应着一种数据,用户对同一种数据进行相同的操作。
域的常用属性:
- name:指定域的名称
- type:指定域的类型
- indexed:是否索引
- stored:是否存储
- required:是否必须
- multiValued:是否多值
修改solrhome的schema.xml 文件 设置业务系统 Field
复制域
复制域的作用在于将某一个Field中的数据复制到另一个域中,扩大搜索范围。
动态域
当我们需要动态扩充字段时,我们需要使用动态域。对于品优购,规格的值是不确定的,所以我们需要使用动态域来实现。需要实现的效果如下:
搭建工程
引入依赖
org.springframework.data
spring-data-solr
1.5.5.RELEASE
org.springframework
spring-test
4.2.4.RELEASE
junit
junit
4.9
配置文件
在src/main/resources下创建 applicationContext-solr.xml
编写代码
创建pojo
package com.cehae.pojo;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import org.apache.solr.client.solrj.beans.Field;
public class Item 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;
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;
@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 + "]";
}
private static final long serialVersionUID = 1L;
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 == null ? null : title.trim();
}
public String getSellPoint() {
return sellPoint;
}
public void setSellPoint(String sellPoint) {
this.sellPoint = sellPoint == null ? null : sellPoint.trim();
}
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 == null ? null : barcode.trim();
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image == null ? null : image.trim();
}
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 == null ? null : status.trim();
}
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 == null ? null : itemSn.trim();
}
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 == null ? null : isDefault.trim();
}
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 == null ? null : sellerId.trim();
}
public String getCartThumbnail() {
return cartThumbnail;
}
public void setCartThumbnail(String cartThumbnail) {
this.cartThumbnail = cartThumbnail == null ? null : cartThumbnail.trim();
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category == null ? null : category.trim();
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand == null ? null : brand.trim();
}
public String getSpec() {
return spec;
}
public void setSpec(String spec) {
this.spec = spec == null ? null : spec.trim();
}
public String getSeller() {
return seller;
}
public void setSeller(String seller) {
this.seller = seller == null ? null : seller.trim();
}
}
创建测试类TestTemplate.java开始测试
package com.cehae.test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
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 com.cehae.pojo.Item;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext-solr.xml")
public class TestTemplate {
@Autowired
private SolrTemplate solrTemplate;
/**
* 添加数据
*/
@Test
public void testAdd() {
// 创建商品
Item item = new Item();
// 设置域的数据
item.setId(1L);// 注意是必填域
item.setBrand("苹果");
item.setCategory("手机");
item.setGoodsId(1L);
item.setSeller("苹果手机直营店");
item.setTitle("苹果X");
item.setPrice(new BigDecimal(8888));
// 保存数据
solrTemplate.saveBean(item);
// 提交
solrTemplate.commit();
}
/**
* 根据主键查询
*/
@Test
public void testFindById() {
Item item = solrTemplate.getById(1L, Item.class);
System.out.println("item = " + item);
}
/**
* 根据主键删除
*/
@Test
public void deleteById() {
solrTemplate.deleteById("1");
// 提交
solrTemplate.commit();
}
/**
* 根据主键批量删除
*/
@Test
public void deleteByIds() {
List list = new ArrayList();
for (int i = 0; i <= 100; i++) {
list.add(i + "");
}
solrTemplate.deleteById(list);
// 提交
solrTemplate.commit();
}
/**
* 批量保存
*/
@Test
public void testAddList() {
List- list = new ArrayList();
for (int i = 0; i < 100; i++) {
Item item = new Item();
item.setId(i + 1L);
item.setBrand("苹果" + i);
item.setCategory("手机");
item.setGoodsId(1L);
item.setSeller("苹果官方直营店");
item.setTitle("苹果X" + i);
item.setPrice(new BigDecimal(2000 + i));
list.add(item);
}
solrTemplate.saveBeans(list);
solrTemplate.commit();
}
/**
* 分页查询
*/
@Test
public void testPageQuery() {
// 查询表达式
Query query = new SimpleQuery("*:*");
// 设置开始索引
query.setOffset(20);
// 每页大小
query.setRows(10);
// 查询分页结果
ScoredPage
- items = solrTemplate.queryForPage(query, Item.class);
for (Item item : items) {
System.out.println("item = " + item);
}
// ScoredPage扩展属性
System.out.println("总记录数 = " + items.getTotalElements());
System.out.println("总页数 = " + items.getTotalPages());
System.out.println("每页大小 = " + items.getSize());
}
/**
* 条件查询
*/
@Test
public void testPageQueryMulti() {
// 查询表达式
Query query = new SimpleQuery("*:*");
// 添加条件:指定域和条件的值 contains:包含,is:匹配
// Criteria criteria = new Criteria("item_category").is("手机");
Criteria criteria = new Criteria("item_category").contains("手机");
// 追加条件
criteria = criteria.and("item_brand").contains("2");
query.addCriteria(criteria);
// 设置开始索引
// query.setOffset(20);
// 每页大小
// query.setRows(10);
// 查询分页结果
ScoredPage
- items = solrTemplate.queryForPage(query, Item.class);
for (Item item : items) {
System.out.println("item = " + item);
}
// ScoredPage扩展属性
System.out.println("总记录数 = " + items.getTotalElements());
System.out.println("总页数 = " + items.getTotalPages());
System.out.println("每页大小 = " + items.getSize());
}
/**
* 删除所有
*/
@Test
public void testDeletAll() {
// 设置删除条件
Query query = new SimpleQuery("*:*");
solrTemplate.delete(query);
solrTemplate.commit();
}
}
测试结果:
源码下载
GitHub