SolrJ的使用
1、添加依赖
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.myx.solr</groupId> 8 <artifactId>day11solr</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 11 12 <dependencies> 13 <!-- Junit单元测试 --> 14 <dependency> 15 <groupId>junit</groupId> 16 <artifactId>junit</artifactId> 17 <version>4.12</version> 18 </dependency> 19 <dependency> 20 <groupId>org.apache.solr</groupId> 21 <artifactId>solr-solrj</artifactId> 22 <version>4.10.2</version> 23 </dependency> 24 <!-- Solr底层会使用到slf4j日志系统 --> 25 <dependency> 26 <groupId>org.slf4j</groupId> 27 <artifactId>slf4j-log4j12</artifactId> 28 <version>1.7.22</version> 29 </dependency> 30 <dependency> 31 <groupId>commons-logging</groupId> 32 <artifactId>commons-logging</artifactId> 33 <version>1.2</version> 34 </dependency> 35 </dependencies> 36 <build> 37 <plugins> 38 <!-- java编译插件 --> 39 <plugin> 40 <groupId>org.apache.maven.plugins</groupId> 41 <artifactId>maven-compiler-plugin</artifactId> 42 <version>3.2</version> 43 <configuration> 44 <source>1.8</source> 45 <target>1.8</target> 46 </configuration> 47 </plugin> 48 </plugins> 49 </build> 50 51 52 </project>
2、创建实体类
1 package pojo; 2 3 import org.apache.solr.client.solrj.beans.Field; 4 5 public class Item { 6 @Field //表明当前字段要添加到索引库中 7 private long id; 8 @Field 9 private String title; 10 @Field 11 private long price; 12 13 public long getId() { 14 return id; 15 } 16 17 public void setId(long id) { 18 this.id = id; 19 } 20 21 public String getTitle() { 22 return title; 23 } 24 25 public void setTitle(String title) { 26 this.title = title; 27 } 28 29 public long getPrice() { 30 return price; 31 } 32 33 public void setPrice(long price) { 34 this.price = price; 35 } 36 }
3、SolrJ的增删改查
3.1使用Document向Solr添加或修改索引
1 /* 2 5 * 3 6 * 使用Document向Solr添加或修改索引*/ 4 7 @Test 5 8 public void testWrite1() throws IOException, SolrServerException { 6 9 //连接Solr服务器 7 10 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2"); 8 11 //创建Solr的输入Document 9 12 SolrInputDocument document = new SolrInputDocument(); 10 13 11 14 //添加字段 12 15 document.addField("id",15L); 13 16 document.addField("title","锤子手机,老罗会吹"); 14 17 document.addField("price",992210); 15 18 16 19 //添加Document到server 17 20 server.add(document); 18 21 19 22 //提交请求,如果id不存在,则添加新数据,如果存在,则修改数据 20 23 server.commit(); 21 24 }
3.2使用注解和JavaBean向Solr中添加或修改数据
1 /* 2 27 * 使用注解和JavaBean向Solr中添加或修改数据 3 28 * */ 4 29 @Test 5 30 public void testWrite2() throws IOException, SolrServerException { 6 31 //连接Solr服务器 7 32 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2"); 8 33 //创建一个实体对象 9 34 Item item = new Item(); 10 35 item.setId(16); 11 36 item.setTitle("oppo手机,照亮你的美"); 12 37 item.setPrice(23330); 13 38 14 39 //将对象添加到Server 15 40 server.addBean(item); 16 41 //提交请求,如果id不存在,则添加新数据,如果存在就修改数据 17 42 server.commit(); 18 43 }
3.3 SolrJ删除索引数据
1 45 /* 2 46 * SolrJ删除索引数据 3 47 * 4 48 * */ 5 49 6 50 @Test 7 51 public void testDelete() throws IOException, SolrServerException { 8 52 //连接Solr服务器 9 53 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2"); 10 54 11 55 //根据id删除数据,注意这里需要传字符串 12 56 // server.deleteById("16"); 13 57 14 58 //根据查询条件删除,参数是字符串格式,写出查询条件 15 59 server.deleteByQuery("title:Apple"); 16 60 //提交 17 61 server.commit(); 18 62 } 19 63
3.4 使用Solr查询索引,返回的是Document形式
1 /* 2 65 * 使用Solr查询索引,返回的是Document形式 3 66 * */ 4 67 @Test 5 68 public void testQueryDocument() throws SolrServerException { 6 69 //连接Solr服务器 7 70 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2"); 8 71 9 72 //创建查询对象 10 73 SolrQuery solrQuery = new SolrQuery("title:华为"); 11 74 12 75 //执行查询,获取响应 13 76 QueryResponse response = server.query(solrQuery); 14 77 15 78 //获取查询结果,本质是一个Document的集合 16 79 SolrDocumentList results = response.getResults(); 17 80 //获取总条数 18 81 System.out.println("本次共搜索到" + results.size() + "条数据"); 19 82 20 83 //遍历集合 21 84 for (SolrDocument document : results) { 22 85 System.out.println("id" + document.getFieldValue("id")); 23 86 System.out.println("title" + document.getFieldValue("title")); 24 87 System.out.println("price" + document.getFieldValue("price")); 25 88 } 26 89 }
3.5使用SolrJ查询索引,返回的是JavaBean
1 /* 2 92 * 使用SolrJ查询索引,返回的是JavaBean 3 93 * */ 4 94 5 95 @Test 6 96 public void testQueryBeans() throws SolrServerException { 7 97 //连接Solr服务器 8 98 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2"); 9 99 10 100 //创建查询对象:SolrQuery 11 101 SolrQuery query = new SolrQuery("title:华为"); 12 102 //执行查询,获取响应 13 103 QueryResponse response = server.query(query); 14 104 15 105 //获取查询结果,指定实体类的类型,返回实体类的集合 16 106 List<Item> list = response.getBeans(Item.class); 17 107 18 108 //打印总条数 19 109 System.out.println("本次共搜索到" + list.size() + "条数据"); 20 110 21 111 //遍历集合 22 112 for (Item item : list) { 23 113 System.out.println(item.getId()); 24 114 System.out.println(item.getTitle()); 25 115 System.out.println(item.getPrice()); 26 116 } 27 117 } 28 118
4 高级查询
4.1布尔查询
1 /* 2 121 * 布尔查询 3 122 * */ 4 123 @Test 5 124 public void testQueryBoolean() throws SolrServerException { 6 125 //连接Solr服务器 7 126 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2"); 8 127 9 128 //创建查询对象:SolrQuery,并且使用Boolean操作,可选OR AND ONT 10 129 SolrQuery query = new SolrQuery("title:华为 OR 小米"); 11 130 //执行查询,获取响应 12 131 QueryResponse response = server.query(query); 13 132 14 133 //获取查询结果,指定实体类的类型,返回实体类的集合 15 134 List<Item> list = response.getBeans(Item.class); 16 135 17 136 //打印总条数 18 137 System.out.println("本次共搜索到" + list.size() + "条数据"); 19 138 20 139 //遍历集合 21 140 for (Item item : list) { 22 141 System.out.println(item.getId()); 23 142 System.out.println(item.getTitle()); 24 143 System.out.println(item.getPrice()); 25 144 } 26 145 } 27 146
4.2 相似度查询
1 148 /* 2 149 * 相似度查询 3 150 * */ 4 151 @Test 5 152 public void testFuzzyQuery() throws SolrServerException { 6 153 //连接Solr服务器 7 154 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2"); 8 155 9 156 //相似度查询,与lucene的相似度查询一致,允许的编辑举例是0-2,默认是2 10 157 SolrQuery query = new SolrQuery("title:applk~"); 11 158 //执行查询,获取响应 12 159 QueryResponse response = server.query(query); 13 160 14 161 //获取查询结果,指定实体类的类型,返回实体类的集合 15 162 List<Item> list = response.getBeans(Item.class); 16 163 17 164 //打印总条数 18 165 System.out.println("本次共搜索到" + list.size() + "条数据"); 19 166 20 167 //遍历集合 21 168 for (Item item : list) { 22 169 System.out.println(item.getId()); 23 170 System.out.println(item.getTitle()); 24 171 System.out.println(item.getPrice()); 25 172 } 26 173 } 27 174
4.3 范围查询,闭区间
1 176 /* 2 177 * 范围查询,闭区间 3 178 * */ 4 179 @Test 5 180 public void testScoreQuery() throws SolrServerException { 6 181 //连接Solr服务器 7 182 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2"); 8 183 9 184 //创建查询对象 10 185 SolrQuery query = new SolrQuery("price:[100000 TO 200000]"); 11 186 //执行查询,获取响应 12 187 QueryResponse response = server.query(query); 13 188 14 189 //获取查询结果,指定实体类的类型,返回实体类的集合 15 190 List<Item> list = response.getBeans(Item.class); 16 191 17 192 //打印总条数 18 193 System.out.println("本次共搜索到" + list.size() + "条数据"); 19 194 20 195 //遍历集合 21 196 for (Item item : list) { 22 197 System.out.println(item.getId()); 23 198 System.out.println(item.getTitle()); 24 199 System.out.println(item.getPrice()); 25 200 } 26 201 } 27 202
4.4 使用SolrJ查询索引,并且设置排序
1 /* 2 205 * 使用SolrJ查询索引,并且设置排序 3 206 * */ 4 207 5 208 @Test 6 209 public void testSortedQuery() throws SolrServerException { 7 210 //连接Solr服务器 8 211 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2"); 9 212 10 213 //创建查询对象 11 214 SolrQuery query = new SolrQuery("title:华为"); 12 215 13 216 //设置查询的排序参数,参数:排序的字段名、排序方式 14 217 query.setSort("price", SolrQuery.ORDER.desc); 15 218 16 219 //执行查询,获取响应 17 220 QueryResponse response = server.query(query); 18 221 19 222 //获取查询结果,指定实体类的类型,返回实体类的集合 20 223 List<Item> list = response.getBeans(Item.class); 21 224 22 225 //打印总条数 23 226 System.out.println("本次共搜索到" + list.size() + "条数据"); 24 227 25 228 //遍历集合 26 229 for (Item item : list) { 27 230 System.out.println(item.getId()); 28 231 System.out.println(item.getTitle()); 29 232 System.out.println(item.getPrice()); 30 233 } 31 234 }
4.5 查询索引并且分页
1 /* 2 237 * 查询索引并且分页 3 238 * */ 4 239 @Test 5 240 public void testPageQuery() throws SolrServerException { 6 241 //准备分页参数 7 242 int pageNum = 2; //查询的页数 8 243 int pageSize = 5; // 每页显示条数 9 244 int start = (pageNum - 1) * pageSize;//当前页的起始条数 10 245 11 246 //连接Solr服务器 12 247 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2"); 13 248 14 249 //创建查询对象 15 250 SolrQuery query = new SolrQuery("title:手机"); 16 251 17 252 //设置查询的排序参数,参数:排序的字段名、排序方式 18 253 query.setSort("price", SolrQuery.ORDER.desc); 19 254 20 255 //设置分页信息到查询对象中 21 256 query.setStart(start); 22 257 query.setRows(5); 23 258 24 259 //执行查询,获取响应 25 260 QueryResponse response = server.query(query); 26 261 27 262 //获取查询结果,指定实体类的类型,返回实体类的集合 28 263 List<Item> list = response.getBeans(Item.class); 29 264 30 265 //打印总条数 31 266 System.out.println("本次共搜索到" + list.size() + "条数据"); 32 267 33 268 //遍历集合 34 269 for (Item item : list) { 35 270 System.out.println(item.getId()); 36 271 System.out.println(item.getTitle()); 37 272 System.out.println(item.getPrice()); 38 273 } 39 274 }
4.6 查询索引并且高亮
1 /* 2 278 * 查询索引并且高亮 3 279 * */ 4 280 @Test 5 281 public void testHighlightQuery() throws SolrServerException { 6 282 //连接Solr服务器 7 283 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2"); 8 284 9 285 //创建查询对象 10 286 SolrQuery query = new SolrQuery("title:华为"); 11 287 12 288 //设置高亮标签 13 289 query.setHighlightSimplePre("<em>"); 14 290 query.setHighlightSimplePost("</em>"); 15 291 16 292 //高亮字段 17 293 query.addHighlightField("title"); 18 294 19 295 //执行查询,获取响应 20 296 QueryResponse response = server.query(query); 21 297 22 298 // 解析高亮响应结果,是一个Map 23 299 // 外层的Map:它的键是文档的id,值是这个文档的其它高亮字段,又是一个Map 24 300 // 内存的Map:是其它高亮字段,键是其它字段的名称,值是这个字段的值,这个值是一个List 25 301 Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); 26 302 //获取查询结果,指定实体类的类型,返回实体类的集合 27 303 List<Item> list = response.getBeans(Item.class); 28 304 29 305 //打印总条数 30 306 System.out.println("本次共搜索到" + list.size() + "条数据"); 31 307 32 308 //遍历集合 33 309 for (Item item : list) { 34 310 long id = item.getId(); 35 311 System.out.println("id: " + id); 36 312 // 这里ID是long类型,与集合的键不匹配,所以我们需要把id转为String类型,再get 37 313 System.out.println("title: " + highlighting.get(id+"").get("title").get(0)); 38 314 System.out.println("price: " + item.getPrice()); 39 315 40 316 } 41 317 }