导入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); } }