- 浏览: 850294 次
文章分类
- 全部博客 (365)
- java (124)
- spring mvc (21)
- spring (22)
- struts2 (6)
- jquery (27)
- javascript (24)
- mybatis/ibatis (8)
- hibernate (7)
- compass (11)
- lucene (26)
- flex (0)
- actionscript (0)
- webservice (8)
- rabbitMQ/Socket (15)
- jsp/freemaker (5)
- 数据库 (27)
- 应用服务器 (21)
- Hadoop (1)
- PowerDesigner (3)
- EJB (0)
- JPA (0)
- PHP (2)
- C# (0)
- .NET (0)
- html (2)
- xml (5)
- android (7)
- flume (1)
- zookeeper (0)
- 证书加密 (2)
- maven (1)
- redis (2)
- cas (11)
最新评论
-
zuxianghuang:
通过pom上传报错 Artifact upload faile ...
nexus上传了jar包.通过maven引用当前jar,不能取得jar的依赖 -
流年末年:
百度网盘的挂了吧???
SSO单点登录系列3:cas-server端配置认证方式实践(数据源+自定义java类认证) -
953434367:
UfgovDBUtil 是什么类
Java发HTTP POST请求(内容为xml格式) -
smilease:
帮大忙了,非常感谢
freemaker自动生成源代码 -
syd505:
十分感谢作者无私的分享,仔细阅读后很多地方得以解惑。
Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
SolrJ
一. 什么是solrJ
Solrj is a java client to access solr. It offers a java interface to add, update, and query the solr index;
Solrj是Apache Solr提供的一个基于java端访问solr服务器的相关接口;
提供对solr服务器进行索引增加、修改、查询、删除和索引优化相关接口;
二. 使用Solrj
需要使Solrj必须导入以下Jar包
可以从http://lucene.apache.org/solr/获取相关资源
apache-solr-solrj-3.5.0.jar
apache-solrj-core-3.5.0.jar
commons-httpclient-3.1.jar
slf4j-api-1.6.0.jar
slf4j-jdk14-1.6.1jar
commons-logging-1.1jar
三.增加索引
1) 增加索引
public void addIndex(){
try {
SolrServer server = new CommonsHttpSolrServer("http://192.168.208.119:8389/solr");
SolrInputDocument document = new SolrInputDocument();
document.addField("id",1, new Float(1.0));
document.addField("name", "First");
server.add(document);
server.commit();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
提交到Solr服务器上的数据必须是 SolrInputDocument 类型
2) JavaBean实体转换成SolrInputDocument
public class SolrBean {
@Field
String id;
@Field("path")
String cat;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCat() {
return cat;
}
public void setCat(String cat) {
this.cat = cat;
}
}
@Field无参数时,匹配当前字段,也可以自定义,字段必须在schema.xml 中的Filed中存在
addBeans(Collection beans);
addBean(Object obj);
3) SolrDocument转换成JavaBean , DocumentObjectBinder
SolrDocumentList list = server.query(new SolrQuery("*:*")).getResults();
List solrBeanList = server.getBinder().getBeans(SolrBean.class,list);
4) solr服务器异常情况处理
server.add(docs);
server.commit();
server必须commit();solr服务器才会增加索引;
<1> solr服务器正常关闭(直接将部署Solr的Tomcat执行Stop操作)
当执行在 server.add()时,将Tomcat Stop,
因为server.add()时有个进程将数据提交到Solr服务器;
所有Solr服务器正常关闭时会自动执行server.commit();
<2> solr服务器非正常关闭
当执行在 server.add()时,通过任务管理器将Tomcat结束;
在server.add()时的数据将失效;
5) 将已经存在xml文件提交到solr服务器创建索引
curl http://localhost:8983/solr/mbartists/update -H 'Content-type:text/xml;charset=utf-8' --data-binary @artists.xml
官方文档只提供了基于命令行方式提交文件格式创建索引
四、索引修改:
Solr中修改机制为删除已经存在的索引,在增加新索引;
根据唯一字段来判断索引中是否存在,存在则删除。在添加新索引;
唯一字段参见 schema.xml 中 <uniqueKey>id</uniqueKey>
五.搜索
1) 简单的查询代码
public void queryAll(){
try {
SolrServer server = new CommonsHttpSolrServer("http://192.168.208.119:8389/solr");
SolrQuery params = new SolrQuery("*:*");//查询所有
SolrDocumentList docs = server.query(params).getResults();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SolrServerException e) {
e.printStackTrace();
}
}
2) 区间查询(between)
assertEquals(3, server.query(new SolrQuery("cat:[C TO G]")).getResults().size());
assertEquals(3, server.query(new SolrQuery("popularity:[1 TO 101]")).getResults().size());
当查询数字时,数字必须存储到int类型中(将int存到String中),否则查询int类型区间时,查询结果不准确
3) 模糊查询(通配符)
* 匹配一个或任意个
assertEquals(1, server.query(new SolrQuery("id:*1")).getResults().size());
? 匹配一个
assertEquals(1, server.query(new SolrQuery("id:1?2")).getResults().size())
AND 且 以下三种写法结果一致,三种不同的方式 (AND 必须大写)
assertEquals(0,server.query(new SolrQuery("id:(001 AND 003)")).getResults().size());
assertEquals(0,server.query(new SolrQuery("id:(001 && 003)")).getResults().size());
assertEquals(0,server.query(new SolrQuery("id:001 && id:003")).getResults().size());
OR 或 以下三种写法结果一致,三种不同的方式 (OR 必须大写)
assertEquals(2,server.query(new SolrQuery("id:(001 OR 003)")).getResults().size());
assertEquals(2,server.query(new SolrQuery("id:(001 || 003)")).getResults().size());
assertEquals(2,server.query(new SolrQuery("id:001 || id:003")).getResults().size());
非 相当于Java中的 !,-*:* *:*为所有,-*:*则为非所有,即空。
assertEquals("B",server.query(new SolrQuery("-name:A")).getResults().get(0).getFieldValue("name"));
assertEquals("2",server.query(new SolrQuery("-id:1")).getResults().get(0).getFieldValue("id"));
assertEquals(0,server.query(new SolrQuery("-*:*")).getResults().size());
4) 转义字符
SolrInputDocument doc1 = new SolrInputDocument();
doc1.setField("id", "Artist:20");
doc1.setField("name", "A:B:C&*FD");
以下这样查询时,solr服务器无法识别。solr异常信息Cannot parse 'id:Artist:20': Encountered " ":" ": ""
name中的 * 将会查询出所有数据;
assertEquals("Artist:20", server.query(new SolrQuery("id:Artist:20")).getResults().get(0).getFieldValue("id"));
assertEquals("A:B:C&*FD", server.query(new SolrQuery("name:A:B:C&*FD")).getResults().get(0).getFieldValue("name"));
Solr能接受的写法
assertEquals("Artist:20", server.query(new SolrQuery("id:\\Artist:20")).getResults().get(0).getFieldValue("id"));
assertEquals("A:B:C&*FD", server.query(new SolrQuery("name:A\\:B\\:C\\&\\*FD")).getResults().get(0).getFieldValue("name"));
Solrj提供了工具类对内容进行转义ClientUtils.escapeQueryChars(String s);
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ 这些字符必须要转义
assertEquals("Artist:20", server.query(new SolrQuery("id:"+ClientUtils.escapeQueryChars("Artist:20"))).getResults().get(0).getFieldValue("id"));
assertEquals("A:B:C&*FD", server.query(new SolrQuery("name:"+ClientUtils.escapeQueryChars("A:B:C&*FD"))).getResults().get(0).getFieldValue("name"));
5) 时间查询
6) 多字段(Field)查询
7) Facet
六.删除索引
Solrj提供了接口对索引直接删除;
1) 根据id删除
server. deleteById(String id);
server.commit();
2) 删除id集合
server. deleteById(List ids);
server.commit();
(<uniqueKey>id</uniqueKey>)
精确删除
根据id,或多个id进行删除
Server. deleteById(List ids);
Server. deleteById(String id);
匹配(模糊)删除
deleteByQuery(String query);
七.优化
索引合并
八. 安全性
SolrJ没有提供访问控制接口,也就是说只要知道solr服务器信息,任何人都可以连接solr服务器来进行索引增加、修改、删除操作;
根据Apache提供的文档说明,可以用一下三种方式进行控制;
1) 修改路径
webapp=/solr path=/select 将path改成其它
2) 限制客户端IP
通过限制client端的IP来进行控制,也是基于Tomcat控制
修改conf/server.xml 在<Host>节点中添加以下代码
allow运行访问的主机,多个IP时可以用 , 分开
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1,192.168.208.119"/>
3) 使用Http认证
一. 什么是solrJ
Solrj is a java client to access solr. It offers a java interface to add, update, and query the solr index;
Solrj是Apache Solr提供的一个基于java端访问solr服务器的相关接口;
提供对solr服务器进行索引增加、修改、查询、删除和索引优化相关接口;
二. 使用Solrj
需要使Solrj必须导入以下Jar包
可以从http://lucene.apache.org/solr/获取相关资源
apache-solr-solrj-3.5.0.jar
apache-solrj-core-3.5.0.jar
commons-httpclient-3.1.jar
slf4j-api-1.6.0.jar
slf4j-jdk14-1.6.1jar
commons-logging-1.1jar
三.增加索引
1) 增加索引
public void addIndex(){
try {
SolrServer server = new CommonsHttpSolrServer("http://192.168.208.119:8389/solr");
SolrInputDocument document = new SolrInputDocument();
document.addField("id",1, new Float(1.0));
document.addField("name", "First");
server.add(document);
server.commit();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
提交到Solr服务器上的数据必须是 SolrInputDocument 类型
2) JavaBean实体转换成SolrInputDocument
public class SolrBean {
@Field
String id;
@Field("path")
String cat;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCat() {
return cat;
}
public void setCat(String cat) {
this.cat = cat;
}
}
@Field无参数时,匹配当前字段,也可以自定义,字段必须在schema.xml 中的Filed中存在
addBeans(Collection beans);
addBean(Object obj);
3) SolrDocument转换成JavaBean , DocumentObjectBinder
SolrDocumentList list = server.query(new SolrQuery("*:*")).getResults();
List solrBeanList = server.getBinder().getBeans(SolrBean.class,list);
4) solr服务器异常情况处理
server.add(docs);
server.commit();
server必须commit();solr服务器才会增加索引;
<1> solr服务器正常关闭(直接将部署Solr的Tomcat执行Stop操作)
当执行在 server.add()时,将Tomcat Stop,
因为server.add()时有个进程将数据提交到Solr服务器;
所有Solr服务器正常关闭时会自动执行server.commit();
<2> solr服务器非正常关闭
当执行在 server.add()时,通过任务管理器将Tomcat结束;
在server.add()时的数据将失效;
5) 将已经存在xml文件提交到solr服务器创建索引
curl http://localhost:8983/solr/mbartists/update -H 'Content-type:text/xml;charset=utf-8' --data-binary @artists.xml
官方文档只提供了基于命令行方式提交文件格式创建索引
四、索引修改:
Solr中修改机制为删除已经存在的索引,在增加新索引;
根据唯一字段来判断索引中是否存在,存在则删除。在添加新索引;
唯一字段参见 schema.xml 中 <uniqueKey>id</uniqueKey>
五.搜索
1) 简单的查询代码
public void queryAll(){
try {
SolrServer server = new CommonsHttpSolrServer("http://192.168.208.119:8389/solr");
SolrQuery params = new SolrQuery("*:*");//查询所有
SolrDocumentList docs = server.query(params).getResults();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SolrServerException e) {
e.printStackTrace();
}
}
2) 区间查询(between)
assertEquals(3, server.query(new SolrQuery("cat:[C TO G]")).getResults().size());
assertEquals(3, server.query(new SolrQuery("popularity:[1 TO 101]")).getResults().size());
当查询数字时,数字必须存储到int类型中(将int存到String中),否则查询int类型区间时,查询结果不准确
3) 模糊查询(通配符)
* 匹配一个或任意个
assertEquals(1, server.query(new SolrQuery("id:*1")).getResults().size());
? 匹配一个
assertEquals(1, server.query(new SolrQuery("id:1?2")).getResults().size())
AND 且 以下三种写法结果一致,三种不同的方式 (AND 必须大写)
assertEquals(0,server.query(new SolrQuery("id:(001 AND 003)")).getResults().size());
assertEquals(0,server.query(new SolrQuery("id:(001 && 003)")).getResults().size());
assertEquals(0,server.query(new SolrQuery("id:001 && id:003")).getResults().size());
OR 或 以下三种写法结果一致,三种不同的方式 (OR 必须大写)
assertEquals(2,server.query(new SolrQuery("id:(001 OR 003)")).getResults().size());
assertEquals(2,server.query(new SolrQuery("id:(001 || 003)")).getResults().size());
assertEquals(2,server.query(new SolrQuery("id:001 || id:003")).getResults().size());
非 相当于Java中的 !,-*:* *:*为所有,-*:*则为非所有,即空。
assertEquals("B",server.query(new SolrQuery("-name:A")).getResults().get(0).getFieldValue("name"));
assertEquals("2",server.query(new SolrQuery("-id:1")).getResults().get(0).getFieldValue("id"));
assertEquals(0,server.query(new SolrQuery("-*:*")).getResults().size());
4) 转义字符
SolrInputDocument doc1 = new SolrInputDocument();
doc1.setField("id", "Artist:20");
doc1.setField("name", "A:B:C&*FD");
以下这样查询时,solr服务器无法识别。solr异常信息Cannot parse 'id:Artist:20': Encountered " ":" ": ""
name中的 * 将会查询出所有数据;
assertEquals("Artist:20", server.query(new SolrQuery("id:Artist:20")).getResults().get(0).getFieldValue("id"));
assertEquals("A:B:C&*FD", server.query(new SolrQuery("name:A:B:C&*FD")).getResults().get(0).getFieldValue("name"));
Solr能接受的写法
assertEquals("Artist:20", server.query(new SolrQuery("id:\\Artist:20")).getResults().get(0).getFieldValue("id"));
assertEquals("A:B:C&*FD", server.query(new SolrQuery("name:A\\:B\\:C\\&\\*FD")).getResults().get(0).getFieldValue("name"));
Solrj提供了工具类对内容进行转义ClientUtils.escapeQueryChars(String s);
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ 这些字符必须要转义
assertEquals("Artist:20", server.query(new SolrQuery("id:"+ClientUtils.escapeQueryChars("Artist:20"))).getResults().get(0).getFieldValue("id"));
assertEquals("A:B:C&*FD", server.query(new SolrQuery("name:"+ClientUtils.escapeQueryChars("A:B:C&*FD"))).getResults().get(0).getFieldValue("name"));
5) 时间查询
6) 多字段(Field)查询
7) Facet
六.删除索引
Solrj提供了接口对索引直接删除;
1) 根据id删除
server. deleteById(String id);
server.commit();
2) 删除id集合
server. deleteById(List ids);
server.commit();
(<uniqueKey>id</uniqueKey>)
精确删除
根据id,或多个id进行删除
Server. deleteById(List ids);
Server. deleteById(String id);
匹配(模糊)删除
deleteByQuery(String query);
七.优化
索引合并
八. 安全性
SolrJ没有提供访问控制接口,也就是说只要知道solr服务器信息,任何人都可以连接solr服务器来进行索引增加、修改、删除操作;
根据Apache提供的文档说明,可以用一下三种方式进行控制;
1) 修改路径
webapp=/solr path=/select 将path改成其它
2) 限制客户端IP
通过限制client端的IP来进行控制,也是基于Tomcat控制
修改conf/server.xml 在<Host>节点中添加以下代码
allow运行访问的主机,多个IP时可以用 , 分开
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1,192.168.208.119"/>
3) 使用Http认证
发表评论
-
eclispe 实用插件大全
2016-03-31 10:17 828在一个项目的完整的生命周期中,其维护费用,往往是其开发费用的 ... -
单点登录 SSO Session
2016-03-14 16:56 4050单点登录在现在的 ... -
通用权限管理设计 之 数据库结构设计
2016-01-26 13:22 2945通用权限管理设计 之 ... -
分享一个基于ligerui的系统应用案例ligerRM V2(权限管理系统)(提供下载)
2016-01-26 13:22 1479分享一个基于ligerui的系统应用案例ligerRM V2 ... -
通用权限管理设计 之 数据权限
2016-01-26 13:20 734通用权限管理设计 之 数据权限 阅读目录 前 ... -
使用RSA进行信息加密解密的WebService示例
2015-12-28 10:30 868按:以下文字涉及RS ... -
防止网站恶意刷新
2015-10-22 10:55 697import java.io.IOExcept ... -
单点登录
2015-10-19 14:24 759Cas自定义登录页面Ajax实现 博客分类: ... -
session如何在http和https之间同步
2015-09-14 09:25 2248首先说下 http>https>http ... -
基于 Quartz 开发企业级任务调度应用
2015-08-17 11:17 830Quartz 是 OpenSy ... -
Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件
2015-08-17 11:17 873今天来点实际工 ... -
Java加密技术(十)——单向认证
2015-08-13 10:13 676在Java 加密技术(九)中,我们使 ... -
Java加密技术(九)——初探SSL
2015-08-13 10:12 873在Java加密技术(八)中,我们模拟 ... -
Java加密技术(八)——数字证书
2015-08-13 10:12 885本篇的主要内容为Java证书体系的实 ... -
Java加密技术(七)——非对称加密算法最高级ECC
2015-08-13 10:12 963ECC ECC-Elliptic Curv ... -
Java加密技术(六)——数字签名算法DSA
2015-08-13 10:11 1045接下来我们介绍DSA数字签名,非对称 ... -
Java加密技术(五)——非对称加密算法的由来DH
2015-08-12 16:13 860接下来我们 ... -
Java加密技术(四)——非对称加密算法RSA
2015-08-12 16:11 1086接下来我们介绍典型的非对称加密算法—— ... -
Java加密技术(三)——PBE算法
2015-08-12 16:10 946除了DES,我们还知道有DESede( ... -
Java加密技术(二)——对称加密算法DES&AES
2015-08-12 16:09 713接下来我们介绍对称加密算法,最常用的莫 ...
相关推荐
### Solr笔记知识点详解 #### 一、Solr简介与应用背景 Apache Solr是一款流行的开源全文搜索引擎,基于Lucene库构建。它提供了一个高性能、可伸缩且易于部署的搜索平台,支持复杂的搜索功能,如全文检索、过滤、分...
Solr笔记 Solr 是 Apache 下的一个项目,是使用 Java 开发的,全文搜索服务器。Solr 是基于 Lucene 的,它可以独立运行,独立对外提供搜索和索引服务。Solr 提供了一个灵活的全文搜索解决方案,可以满足各种搜索...
Solr 是一个开源的全文搜索服务器,由Apache Lucene项目维护。它提供了高效、可扩展的搜索和分析功能,常用于大数据量的全文检索、数据分析和分布式搜索应用。本篇文章将详细探讨Solr的安装运行、添加分词器以及配置...
【Solr笔记教案】 Solr,全称Apache Solr,是一个基于Java的开源全文搜索服务器,它是Apache Lucene项目的衍生产品。Solr以其强大的搜索功能、可配置性、可扩展性和高性能而受到广泛欢迎。它能够独立部署在Servlet...
Solr 是一个流行的开源搜索引擎,提供了丰富的功能,其中包括 Facet(分面)查询,它能够帮助用户在大量数据中进行高效、多维度的筛选。Facet 查询是数据分析和信息检索中的一个重要工具,允许用户查看数据的不同...
【标题】中的关键词涉及到多个IT技术领域,包括`activemq`、`dubbo`、`linux`、`redis...这些资源的笔记整理和视频资源对于深入理解这些技术及其应用场景非常有价值,可以帮助开发者提升技术水平和解决实际问题的能力。
这些笔记整合涵盖了这些技术的重要面试题目,学习并理解这些知识点不仅有助于应对面试,还能提升你在实际工作中解决复杂问题的能力。深入研究每个技术的细节,例如它们的原理、最佳实践和常见问题,将使你在IT领域更...
### Solr 学习笔记:关键命令使用说明 Solr 是一个开源的、高性能的全文检索引擎,基于 Java 开发,常被用于大型网站的搜索系统。本文将围绕给定内容中的关键命令进行详细的解析,主要包括 Solr 的启动、集群管理、...
Solr学习笔记 Solr 是一种基于 Lucene 的搜索服务器,可以满足企业对搜索解决方案的需求。它支持层面搜索、命中醒目显示和多种输出格式,易于安装和配置,並且附带了一个基于 HTTP 的管理界面。 Solr 的主要特点...
在本篇Solr学习笔记中,我们将探讨Solr的分布式索引功能,这对于处理大量数据和实现高可用性至关重要。Solr的分布式索引能力允许我们跨越多个节点分布和处理索引过程,从而提高索引速度和查询性能。在实际应用中,这...
solr 学习笔记主要涵盖了 Solr 的基本安装与配置,以及 Solr 服务器复制的配置,这些都是初学者需要掌握的基础知识。 Solr 是一款基于 Lucene 的全文搜索引擎,广泛应用于大数据检索和文本分析。在安装 Solr 时,...
Solr学习笔记(三)——Solr客户端开发实例 在本文中,我们将深入探讨Solr客户端的开发,以便更好地理解如何在实际项目中利用Solr的强大功能。Solr是一款开源的全文搜索引擎,提供了高效的搜索和索引功能。通过Solr...
1.下载solr7.5.tar,拷贝到CentOS解压 2.启动solr 3.开启该端口防火墙 4.控制界面访问 5.创建一个核心(又名索引)(此处测试名称:core1) 6.配置数据库读取信息:DataImportHandler 7.重启solr在core1导入数据库...
Apache Solr 是一款基于 Lucene 的开源搜索服务器,专为企业级应用设计,提供高效、可伸缩、高可用和易维护的全文检索解决方案。Solr 强大的特性包括层面搜索、搜索结果高亮显示以及支持多种数据输出格式,如 XML、...