二、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

转载于:https://www.cnblogs.com/sand-tiny/p/3941113.html

Solr使用初探——SolrJ的使用相关推荐

  1. [ solr入门 ] - 利用solrJ进行检索

    转自: http://www.cnblogs.com/huangfox/archive/2012/02/13/2348949.html solrJ可以看成是solr的java版客户端,提供基本的索引维 ...

  2. solr学习之solrj

    solrJ是访问Solr服务的JAVA客户端,提供索引和搜索的请求方法,SolrJ通常嵌入在业务系统中,通过solrJ的API接口操作Solr服务. 一 .maven的环境jar包配置 <!-- ...

  3. solr java api_Solr7.4.0的API(Solrj)操作

    一.SolrJ的概念 是一个API,它使用Java(或任何基于JVM的语言)编写的应用程序可以轻松地与Solr交谈.SolrJ隐藏了许多连接到Solr的细节,并允许您的应用程序通过简单的高级方法与So ...

  4. Solr语法解析及SolrJ使用

    Solr语法解析及SolrJ使用 标签(空格分隔): Solr 官方指南:http://lucene.apache.org/solr/quickstart.html Solrj 之HttpSolrCl ...

  5. sorl java 建索引_solr 的客户端调用solrj 建索引+分页查询

    在 solr 3.5 配置及应用(一) 讲过一了 solr 3.5的详细配置,本节我们讲利用solr 的客户端调用solr的应用了! 一.利用SolrJ操作solr API 使用SolrJ操作Solr ...

  6. 1.6.3 Uploading Data with Solr Cell using Apache Tika

    1. Uploading Data with Solr Cell using Apache Tika solr使用Apache Tika工程的代码提供了一个框架,用于合并所有不同格式的文件解析器为so ...

  7. Solr实战(二):索引操作

    2019独角兽企业重金招聘Python工程师标准>>> 草稿... 参考资料: Apache Solr 之 使用SolrJ操作索引库 Solr集群架构概述及delta-import详 ...

  8. Solr的安装步骤及增删改查代码示例

    一.solr的下载 http://lucene.apache.org/solr/ 解压到合适的位置,以4.10.3为例.solr是一个服务,里面有solr项目war包. 二.找到solr的war包 s ...

  9. solr 3.5 配置及应用(二)

    在 solr 3.5 配置及应用(一) 讲过一了 solr 3.5的详细配置,本节我们讲利用solr 的客户端调用solr的应用了! 一.利用SolrJ操作solr API 使用SolrJ操作Solr ...

  10. Solr快速入门(一)

    概述 本文档介绍了如何获取和运行Solr,将各种数据源收集到多个集合中,以及了解Solr管理和搜索界面. 首先解压缩Solr版本并将工作目录更改为安装Solr的子目录.请注意,基本目录名称可能随Sol ...

最新文章

  1. 机器学习 不均衡数据的处理方法
  2. 前端学习(2571):为什么使用vuex
  3. java 调用jni方法_Java JNI 本地方法调用Java对象方法
  4. JavaScript的闭包与应用
  5. spring-boot报错循环注入报错:has been injected into other beans
  6. suse linux 忘记root密码,SUSE linux 忘记root密码
  7. Fij/imageJ下载使用
  8. win10 excel和ppt变成英文了,word正常,怎么解决?
  9. 8255实现数码显示管显示两位数字
  10. Flashed Ball
  11. bilibili视频格式m4s批量转换为mp3,mp4
  12. event-log-tags
  13. vscode 单击跳转_vscode中ctrl+鼠标左键不能跳转_编程开发工具
  14. web开发从入门到精通一(详细)
  15. Java设计考试系统
  16. FinFET基础知识合集
  17. 名词可数不可数到底如何数——GeneralRule
  18. 如何保证路缘石滑模机作业质量的几个原则
  19. 扩展DailyRollingFileAppender使其支持限定日志文件的数量
  20. Oracle 表解锁

热门文章

  1. CS224N刷题——Assignment3.1_A window into NER
  2. HDU-1159-Common Subsequence
  3. 详解云原生应用实践与未来趋势
  4. PostgreSQL 数据离散性 与 索引扫描性能(btree and bitmap index scan)
  5. CORE网络数据包接收传递过程分析
  6. Vmware下安装配置HMC
  7. STC1_FULLSCREEN_TABLE_CONTROL
  8. 12月1日struts、spring、hibernate等框架的整合培训日记
  9. iOS NSUserDefaults 存放位置
  10. STL中容器的介绍及分类