Solr7.4.0的API(Solrj)操作

一.SolrJ的概念 solr单机版服务搭建:https://www.cnblogs.com/frankdeng/p/9615253.html solr集群版服务搭建:https://www.cnblogs.com/frankdeng/p/9597680.html SolrJ是一个API,它使用Java(或任何基于JVM的语言)编写的应用程序可以轻松地与Solr交谈。SolrJ隐藏了许多连接到Solr的细节,并允许您的应用程序通过简单的高级方法与Solr交互。SolrJ支持大多数Solr API,并且具有高度可配置性。 官方API参考文档: http://lucene.apache.org/solr/guide/7_4/using-solrj.html#using-solrj 这里使用Maven构建项目,请将以下内容放入pom.xml: 复制代码 org.apache.solr solr-solrj 7.4.0 复制代码 为了方便测试,导入单元测试依赖和日志依赖 复制代码 junit junit 4.12 test org.slf4j slf4j-nop 1.7.25 复制代码 二.SolrJ的单机连接 SolrClient是一个抽象类,下边有很多被实现的子类,HttpSolrClient - 面向以查询为中心的工作负载,但也是一个很好的通用客户端。直接与单个Solr节点通信。 不同solr版本solrj 的创建方式有所不同 复制代码 //solr4创建方式 SolrServer solrServer = new HttpSolrServer(solrUrl); //solr5创建方式,在url中指定core名称:core1 HttpSolrClient solrClient = new HttpSolrClient(solrUrl); //solr7创建方式,在url中指定core名称:core1 HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build(); 复制代码 例如: 复制代码 package com.xyg.solr; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.junit.Test; /** * Author: Mr.Deng * Date: 2018/9/10 * Desc: 测试连接客户端 */ public class testConnectionClient { @Test public void testConnectionClient(){ //设置solr客户端url地址 String solrUrl = "http://node21:8080/solr/new_core"; //创建solrClient同时指定超时时间,不指定走默认配置 HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl) .withConnectionTimeout(10000) .withSocketTimeout(60000) .build(); System.out.println(solrClient); } } 复制代码 三.SolrJ的集群连接 CloudSolrClient - 面向与SolrCloud部署的通信。使用已记录的ZooKeeper状态来发现并将请求路由到健康的Solr节点。 复制代码 package com.xyg.solrCloud; import org.apache.solr.client.solrj.impl.CloudSolrClient; import org.junit.Test; /** * Author: Mr.Deng * Date: 2018/9/10 * Desc: 测试连接客户端 */ public class ConnectionCloudSolrClient { @Test public void connectionCloudSolrClient(){ // 第一种方式:使用运行中的某一台solr节点 //final String solrUrl = "http://192.168.100.21:8983/solr"; //CloudSolrClient solrClient = new CloudSolrClient.Builder().withSolrUrl(solrUrl).build(); // 第二种方式:使用zookeeper节点连接(推荐) final String zkHost = "node21:2181,node22:2181,node23:2181/solr"; CloudSolrClient solrClient = new CloudSolrClient.Builder().withZkHost(zkHost).build(); System.out.println(solrClient); } } 复制代码 四.SolrJ的增删改查 这里测试单机版APi操作 1.创建索引 1)指定id单条创建索引 复制代码 @Test public void addIndexById() throws IOException, SolrServerException { String solrUrl = "http://node21:8080/solr/new_core"; HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build(); //创建索引文档对象 SolrInputDocument doc = new SolrInputDocument(); // 第一个参数:域的名称,域的名称必须是在schema.xml中定义的 // 第二个参数:域的值,注意:id的域不能少 doc.addField("id","1"); doc.addField("name","红豆"); doc.addField("price","1.2"); //3.将文档写入索引库中 solrClient.add(doc); solrClient.commit(); } 复制代码 2)批量创建索引 复制代码 @Test public void addIndexByListId() throws Exception { String solrUrl = "http://node21:8080/solr/new_core"; HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build(); //创建索引文档对象 SolrInputDocument doc1 = new SolrInputDocument(); doc1.addField( "id", "2"); doc1.addField( "name", "绿豆"); doc1.addField( "price", 1.8 ); SolrInputDocument doc2 = new SolrInputDocument(); doc2.addField( "id", "3" ); doc2.addField( "name", "黑豆" ); doc2.addField( "price", 2.6 ); Collection docs = new ArrayList(); docs.add(doc1); docs.add(doc2); //3.将文档写入索引库中 solrClient.add(docs); solrClient.commit(); } 复制代码 2.查询索引 1)匹配查询 复制代码 @Test public void findIndex1() throws IOException, SolrServerException { String solrUrl = "http://node21:8080/solr/new_core"; HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build(); // 创建搜索对象 SolrQuery query = new SolrQuery(); // 设置搜索条件 query.set("q","*:*"); //设置每页显示多少条 query.setRows(2); //发起搜索请求 QueryResponse response = solrClient.query(query); // 查询结果 SolrDocumentList docs = response.getResults(); // 查询结果总数 long cnt = docs.getNumFound(); System.out.println("总条数为"+cnt+"条"); for (SolrDocument doc : docs) { System.out.println("id:"+ doc.get("id") + ",name:"+ doc.get("name") + ",price:"+ doc.get("price")); } solrClient.close(); } 复制代码 2)条件过滤查询 复制代码 @Test public void findIndex2() throws IOException, SolrServerException { String solrUrl = "http://node21:8080/solr/new_core"; HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build(); //2 封装查询参数 Map queryParamMap = new HashMap(); queryParamMap.put("q", "*:*"); //3 添加到SolrParams对象,SolrParams 有一个 SolrQuery 子类,它提供了一些方法极大地简化了查询操作 MapSolrParams queryParams = new MapSolrParams(queryParamMap); //4 执行查询返回QueryResponse QueryResponse response = solrClient.query(queryParams); //5 获取doc文档 SolrDocumentList docs = response.getResults(); // 查询结果总数 long cnt = docs.getNumFound(); System.out.println("总条数为" + cnt + "条"); //[6]内容遍历 for (SolrDocument doc : docs) { System.out.println("id:" + doc.get("id") + ",name:" + doc.get("name") + ",price:" + doc.get("price")); } solrClient.close(); } 复制代码 3.更新索引 复制代码 @Test public void updateIndex() throws IOException, SolrServerException { String solrUrl = "http://node21:8080/solr/new_core"; HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build(); //创建索引文档对象 SolrInputDocument doc = new SolrInputDocument(); //把红豆价格修改为1.5 doc.addField("id","1"); doc.addField("name","红豆"); doc.addField("price","1.5"); //3.将文档写入索引库中 solrClient.add(doc); solrClient.commit(); //提交 solrClient.commit(); } 复制代码 4.删除索引 1)单一条件删除 复制代码 @Test public void deleteIndexById() throws IOException, SolrServerException { String solrUrl = "http://node21:8080/solr/new_core"; HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build(); //全删 //solrClient.deleteByQuery("*:*"); //模糊匹配删除(带有分词效果的删除) solrClient.deleteByQuery("name:红"); //指定id删除 //solrClient.deleteById("1"); solrClient.commit(); } 复制代码 2)批量条件删除 复制代码 @Test public void deleteIndexByListId() throws IOException, SolrServerException { String solrUrl = "http://node21:8080/solr/new_core"; HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build(); //通过id删除 ArrayList ids = new ArrayList(); ids.add("2"); ids.add("3"); solrClient.deleteById(ids); //[3]提交 solrClient.commit(); //[4]关闭资源 solrClient.close(); } 复制代码 五.代码报错问题 1.代码添加索引报405问题 解决方法: 在使用Tomcat部署Solr后,new_core的地址为:http://node21:8080/solr/#/new_core,但使用SolrJ进行索引的时候,应该使用http://node21:8080/solr/new_core,即无中间的#号。 2.自定义索引字段 上图报错提示未识别索引字段https://www.cnblogs.com/frankdeng/p/9615856.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信