导入jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spaider_parent</artifactId>
<groupId>spaider</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>day05</artifactId>
<dependencies>
<!--solr包-->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.2</version>
</dependency>
<!--日志-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
//--------------添加部分------------------------------------------------------------------------
1 solr添加一条document
//添加一条document
@Test
public void creatIndexToSolr() throws IOException, SolrServerException {
//获取连接solr的连接对象,构造中需要传入一个地址
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");//第一步
//写入东西
SolrInputDocument solrInputFields = new SolrInputDocument();//第三步
solrInputFields.addField("id",1);
solrInputFields.addField("title","大数据12期");
solrInputFields.addField("content","这一阶段我学习了爬虫已经搜索相关的内容");
solrServer.add(solrInputFields);//第二步
solrServer.commit();
}
2 solr添加多条document
//添加多条document
@Test
public void createManyIndexToSolr() throws IOException, SolrServerException {
//获取连接solr的对象
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");//第一步
//添加document
List<SolrInputDocument> list=new ArrayList<SolrInputDocument>();//第三步
for(int i=2;i<=10;i++){
SolrInputDocument solrInputFields = new SolrInputDocument();
solrInputFields.addField("id",i);
solrInputFields.addField("title","赵佳乐老师");
solrInputFields.addField("age","18");
solrInputFields.addField("content","爬虫,检索相关,京东,慢慢网"+i);
list.add(solrInputFields);
}
solrServer.add(list);//第二步
solrServer.commit();
}
3 solr添加一个javabean
javabean实体类,实体类中要使用注释field,否则无法和solr的field进行匹配
public class User {
@Field
private String id;
@Field
private String title;
@Field
private String age;
@Field
private String content;
......}
//使用javabean写入一个对象
@Test
public void createIndexJavaBean() throws IOException, SolrServerException {
//获取连接对象
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
User user = new User("11","小川老师","28","这个阶段我学习了:mybatis,spring,springMVC");
solrServer.addBean(user);
solrServer.commit();
}
4 solr添加多个javabean
//使用addBean写入多个对象
@Test
public void createIndexManyJavaBean() throws IOException, SolrServerException {
//获取连接对象
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
List<User> beanList=new ArrayList<User>();
for(int i=12;i<22;i++){
User user = new User();
user.setId(i+"");
user.setTitle("夯夯老师");
user.setAge("48");
user.setContent("这个阶段我学习了javaweb相关知识"+i);
beanList.add(user);
}
solrServer.addBeans(beanList);
solrServer.commit();
}
//--------------------------修改,删除部分-------------------------------------------------------------------------
修改的话只要覆盖原来的id值就可以修改,此处不演示了,大家可以自己试一试很简单,在约束配置文件里已经配置了id
1 删除操作
//删除索引
@Test
public void deleteByIdToSolr() throws IOException, SolrServerException {
//获取连接对象
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
//solrServer.deleteById(1+""); //删除id=1的
//删除list集合中的id
// List<String> list= new ArrayList<String>();
// list.add("2");
// list.add("3");
// solrServer.deleteById(list);
solrServer.deleteByQuery("*:*");//里面放的是根据什么条件删除
solrServer.commit();
}
-------------------------查询部分-------------------------------------------------------------------------
下图是在约束配置schema.xml中配置的Filed
1 solr的基本查询,(返回集合)
//solr的基本查询
@Test
public void baseQueryToSolr() throws SolrServerException {
//获取连接对象
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
SolrQuery solrQuery = new SolrQuery("*:*");
QueryResponse response = solrServer.query(solrQuery);
//解析respongs
SolrDocumentList documentList = response.getResults();
for (SolrDocument document : documentList) {
Object id = document.get("id");
Object title = document.get("title");
Object age = document.get("age");
Object content = document.get("content");
System.out.println(id+"--"+title+"--"+age+"--"+content);
}
}
2 solr的javabean查询(返回封装对象)
//返回javabean的查询
@Test
public void javaBeanQueryToSolr() throws Exception {
//获取连接对象
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
SolrQuery solrQuery = new SolrQuery("*:*");
QueryResponse response = solrServer.query(solrQuery);
//解析response
List<User> userList = response.getBeans(User.class);
for (User user : userList) {
System.out.println(user);
}
}
3 复杂查询部分(通配符查询 布尔查询 相似度查询 子查询 范围查询)
由于查询的时候代码重复度比较高此处抽取一个工具类,方便后续查询的时候直接使用
抽取的公共类baseQuery
public void beseQuery(SolrQuery solrQuery) throws SolrServerException {
//获取连接对象
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
QueryResponse response = solrServer.query(solrQuery);
//解析response
List<User> userList = response.getBeans(User.class);
for (User user : userList) {
System.out.println(user);
}
}
3.1 通配符查询
//复杂查询--通配符查询 ? *
@Test
public void wildcardQueryToSolr() throws SolrServerException {
//SolrQuery solrQuery = new SolrQuery("title:赵*"); //由于此处进行了分词,分词后中文都分开了,所以得用分词的查询
SolrQuery solrQuery = new SolrQuery("content:京?");
solrQuery.setRows(200);//设置查看200条
beseQuery(solrQuery);
}
3.2 布尔查询
//复杂查询---布尔查询 AND OR NOT
@Test
public void booleanToSolr() throws SolrServerException {
SolrQuery solrQuery = new SolrQuery("(title:乐*) AND (age:18 NOT content:5* )");
beseQuery(solrQuery);
}
3.3 相似度查询
//相似度查询 ,相似度查询里面必须加~ 另外只能最多匹配2个字符,一个汉字
@Test
public void queryToSolr() throws SolrServerException {
SolrQuery solrQuery = new SolrQuery("content:javwe~");
beseQuery(solrQuery);
}
3.4 范围查询
//范围查询 To
@Test
public void queryToSolr2() throws SolrServerException {
SolrQuery solrQuery = new SolrQuery("id:[1 TO 2]"); //查出来的结果是id里面带1 或者带2的都出来
beseQuery(solrQuery);
}
3.5 子查询
//子查询:类似于布尔查询,里面加入了更多的逻辑,此处就不在演示,比较简单,套路一样
----------------------------排序操作部分---------------------------------------------------------------------------------
1 查询排序功能
//排序 setSort
@Test
public void sortToSolr() throws SolrServerException {
SolrQuery solrQuery = new SolrQuery("*:*");
solrQuery.setSort("age", SolrQuery.ORDER.desc); //desc表示从大到小
solrQuery.setRows(200);
beseQuery(solrQuery);
}
--------------------------分页操作部分------------------------------------------------------------------------------------
//分页 setStat setRows
@Test
public void limitToSolr() throws SolrServerException {
SolrQuery solrQuery = new SolrQuery("*:*");
solrQuery.setStart(1); //表示第二页,索引从0开始
solrQuery.setRows(2); //每页显示2条数据
beseQuery(solrQuery);
}
---------------------------高亮操作部分-----------------------------------------------------------------------------------
//高亮
@Test
public void hightingToSolr() throws SolrServerException {
//设置高亮Filed
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
SolrQuery solrQuery = new SolrQuery("content:javaweb");
solrQuery.setRows(200);//每页展示的数据
solrQuery.setHighlight(true); //开启高亮
solrQuery.addHighlightField("content"); //设置高亮字段
solrQuery.setHighlightSimplePre("<font color='red'>"); //设置前缀
solrQuery.setHighlightSimplePost("</font>"); //设置后缀
QueryResponse response = solrServer.query(solrQuery);
//获取高亮
/**
* 最外层的map:
* key: 文档的id值
* value: 当前文档的高亮内容
* 内层的map:
* key: 高亮的字段
* value: 高亮的内容(list一般只有一个)
*
*/
//获取高亮方法一:集合获取
Map<String, Map<String, List<String>>> map = response.getHighlighting();
for (String key : map.keySet()) {
Map<String, List<String>> stringListMap = map.get(key);
for (String fiedKey : stringListMap.keySet()) {
List<String> strings = stringListMap.get(fiedKey);
for (String string : strings) {
System.out.println(string);
}
}
}
//获取高亮方法二:对象获取
List<User> userList = response.getBeans(User.class);
for (User user : userList) {
Map<String, List<String>> map1 = map.get(user.getId());
user.setContent(map1.get("content").get(0));
System.out.println(user);
}
}