solr初步

一、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的使用,完成增删查改以及分页等常用操作。

 

 

如果有疑问或者对该博文有何看法或建议或有问题的,欢迎评论,恳请指正!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值