一、Solr简介
采用Java开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http G SolrJ操作提出查找请求,并得到XML格式的返回结果。
二、搭建solr服务器
1、所需资源
a、1.6或者1.6版本的jdk
b、solr-4.7.0.zip
2、解压压缩包,打开cmd命令窗口,跳转到解压的路径下,找到含有start.jar的路径:E:\solr\solr-4.7.0\example
3、运行start.jar,命令:java -jar start.jar ,启动solr服务器
4、现在即可在网页访问:localhost:8983,访问solr,接着点链接进入solr管理界面,这样solr服务器搭建成功。solr管理界面非常好用,可以进行索引的增删改查,查看分词器,并通过插件完成各种功能的实现。这里就不作详解。
三、solrj的使用
1、建Java Project,导jar包,加入E:\solr\solr-4.7.0\dist\solrj-lib的所有包,和E:\solr\solr-4.7.0\dist的一些包,除solr-dataimporthandler-4.7.0.jar和solr-dataimporthandler-extras-4.7.0.jar之外,这两个包是用来同步数据库到索引库的!
2、创建pojo对象
package top.einino.bean;
import org.apache.solr.client.solrj.beans.Field;
public class Blog {
//这时field配置的value值需要符合
//E:\solr\solr-4.7.0\example\solr\collection1\conf下
//的schema.xml的Fieldr的name配置,或者你可以自定义。
@Field(value=”id”)
private Integer id;
@Field(value=”author”)
private String author;
@Field(value=”title”)
private String title;
@Field(value=”content”)
private String content;
@Field(value=”url”)
private String url;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
3、创建将pojo对象转换成SolrDocument对象的接口
package top.einino.utils;
import org.apache.solr.common.SolrDocument;
public interface ConvertDocumentToEntity {
public Object convertDocumentToEntity(SolrDocument document);
}
4、转换接口实现类
package top.einino.utils;
import java.util.List;
import org.apache.solr.common.SolrDocument;
import top.einino.bean.Blog;
public class BlogToDocument implements ConvertDocumentToEntity {
//将solrDocument转换为blog对象
@Override
public Object convertDocumentToEntity(SolrDocument document) {
Blog blog = new Blog();
blog.setId(Integer.parseInt(document.get(“id”).toString()));
blog.setAuthor((String) document.get(“author”));
//字段属性为multiValued的处理方式
List<Object> list = (List<Object>) document.getFieldValue(“title”);
String title = this.listToString(list);
blog.setTitle(title);
List<Object> contentList = (List<Object>) document.getFieldValue(“content”);
String content = this.listToString(contentList);
blog.setContent(content);
blog.setUrl((String) document.get(“url”));
return blog;
}
//将集合转换为字符串
private String listToString(List<Object> list) {
StringBuffer stringBuffer = new StringBuffer(“”);
if(list != null && list.size() > 0){
for(Object o : list){
stringBuffer.append(o.toString());
}
}
return stringBuffer.toString();
}
}
5、创建SolrDao<T>
package top.einino.solr;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import top.einino.utils.ConvertDocumentToEntity;
public class SolrDao<T> {
//访问路径
public static String URL = “http://localhost:8983/solr”;
//创建solr服务类
public static SolrServer solrServer = new HttpSolrServer(URL);
//添加和更新索引是一样的,如果id存在,就是更新索引,如果 id不存在就是添加索引
public void addOrUpdateIndex(T entity){
try {
solrServer.addBean(entity);
solrServer.commit();
} catch (IOException e) {
e.printStackTrace();
} catch (SolrServerException e) {
e.printStackTrace();
}
}
//通过可变参数ids删除索引
public void deleteIndexById(Serializable … ids){
try {
if(ids != null && ids.length > 0){
for(Serializable id : ids){
solrServer.deleteById(id.toString());
}
}
solrServer.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
//检索索引,第一个参数为字段,第二个参数为字段值,第三个参数为转换接口
public List<T> findIndexList(String fieldName, String fieldValue, ConvertDocumentToEntity ConvertDocumentToEntity){
List<T> results = new ArrayList<T>();
//定义查询条件
SolrQuery params = new SolrQuery();
//定义查询字段和字段值
params.setQuery(fieldName+”:”+fieldValue);
try {
//获得查询结果
QueryResponse query = solrServer.query(params);
//获得查旬结果集
SolrDocumentList solrDocuments = query.getResults();
if(solrDocuments != null && solrDocuments.size() > 0){
for(SolrDocument solrDocument : solrDocuments){
T entity = (T) ConvertDocumentToEntity.convertDocumentToEntity(solrDocument);
results.add(entity);
}
}
} catch (SolrServerException e) {
e.printStackTrace();
}
return results;
}
//检索索引,第一个参数为字段,第二个参数为字段值,第三个参数为转换接口,第四个参数为起始行,第五个参数为每页行数
public List<T> findIndexListWithPage(String fieldName, String fieldValue, ConvertDocumentToEntity ConvertDocumentToEntity, int startRow, int rows){
List<T> results = new ArrayList<T>();
//定义查询条件
SolrQuery params = new SolrQuery();
//定义查询字段和字段值
params.setQuery(fieldName+”:”+fieldValue);
//设置起始行
params.setStart(startRow);
//设置行数
params.setRows(rows);
try {
//获得查询结果
QueryResponse query = solrServer.query(params);
//获得查旬结果集
SolrDocumentList solrDocuments = query.getResults();
if(solrDocuments != null && solrDocuments.size() > 0){
for(SolrDocument solrDocument : solrDocuments){
T entity = (T) ConvertDocumentToEntity.convertDocumentToEntity(solrDocument);
results.add(entity);
}
}
} catch (SolrServerException e) {
e.printStackTrace();
}
return results;
}
}
6、创建测试类
package top.einino.junit;
import java.util.List;
import org.junit.Test;
import top.einino.bean.Blog;
import top.einino.solr.SolrDao;
import top.einino.utils.BlogToDocument;
public class TestSolrDao {
private SolrDao<Blog> solrDao = new SolrDao<Blog>();
//测试添加or更新方法
@Test
public void addOrUpdateIndex(){
Blog blog = new Blog();
blog.setId(1);
blog.setAuthor(“einino”);
blog.setTitle(“solr初步应用”);
blog.setContent(“solr服务器搭建以及solrj的使用”);
solrDao.addOrUpdateIndex(blog);
}
//为了测试其他而加的方法
@Test
public void addOrUpdateIndexData(){
for(int i=1; i<28; i++){
Blog blog = new Blog();
blog.setId(i);
blog.setAuthor(“einino”);
blog.setTitle(“solr初步应用”);
blog.setContent(“solr服务器搭建以及solrj的使用”);
solrDao.addOrUpdateIndex(blog);
}
}
//测试根据可变参数id删除索引
@Test
public void deleteIndex(){
//测试单个id
solrDao.deleteIndexById(1);
//测试数组id,注意能用基本类型数组,不然可变参数不会将其拆分
//Integer[] ids = {3, 4, 5, 6, 7, 8, 9};
//solrDao.deleteIndexById(ids);
}
//测试检索方法
@Test
public void findIndexList(){
List<Blog> blogList = solrDao.findIndexList(“title”, “solr”, new BlogToDocument());
if(blogList != null && blogList.size() > 0){
for(Blog blog : blogList){
System.out.println(“Blog [id=” + blog.getId() + “, author=” + blog.getAuthor() + “, title=” + blog.getTitle()
+ “, content=” + blog.getContent() + “, url=” + blog.getUrl() + “]”);
}
}
}
//测试分页查询方法
@Test
public void findIndexListWithPage(){
List<Blog> blogList = solrDao.findIndexListWithPage(“title”, “solr”, new BlogToDocument(), 10, 10);
if(blogList != null && blogList.size() > 0){
for(Blog blog : blogList){
System.out.println(“Blog [id=” + blog.getId() + “, author=” + blog.getAuthor() + “, title=” + blog.getTitle()
+ “, content=” + blog.getContent() + “, url=” + blog.getUrl() + “]”);
}
}
}
}
四、小结
该博文主要介绍了如何搭建solr服务器以及solrj的使用,完成增删查改以及分页等常用操作。
如果有疑问或者对该博文有何看法或建议或有问题的,欢迎评论,恳请指正!