solr是一款非常强大的搜索项目,虽然基于luncen开发,但是在其基础上做了一定的修改,特别是强大的solr cloud,我是刚开始接触solr,记录下使用solr实现最简单的增删改查。
首先需要搭建solr的开发环境,网上搭建solr开发环境的资料很多,大家可以去找一下,搭建过程也很简单,这里默认大家环境是完好的,没好的话可以参考我的另外一篇博客。
以下操作前提假设:schema.xml中主要的配置为:
一、创建索引
1、获取solr服务的连接,设计了一个单例模式,最小限度的创建连接数量
private static HttpSolrServer httpSolrServer;
private static HttpSolrServer getHttpSolrServer() {
if (httpSolrServer == null) {
// solr服务的url,连接响应时间、连接时间,最大连接数、分路由最大连接数,重试次数,是否支持压缩等参数的设置
httpSolrServer = new HttpSolrServer("127.0.0.1:8983/solr/bolg");
httpSolrServer.setSoTimeout(1000);
httpSolrServer.setConnectionTimeout(1000);
httpSolrServer.setDefaultMaxConnectionsPerHost(50);
httpSolrServer.setMaxRetries(3);
httpSolrServer.setMaxTotalConnections(100);
httpSolrServer.setAllowCompression(true);
httpSolrServer.setFollowRedirects(false);
}
return httpSolrServer;
}
2、创建一个实体类的对象,以便于保存索引,与实体类保存到数据库原理相似
public class BlogDTO implements Serializable{
@Field
private String blogId;
@Field
private String content;
@Field
private String blogUrl;
// 省略get和set方法...
}
3、创建索引
public boolean createBlogIndex(List blogList) {
// blogList中不能包含null对象,需要做一步处理,省略
SolrServer solrServer = getHttpSolrServer();
try {
if(blogList == null || blogList.size()==0){
return false;
}
// 批量创建博客数据索引数据
solrServer.addBeans(blogList);
solrServer.commit();
// 优化索引,不建议每次创建好之后都优化,定期优化即可
solrServer.optimize();
return true;
} catch (Exception e) {
// TODO
LOGGER.logException(eventMessage, e);
}
return false;
}
创建好索引后可以选择优化,优化索引所做的操作是将索引文件惊醒合并和归类,在此过程中,会影响索引的读操作,不建议每次创建后优化,可以每隔一定时间进行优化,时间根据需要来设定。索引创建结束成功后,就可以通过solr的客户端查询验证数据了。
二、查询索引
public List queryBlogList(String blogId) {
List queryResult = new ArrayList();
QueryResponse response = null;
// 主搜索条件
String searchParam = "blodId:" + blogId;
// 获取服务连接
SolrServer server = getHttpSolrServer();
SolrQuery query = new SolrQuery(searchParam);
// 添加联合查询条件 相当于and
query.setFilterQueries("url:www.baidu.com");
// 此处可以设置要返回的字段,比如只返回博客内容
query.setFields("content");
// 搜索排序条件
query.addSortField("blogId", ORDER.desc);
query.setRows(2); // 每页文档数,默认为10
try {
response = server.query(query);
} catch (Exception e) {
LOGGER.logException(e);
}
if (response != null) {
SolrDocumentList list = response.getResults();
// 将搜索结果封装为结果类
queryResult = processBlogData(list);
}
return queryResult;
}
// 将solr中查询出的文档转换为对象类型
private List setReviewData(SolrDocumentList list) {
DocumentObjectBinder binder = new DocumentObjectBinder();
List blogList = binder.getBeans(BlogDTO.class, list);
return blogList;
}
索引技术的使用主要是使用到的查询,solr中包含非常强大的查询机制,首先是倒排序方式的查询比db中的正排序快出很多,其次 文档文件中的检索也比关系型数据库检索要来的快,另外,solr中支持的条件查询,非常多,同时还支持评分计算,文档高亮显示,分页检索,自定义返回数据类型(json、xml、csv、php、ruby等等),这里只是实现了最简单的查询,相当于select * from table where id=124
三、更改索引数据
在索引文件中,因为每条数据都是唯一的,在schema.xml中有设置
blogId
所谓的更改索引数据就是重新创建索引,代码与创建索引有相似之处,此处省略代码
四、删除索引
删除索引就是直接将该索引数据删除,但是我通过solrj删除索引后,发现索引文件依然存在的,不知道是因为没有进行commit操作还是因为没有optimize操作,这个还望了解的同学指点,删除索引的代码如下:
public boolean deleteBlogIndex(List blogIds) {
SolrServer solrServer = getHttpSolrServer();
try {
solrServer.deleteById(blogIds);
solrServer.commit();
return true;
} catch (Exception e) {
LOGGER.logException( e);
}
return false;
}
以上是通过solrj对索引数据的增删改查操作,有了以上技能啊,就可以简单的将solr技术使用到项目中了,当然,如果真的将solr技术使用到项目中,还需要考虑的是索引文件的定期全量创建机制、索引碎片处理、索引优化机制、查询性能优化,有可能还会用到读写分离、主从同步、服务集群、处理高并发以及与其他一些技术如redis的结合(solr实时性需要慎重使用,可以与redis结合达到业务需求),还需继续研究才行啊,希望喜欢搜索项目的同学一起学习啊