使用SolrJ管理索引库
一、SolrJ介绍
solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:
依赖的jar包 solr-4.10.3\dist\
二、SolrJ与Java项目整合
2.1 导入相应的jar包
导入SolrJ需要的jar包
还需要导入solr-4.10.3\example\lib\ext
2.3 删除索引操作
步骤:
1、创建与Solr连接,获取SolrServer对象
2、创建文档对象 SolrInputDocument
3、文档对象中添加相应的域
4、将文档对象添加到索引库
5、提交
示例代码
//向索引库中添加索引
@Test
public void addDocument() throws Exception {
//和solr服务器创建连接
//参数:solr服务器的地址
SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
//创建一个文档对象
SolrInputDocument document = new SolrInputDocument();
//向文档中添加域
//第一个参数:域的名称,域的名称必须是在schema.xml中定义的
//第二个参数:域的值
document.addField("id", "c0001");
document.addField("title_ik", "使用solrJ添加的文档");
document.addField("content_ik", "文档的内容");
document.addField("product_name", "商品名称");
//把document对象添加到索引库中
solrServer.add(document);
//提交修改
solrServer.commit();
}
2.3 根据id删除索引操作
步骤:
1、与Solr连接获取SolrServer对象
2、根据id进行删除、
3、提交
示例代码:
@Test
public void deleteById() throws SolrServerException, IOException{
SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/");
solrServer.deleteById("c001");
solrServer.commit();
}
2.4 根据条件删除索引操作
步骤:
1、与Solr连接获取SolrServer对象
2、根据条件进行删除、
3、提交
示例代码:
查询语法完全支持Lucene的查询语法。
//根据查询条件删除文档
@Test
public void deleteDocumentByQuery() throws Exception {
//创建连接
SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
//根据查询条件删除文档
solrServer.deleteByQuery("id:c001");
//提交修改
solrServer.commit();
}
2.5 修改索引操作
在solrJ中修改没有对应的update方法,只有add方法,只需要添加一条新的文档,和被修改的文档id一致就,可以修改了。本质上就是先删除后添加。
2.6 简单查询索引操作
步骤:
1、与Solr连接获取SolrServer对象
2、创建查询条件SolrQury对象
3、设置查询条件
4、设置查询结果个数,默认为10
5、执行查询获取QueryResponse对象
6、获取查询结果SolrDocumentList
7、遍历查询结果
@Test
public void baseQuery() throws SolrServerException{
SolrServer solrServer = new HttpSolrServer(url);
//创建查询条件
SolrQuery query = new SolrQuery();
//设置查询条件
query.setQuery("*:*");
//设置查询结果的个数
query.setRows(20);
//执行查询,获取查询相应
QueryResponse response = solrServer.query(query);
//获取查询结果 里面封装了SolrDocument对象
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("查询到的商品数量是:"+solrDocumentList.getNumFound());
for (SolrDocument doc : solrDocumentList) {
System.out.println("-------------");
System.out.println(doc.get("id"));
System.out.println(doc.get("product_name"));
System.out.println(doc.get("product_price"));
}
}
2.7 复杂查询索引操作
需求:查询条件、过滤条件、分页、关键词高亮、排序
API介绍:
1、查询对象
SolrQuery query = new SolrQuery();
2、设置查询条件
query.setQuery(“product_name:花儿”);
3、设置默认搜索域
query.set(“df”,”product_keywords”);
4、设置排序
query.addSort(“product_price”, ORDER.desc);
ORDER.desc降序 ORDER.asc升序
5、设置过滤条件
两种方式
query.addFilterQuery(“域名”,”条件”);
query.setFilterQueries(“域名:条件”,”域名:条件”…);
6、设置分页
query.setStart(0);设置开始 (page-1)*pageSize
query.setRows(10);设置查询的个数
7、处理高亮
开启高亮
query.setHighlight(true);
设置高亮域
query.addHighlightField(“product_name”);
高亮显示的前缀
query.setHighlightSimplePre(““);
高亮显示的后缀
query.setHighlightSimplePost(““);
获取高亮结果 第一个map的key为id值,value: 第二个map key为域名 value 为数据
Map
SolrServer solrServer = new HttpSolrServer(url);
SolrQuery query = new SolrQuery();
//设置查询条件
query.setQuery("product_name:花儿");
//设置过滤
query.setFilterQueries("product_catalog_name:与钟不同");
//设置排序
query.addSort("product_price", ORDER.desc);
//设置默认搜索域
query.set("df","product_keywords");
//处理分页
//设置开始页
query.setStart(0);
query.setRows(10);
//设置每页显示的个数
//设置显示的域
//query.setFields("id","product_name");
//设置高亮
//开启高亮
query.setHighlight(true);
//设置高亮显示的域
query.addHighlightField("product_name");
//设置高亮的前缀
query.setHighlightSimplePre("<span style=\"color:red\">");
//设置高亮的后缀
query.setHighlightSimplePost("</span>");
//执行查询
QueryResponse response = solrServer.query(query);
SolrDocumentList solrDocumentList = response.getResults();
//获取高亮结果 第一个mao的key为id值,value map为域名加数据
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
for (SolrDocument doc : solrDocumentList) {
System.out.println("-------------");
System.out.println(doc.get("id"));
System.out.println("普通名称:"+doc.get("product_name"));
System.out.println("高亮显示 :"+highlighting.get(doc.get("id")).get("product_name").get(0));
System.out.println(doc.get("product_price"));
}
}
三、web项目实现Solr
3.1 系统架构
3.2 编写查询类 QueryVo
public class QueryVo {
private String queryString;
private String catalog_name;
private String price;
private Integer sort;
public String getQueryString() {
return queryString;
}
public void setQueryString(String queryString) {
this.queryString = queryString;
}
public String getCatalog_name() {
return catalog_name;
}
public void setCatalog_name(String catalog_name) {
this.catalog_name = catalog_name;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
3.3 使用springmvc框架,spingmvc的配置略
springmvc.xml中配置SolrServer
<!-- 配置SolrServer对象 -->
<bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<!-- 使用构造函数注值 -->
<constructor-arg index="0" value="http://localhost:8080/solr/"></constructor-arg>
</bean>
3.4 SolrDaoImpl实现类的编写
package cn.lx.jd.dao.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import cn.lx.jd.dao.SolrDao;
import cn.lx.jd.vo.Product;
import cn.lx.jd.vo.QueryVo;
@Repository
public class SolrDaoImpl implements SolrDao{
@Autowired
private SolrServer solrServer;
/**
* 根据条件查询商品
* @throws SolrServerException
* */
@Override
public List<Product> findProductByCondition(QueryVo vo) throws SolrServerException {
SolrQuery query = new SolrQuery();
//设置默认搜索域
//query.set("df", "product_keywords");
if(vo.getQueryString() != null && !"".equals(vo.getQueryString().trim())){
query.setQuery("product_name:"+vo.getQueryString());
}else{
query.setQuery("product_name.*");
}
//设置过滤查询
if(vo.getCatalog_name() !=null && !"".equals(vo.getCatalog_name())){
query.addFilterQuery("product_catalog_name:"+vo.getCatalog_name());
}
//设置排序 0价格升序,1价格降序
if(vo.getSort() != null){
if(0 == vo.getSort()){
query.addSort("product_price", ORDER.asc);
}else if(1 == vo.getSort()){
query.addSort("product_price", ORDER.desc);
}
}
//处理查询价格 过滤条件
if(vo.getPrice() != null ){
String[] price = vo.getPrice().split("-");
if(price.length>1){
query.addFilterQuery("product_price:["+price[0]+" TO "+price[1]+"]");
}
}
//开启高亮
query.setHighlight(true);
//设置高亮域
query.addHighlightField("product_name");
//设置高亮前代码
query.setHighlightSimplePre("<span style=\"color:red\">");
//后置代码
query.setHighlightSimplePost("</span>");
//执行查询
QueryResponse response = solrServer.query(query);
//获取查询结果
SolrDocumentList solrDocumentList = response.getResults();
List<Product> list = new ArrayList<Product>();
if(solrDocumentList.size()>0){
//获取高亮结果
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
//处理查询结果
for (SolrDocument doc : solrDocumentList) {
Product p = new Product();
//进行 赋值
p.setPid((String)doc.get("id"));
p.setCatalog_name((String)doc.get("product_catalog_name"));
p.setPrice((float)doc.get("product_price"));
p.setPicture((String)doc.get("product_picture"));
String name = highlighting.get(doc.get("id")).get("product_name").get(0);
p.setName(name);
list.add(p);
}
}
return list;
}
}