二、SolrJ的使用

SolrJ覆盖了solr的全部功能,下面将自己在实际开发中所使用的程序粘贴出来并适当加以解释,由于本人比较菜,代码书写不是那么的精练,还请见谅。

1、  创建solrserver对象:

try {

solr = new CommonsHttpSolrServer("http://localhost:8983/solr");

solr.setConnectionTimeout(100);

solr.setDefaultMaxConnectionsPerHost(100);

solr.setMaxTotalConnections(100);

} catch (Exception e) {

System.out.println("请检查tomcat服务器或端口是否开启!");

e.printStackTrace();

}

2、  添加索引

Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();

for (int i = 0; i < list.size(); i++) {

Item item = list.get(i);

//设置每个字段不得为空,可以在提交索引前进行检查

if (CheckItem(item)) {

SolrInputDocument doc = new SolrInputDocument();

//在这里请注意date的格式,要进行适当的转化,上文已提到

doc.addField("id", item.getId());

…………

docs.add(doc);

}

}

try {

solr.add(docs);

//对索引进行优化

solr.optimize();

solr.commit();

} catch (Exception e) {

e.printStackTrace();

}

3、  使用bean对象添加索引

创建一个对应于solr索引的类别:

public class Item {

@Field

private String id;

…………

public void setId(String id) {

this.id = id;

}

public String getId() {

return id;

}

…………

public Item(){

}

}

使用数据创建bean对象列表,

try {

solr.addBeans(beansList);

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

solr.optimize();

solr.commit();

} catch (Exception e) {

e.printStackTrace();

}

}

索引提交完毕。

4、  删除索引

据查询结果删除:

try {

//删除所有的索引

solr.deleteByQuery("*:*");

solr.commit();

} catch (Exception e) {

e.printStackTrace();

}

根据索引号删除索引:

try {

solr.deleteById(ids);

solr.commit();

} catch (Exception e) {

e.printStackTrace();

}

5、  查询

SolrJ提供的查询功能比较强大,可以进行结果中查询、范围查询、排序等。

下面是笔者封装的一个查询函数:

public static QueryResponse Search(String[] field, String[] key, int start,

int count, String[] sortfield, Boolean[] flag, Boolean hightlight) {

//检测输入是否合法

if (null == field || null == key || field.length != key.length) {

return null;

}

if (null == sortfield || null == flag || sortfield.length != flag.length) {

return null;

}

SolrQuery query = null;

try {

//初始化查询对象

query = new SolrQuery(field[0] + ":" + key[0]);

for (int i = 0; i < field.length; i++) {

query.addFilterQuery(field[i] + ":" + key[i]);

}

//设置起始位置与返回结果数

query.setStart(start);

query.setRows(count);

//设置排序

for(int i=0; i<sortfield.length; i++){

if (flag[i]) {

query.addSortField(sortfield[i], SolrQuery.ORDER.asc);

} else {

query.addSortField(sortfield[i], SolrQuery.ORDER.desc);

}

}

//设置高亮

if (null != hightlight) {

query.setHighlight(true); // 开启高亮组件

query.addHighlightField("title");// 高亮字段

query.setHighlightSimplePre("<font color="red">");// 标记

query.setHighlightSimplePost("</font>");

query.setHighlightSnippets(1);//结果分片数,默认为1

query.setHighlightFragsize(1000);//每个分片的最大长度,默认为100

}

} catch (Exception e) {

e.printStackTrace();

}

QueryResponse rsp = null;

try {

rsp = solr.query(query);

} catch (Exception e) {

e.printStackTrace();

return null;

}

//返回查询结果

return rsp;

}

补充一下范围查询的格式:[star t TO end],start与end是相应数据格式的值的字符串形式,“TO”     一定要保持大写!

6、  读取查询结果

DocList读取返回结果:

SolrDocumentList solrList = rsp.getResults();

Beans读取返回结果:

List<Item> tmpLists = rsp.getBeans(Item.class);

读取高亮显示结果:

rsp = Search(field, key, 0, 10, sortfield, flag, true);

if(null == rsp){

return;

}

Map<String, Map<String, List<String>>> hightlight = rsp.getHighlighting();

//Item即为上面定义的bean类

List<Item> tmpLists = rsp.getBeans(Item.class);

for (int i = 0; i < tmpLists.size(); i++) {

//hightlight的键为Item的id,值唯一,我们设置的高亮字段为title

String hlString = hightlight.get(tmpLists.get(i).getId()).get("title").toString();

if (null != hlString) {

System.out.println(hlString);

}

}

7、  Facet的一个应用:自动补全

//prefix为前缀,min为最大返回结果数

public static String[] autoComplete(String prefix, int min) {

String words[] = null;

StringBuffer sb = new StringBuffer("");

SolrQuery query = new SolrQuery("*.*");

QueryResponse rsp= new QueryResponse();

//Facet为solr中的层次分类查询

try {

query.setFacet(true);

query.setQuery("*:*");

query.setFacetPrefix(prefix);

query.addFacetField("title");

rsp = solr.query(query);

} catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

return null;

}

if(null != rsp){

FacetField ff = rsp.getFacetField("title");

List<Count> countList = ff.getValues();

if(null == countList){

return null;

}

for(int i=0; i<countList.size(); i++){

String tmp[] = countList.get(i).toString().split(" ");

//排除单个字

if(tmp[0].length()< 2){

continue;

}

sb.append(tmp[0] + " ");

min--;

if(min == 0){

break;

}

}

words = sb.toString().split(" ");

}else{

return null;

}

return words;

}

二、总结

在使用solr之前,笔者曾经用lucene与MMAnalyer自行搭建了一个索引搜索体系,由于要组合运用lucene的API,且lucene索引支持的数据格式有限,所以效率要大大低于solr,查询尚可,建立索引的速度差距尤为明显,Solr无疑是建立站内搜索等任务的首选。本人对于Solr的研究也是刚刚起步,希望能和更多的朋友交流、进步。

三、参考资料

1、  ITeye中Solr相关的网页

2、  累积:技海拾贝――Apache_Solr_初级教程.pdf

3、  solr_使用安装介绍.doc

4、  solr_DOC_CN.pdf

Solr使用初探——SolrJ的使用的更多相关文章

  1. Solr JAVA客户端SolrJ 4.9使用示例教程

    http://my.oschina.net/cloudcoder/blog/305024 简介 SolrJ是操作Solr的JAVA客户端,它提供了增加.修改.删除.查询Solr索引的JAVA接口.So ...

  2. Solr使用初探——Solr的安装环境与配置

    Solr是一个apache名下很好用的开源索引.搜索工具,网上的资料虽多但很杂,笔者花了一天的时间对Solr进行了较为初步的研究,对Solr的基础应用做了一定的总结.文中涉及到的配置方法并不唯一,AP ...

  3. Solr第二讲——SolrJ客户端的使用与案例

    一.Solrj的使用 1.什么是Solrj solrj是访问Solr服务的java客户端(就像通过jedis操作redis一样),提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过Sol ...

  4. solr 学习之solrJ

    solrJ是访问Solr服务的JAVA客户端,提供索引和搜索的请求方法,SolrJ通常嵌入在业务系统中,通过solrJ的API接口操作Solr服务. <!-- https://mvnreposi ...

  5. Solr JAVA客户端SolrJ的使用

    一.Solrj简介 SolrJ是操作Solr的JAVA客户端,它提供了增加.修改.删除.查询Solr索引的JAVA接口.SolrJ针对 Solr提供了Rest 的HTTP接口进行了封装, SolrJ底 ...

  6. Solr 18 - 通过SolrJ局部更新Solr中的文档 (原子操作、非覆盖操作)

    目录 1 需求分析 2 需求实现 2.1 pom.xml依赖 2.2 Java代码示例 3 补充说明 3.1 关于文档中_version_的取值说明 3.2 store=true/false的区别 1 ...

  7. 【Solr初探】Solr安装,启动,查询,索引

    1. 安装&启动 官网:http://lucene.apache.org/solr/ 下载源代码,解压,进入根目录(我把solr放在/usr/local/solr下) 在/usr/local/ ...

  8. org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: Internal Server Error 错误

    Solr报错: { "responseHeader": { "status": 500, "QTime": 11 }, "erro ...

  9. solr 学习片段

    全文检索技术——Solr 1 主要内容 1.站内搜索技术选型 2.什么是solr Solr和lucene的区别 3.solr服务器的安装及配置 Solr整合tomcat Solr的演示 4.维护索引 ...

随机推荐

  1. Python ImportError: No module named *****

    如果想使用非当前模块中的代码,需要使用Import,这个大家都知道. 如果你要使用的模块(py文件)和当前模块在同一目录,只要import相应的文件名就好,比如在a.py中使用b.py: import ...

  2. asp.net 中Session的运用,及抛出错误“未将对象引用设置到对象的实例”

    1. 页面载入后,必须要等到page_Load方法执行建立 page对象后才可以使用Session 2. 在.aspx和.cs文件中使用Session的区别 (1).aspx: Session[&qu ...

  3. CodeForces - 445A - DZY Loves Chessboard解题报告

    对于这题本人刚开始的时候觉得应该用DFS来解决实现这个问题,但由于本人对于DFS并不是太熟,所以就放弃了这个想法: 但又想了想要按照这个要求实现问题则必须是黑白相间,然后把是字符是'B'或'W'改为' ...

  4. JSP---JSP中4个容器-pageContext使用

    这里重点只讲pageContext容器的用法哦. 因为另外的3个容器(request,session,application)在前面的servlet中已经演示过很多遍了 容器 作用域 pageCont ...

  5. HTML5/CSS3动画应用

    http://www.html5tricks.com/cool-html5-css3-animation.html

  6. Linux经久不衰的应用程序

    Linux里面的应用程序一贯以高安全性,高性价比(功能/所占空间),此次记录一下Linux里面比较常用的而且经久不衰的应用程序. Shell:               bash(它结合了 csh ...

  7. CMDB, 配置管理数据库, ITIL - ManageEngine ServiceDesk Plus

    Download Bitnami Review Board Stack click here CMDB, 配置管理数据库, ITIL - ManageEngine ServiceDesk Plus

  8. java程序员菜鸟进阶(十五)linux基础入门(三)linux用户和组管理

    我们大家都知道,要登录linux操作系统,我们必须要有一个用户名和密码.每一个用户都由一个惟一的身份来标识,这个标识叫做用户ID.系统中的每一个用户也至少需要属于一个"用户分组". ...

  9. spring问题org.springframework.beans.factory.CannotLoadBeanClassException

    1.看jdk是否配置正确 2.把MyEclipse里面的那个classes删除让他重新编译就没什么问题了,只要配置是对的 3.重新clean project

  10. Java从设计模式[本场比赛状态转换武器]状态分析(State)模式

    如果我们正在做一个实时战略游戏.我们设计了一个武器,他制作只是当步兵,但他能够切换武器.第一个开关会变成弓箭手,第二个开关导通控股装甲盾牌,第三开关变成步兵--如何实现这一目标切换机构?我们开始思考, ...