Solr使用初探——SolrJ的使用
二、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的使用的更多相关文章
- Solr JAVA客户端SolrJ 4.9使用示例教程
http://my.oschina.net/cloudcoder/blog/305024 简介 SolrJ是操作Solr的JAVA客户端,它提供了增加.修改.删除.查询Solr索引的JAVA接口.So ...
- Solr使用初探——Solr的安装环境与配置
Solr是一个apache名下很好用的开源索引.搜索工具,网上的资料虽多但很杂,笔者花了一天的时间对Solr进行了较为初步的研究,对Solr的基础应用做了一定的总结.文中涉及到的配置方法并不唯一,AP ...
- Solr第二讲——SolrJ客户端的使用与案例
一.Solrj的使用 1.什么是Solrj solrj是访问Solr服务的java客户端(就像通过jedis操作redis一样),提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过Sol ...
- solr 学习之solrJ
solrJ是访问Solr服务的JAVA客户端,提供索引和搜索的请求方法,SolrJ通常嵌入在业务系统中,通过solrJ的API接口操作Solr服务. <!-- https://mvnreposi ...
- Solr JAVA客户端SolrJ的使用
一.Solrj简介 SolrJ是操作Solr的JAVA客户端,它提供了增加.修改.删除.查询Solr索引的JAVA接口.SolrJ针对 Solr提供了Rest 的HTTP接口进行了封装, SolrJ底 ...
- Solr 18 - 通过SolrJ局部更新Solr中的文档 (原子操作、非覆盖操作)
目录 1 需求分析 2 需求实现 2.1 pom.xml依赖 2.2 Java代码示例 3 补充说明 3.1 关于文档中_version_的取值说明 3.2 store=true/false的区别 1 ...
- 【Solr初探】Solr安装,启动,查询,索引
1. 安装&启动 官网:http://lucene.apache.org/solr/ 下载源代码,解压,进入根目录(我把solr放在/usr/local/solr下) 在/usr/local/ ...
- org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: Internal Server Error 错误
Solr报错: { "responseHeader": { "status": 500, "QTime": 11 }, "erro ...
- solr 学习片段
全文检索技术——Solr 1 主要内容 1.站内搜索技术选型 2.什么是solr Solr和lucene的区别 3.solr服务器的安装及配置 Solr整合tomcat Solr的演示 4.维护索引 ...
随机推荐
- 多组 RadioButtonList 获取值
<div class="row"> <table> <thead><tr><th>操作</th ...
- oracle rac logminer有限制用法及session_info为unknown情况
这里只记录下有条件的情况如何使用 BEGIN dbms_logmnr.start_logmnr( dictfilename => '/u01/arch/logminer_dict.ora', ...
- Git 远程分支的查看及相关问题
命令:git ls-remote -t 或者 git ls-remote --tag 运行结果如下: 0975ebc0f9a6b42ecbe066a50a26a678a0753b4d refs/tag ...
- Tools that help you scrape web data----帮助你收集web数据的工具
There are many programs that can be used to extract bulk information from a web site, including brow ...
- (一)Memcached初学教程之安装服务篇(Windows下)
1.下载Memcached的Windows服务安装程序(备注:memcached官网:http://memcached.org/ ,没有提供windows下的安装包,只有UNIX下的安装包,我们这里用 ...
- iOS Xcode8的适配
1.打开应用后打印了很多的log信息 解决方法: Xcode8里边 Edit Scheme... -> Run -> Arguments, 在Environment Variables里边 ...
- lucene创建索引简单示例
利用空闲时间写了一个使用lucene创建索引简单示例, 1.使用maven创建的项目 2.需要用到的jar如下: 废话不多说,直接贴代码如下: 1.创建索引的类(HelloLucene): packa ...
- [Webpack 2] Expose modules to dependencies with Webpack
When you have a dependency that has dependencies on global variables (like jQuery or lodash) or assu ...
- Redis学习手册(String数据类型)
一.概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型 ...
- 【转】C/C++中的日期和时间 TIME_T与STRUCT TM转换——2013-08-25 16
http://www.cnblogs.com/Wiseman/archive/2005/10/24/260576.html 摘要: 本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的 ...