二、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. Hadoop HDFS的常用命令

    1.将目录/root/data/下的item.txt复制到HDFS下的/user/root下: hadoop fs -copyFromLocal /root/data/item.txt itemdat ...

  2. 【原】Redis学习资料推荐

    Redis学习资料推荐 网址: Redis官网http://redis.io/ Redis命令 http://redis.io/commands Redis教程 https://www.tutoria ...

  3. andriod and linux kernel启动流程

    虽然这里的Arm Linux kernel前面加上了Android,但实际上还是和普遍Arm linux kernel启动的过程一样的,这里只是结合一下Android的Makefile,讲一下boot ...

  4. Clean Code – Chapter 6 Objects and Data Structures

    Data Abstraction Hiding implementation Data/Object Anti-Symmetry Objects hide their data behind abst ...

  5. Camera图像处理原理及实例分析-重要图像概念

    Camera图像处理原理及实例分析 作者:刘旭晖  colorant@163.com  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rg ...

  6. HIbernate学习笔记(一) 了解hibernate并搭建环境建立第一个hello world程序

    Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了轻量级的封装,Java程序员可以使用面向对象的编程思维来操纵数据库,它通过对象属性和数据库表字段之间的映射关系,将对象 ...

  7. Storm系列(十三)架构分析之Worker-维护ZMQ连接

    Worker根据Topology的定义及分配到自身的任务情况,计算出发出的消息被那些Task接收,由于Worker上分配的任务可能被调整,因此Worker需要定时的更新这些连接信息. ZMQ连接信息更 ...

  8. Select the best path in a matrix

    Amazon interview question: Given a 2-dimensional array with arbitrary sizes and contains random posi ...

  9. javascript中call和apply方法

    我们可以将call和apply看做是某个对象的方法,通过调用方法的形式来间接调用函数.call和apply的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用. 例 ...

  10. JS继承的几种方式

    JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一. 既然要实现继承,那么我们先定义一个父类: // 定义一个动物类 function Animal (name) { // 属性 this.n ...