五.搜索
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认证
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认证