二、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. POJ1159 - Palindrome(区间DP)

    题目大意 给定一个字符串S,问最少插入多少个字符可以使字符串S变为回文串 题解 用dp[i][j]表示把字符串s[i-j]变为回文串需要插入的最小字符数 如果s[i]==s[j]那么dp[i][j]= ...

  2. python 实战

    用Python写一个真正的Web App! 目标 我们设定的实战目标是一个Blog网站,包含日志.用户和评论3大部分. 比如webpy.org上就提供了一个Blog的例子,目测也就100行代码. 我们 ...

  3. setTimeout中0毫秒延时

    先来看段代码,思考一下执行的结果. alert(1); setTimeout(function(){alert(2);}, 0); alert(3); 估计很多人认为执行结果为1,2,3,原因就是认为 ...

  4. Delphi- 连接MySQL数据库BDE

    Delphi使用ADO可以连接MSSQL和ACCESS,但似乎不能连接MYSQL和ORACEL,如果要连接MYSQL和ORACLE得使用BDE. 一.连接方法 首先得先安装mysql驱动程序_mysq ...

  5. background-position也许你没考虑到

    设置背景图片时不知你有没有遇到过背景位置的困扰,有没有深入思考过,background-position到底是什么,下面请各位看看我的理解. 简而言之就一句话,默认图片左上角居元素左上角的坐标,例如: ...

  6. android 开源项目学习<二>

    roottools:   RootTools gives Rooted developers easy access to common rooted tools...  https://code.g ...

  7. FrankFan7你问我答之一

    作者:范军 (Frank Fan) 新浪微博:@frankfan7   微信:frankfan7 最近网友留言很多,你既然看得起我问了,我就说说个人浅见.看看就行了,也别认真. Q:你具体工作是什么? ...

  8. linq to sql 博客集锦

    Linq to sql  比较全面的学习博客 http://www.cnblogs.com/aehyok/tag/Linq%20To%20Sql/ 使用LINQ TO SQL基于Respository ...

  9. SMB带宽限制

    1.安装SMB带宽限制功能 Add-WindowsFeature FS-SMBBW 2.通过PowerShell命令限制SMB带宽 #限制非Hyper-V over SMB or Live Migra ...

  10. 收集磁盘分区信息(总量、可用、已用、百分比)导出到csv

    #############################脚本功能及说明##################################################该脚本用来收集磁盘分区总大小 ...