文档章节

SolrJ 方法及操作符

一枚Sir
 一枚Sir
发布于 2014/04/15 17:51
字数 1308
阅读 464
收藏 2

                                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认证 

© 著作权归作者所有

一枚Sir
粉丝 119
博文 209
码字总数 350904
作品 0
朝阳
架构师
私信 提问
Solr JAVA客户端SolrJ 4.9使用示例教程

简介 SolrJ是操作Solr的JAVA客户端,它提供了增加、修改、删除、查询Solr索引的JAVA接口。SolrJ针对Solr提供了Rest 的HTTP接口进行了封装,SolrJ底层是通过使用httpClient中的方法来完成Sol...

cloud-coder
2014/08/21
3.6K
0
Solr 按日期facet 差8小时问题解决

项目中使用solrj来操作solr,日期solr会自动转换: 1.solrj在提交到solr时,时间会因为时区问题减少八小时 2.solr接收到时间后,存为底层lucene索引时时间类型为long型,是正确的时区时间,但...

zachary124
2014/06/24
726
4
Apache Solr 之 使用SolrJ操作索引库

Solrj是Solr搜索服务器的一个比较基础的客户端工具,可以非常方便地与Solr搜索服务器进行交互。最基本的功能就是管理Solr索引,包括添加、更新、删除和查询等。对于一些比较基础的应用,用S...

空云万里晴
2014/12/09
6.4K
1
就是当我配置好了IK分词器后,怎么通过JAVA代码查询的时候分词还是按照空格分词?

@艮子明 你好,想跟你请教个问题:就是我在solr中配置好IK分词器后,通过solrj来查询的时候,他还是安装默认空格分词,怎么样才可以按照就跟这种效果分词,一直搜索解决方法都搞不清楚,我已...

繁华-落幕
2014/04/15
558
0
有关solr的一些不明白的地方,希望得到你的回答

@红薯 你好,想跟你请教个问题:因为没有人回答,因此来向您请教,打扰您了,希望得到你的回答 第一:solr的高亮,在使用solrJ时,resp.getHighlighting().get(id).get("content")进行高亮,...

BravoZu
2012/08/01
624
0

没有更多内容

加载失败,请刷新页面

加载更多

Less导入选项

Less 提供了CSS @import CSS规则的几个扩展,以提供更多的灵活性来处理外部文件。 语法: @import (keyword) "filename"; 以下是导入指令的相关详情: reference,使用较少的文件但不输出。 ...

凌兮洛
5分钟前
3
0
Docker下实现MySQL主从(读、写分离)同步配置

docker下实现两个(或多个)mysql容器的主、从数据库同步配置,首先要明白docker容器的相互通信关系,默认是使用的bridge模式: 也就是说,通过docker run命令创建docker容器是每个容器都有自己...

源哥L
14分钟前
8
0
一起来学Java8(三)——方法引用

在一起来学Java8(一)——函数式编程中有一个简单的函数式编程的例子: import java.util.function.Consumer;class Person { public static void sayHello(String name) { S...

猿敲月下码
33分钟前
15
0
读书笔记:深入理解ES6(十一)

第十一章 Promise与异步编程   Promise可以实现其他语言中类似Future和Deferred一样的功能,是另一种异步编程的选择,它既可以像事件和回调函数一样指定稍后执行的代码,也可以明确指示代码...

张森ZS
57分钟前
23
0
面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
今天
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部