您的位置:首页 > 其它

Solr笔记

2016-12-11 00:00 183 查看
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认证
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: