本文共 7134 字,大约阅读时间需要 23 分钟。
登陆web控制台,从这里可以提交索引数据,支持JSON、CSV、XML、上传文件、Solr Command的方式提交索引
具体提交的数据格式以及携带参数可以参看官方文档:其实和使用web控制台提交是一样的,服务端提供了http接口,无非就是调用这个http接口罢了,至于客户端使用什么工具都是可以的。在web控制台中没有具体说明提交数据的格式,在这里会一一说明。
Java客户端应用可以使用solrj这个工具包,提交索引并查询索引。
pom.xml文件引入solrj:org.apache.solr solr-solrj 7.3.0
solrj底层使用httpclient连接solr服务器实例的。核心的API有SolrClient、SolrRequest、SolrResponse。
SolrClient的子类有如下,需要看情况使用对应的子类:
- HttpSolrClient – 与指定的一个solr节点通信的客户端,适用于单机模式
- LBHttpSolrClient –负载均衡地访问一组节点的客户端,适用于SolrCloud模式
- CloudSolrClient – 访问solrCloud的客户端,适用于SolrCloud模式,常用
- ConcurrentUpdateSolrClient –并发更新索引用的客户端
SolrClient提供了很多方法,包括增删改查。具体的SolrClient、SolrRequest、SolrResponse提供了哪些方法,可以直接查看代码。
如下一个简单的示例:package com.dalomao.framework.solr;import java.util.ArrayList;import java.util.List;import java.util.Optional;import java.util.UUID;import org.apache.solr.client.solrj.SolrClient;import org.apache.solr.client.solrj.impl.CloudSolrClient;import org.apache.solr.client.solrj.impl.HttpSolrClient;import org.apache.solr.client.solrj.impl.LBHttpSolrClient;import org.apache.solr.client.solrj.response.UpdateResponse;import org.apache.solr.common.SolrInputDocument;/** * solr各种客户端demo * 要想跑通该demo,必须启动solr实例,且创建内核mycore * 实际开发的时候,client客户端设为单例 */public class SolrJClientDemo { // baseSolrUr 示例 private static String baseSolrUrl = "http://localhost:8983/solr/"; private static String baseSolrUrl2 = "http://localhost:7001/solr/"; //指定集合/内核的URL地址 private static String baseSolrUrlWithCollection = "http://localhost:8983/solr/mycore"; //zk地址,适用于SolrCloud模式 private static String zkServerUrl = "localhost:9983"; /** * HttpSolrClient:与一个solr Server 通过http进行通信 * 适用于独立服务器模式(单机) */ public static SolrClient getHttpSolrClient(String baseSolrUrl) { return new HttpSolrClient.Builder(baseSolrUrl) .withConnectionTimeout(1000).withSocketTimeout(6000).build(); } public static SolrClient getHttpSolrClient() { return new HttpSolrClient.Builder(baseSolrUrl) .withConnectionTimeout(1000).withSocketTimeout(6000).build(); } /** * LBHttpSolrClient: 负载均衡的httpSolrClient * 负载均衡方式: 轮询给定的多个solr server url。 * 当某个url不通时,url地址会从活跃列表移到死亡列表中,用下一个地址再次发送请求。 * 对于死亡列表中的url地址,会定期(默认每隔1分钟,可设置)去检测是否变活了,再加入到活跃列表中。 * 注意: * 1、不可用于主从结构master/slave的索引场景,因为主从结构必须通过主节点来更新。 * 2、适用于SolrCloud模式,在solrCloud中可用它来进行索引更新,solrCloud中的节点会将请求转发到对应的leader。 * 3、对于SolrCloud(leader/replica),使用CloudSolrClient更好。 */ public static SolrClient getLBHttpSolrClient(String... solrUrls) { return new LBHttpSolrClient.Builder().withBaseSolrUrls(solrUrls) .build(); } public static SolrClient getLBHttpSolrClient() { return new LBHttpSolrClient.Builder() .withBaseSolrUrls(baseSolrUrl, baseSolrUrl2).build(); } /** * 访问SolrCloud集群用CloudSolrClient * CloudSolrClient 实例通过访问zookeeper得到集群中集合的节点列表, * 然后通过LBHttpSolrClient来负载均衡地发送请求。 * 注意:这个类默认文档的唯一键字段为“id”,如果不是的,通过 setIdField(String)方法指定。 */ public static SolrClient getCloudSolrClient(ListzkHosts, Optional zkChroot) { return new CloudSolrClient.Builder(zkHosts, zkChroot).build(); } public static SolrClient getCloudSolrClient() { //zk地址,可以多个(zk集群情况下) List zkHosts = new ArrayList (); zkHosts.add(zkServerUrl); //zk的根目录若有变更,则需要设置,否则直接放空(一般zk主目录不会变更) Optional zkChroot = Optional.empty(); return new CloudSolrClient.Builder(zkHosts, zkChroot).build(); } public static void main(String[] args) throws Exception { // HttpSolrClient 示例: SolrClient client = SolrJClientDemo.getHttpSolrClient(); SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", UUID.randomUUID().toString()); doc.addField("name", "HttpSolrClient"); UpdateResponse updateResponse = client.add("mycore", doc); // 记得要提交 client.commit("mycore"); System.out.println("------------ HttpSolrClient ------------"); System.out.println("add doc:" + doc); System.out.println("response: " + updateResponse.getResponse()); client.close(); // LBHttpSolrClient 示例 client = SolrJClientDemo.getLBHttpSolrClient(); doc.clear(); doc.addField("id", UUID.randomUUID().toString()); doc.addField("name", "LBHttpSolrClient"); updateResponse = client.add("mycore", doc); // 记得要提交 client.commit("mycore"); System.out.println("------------ LBHttpSolrClient ------------"); System.out.println("add doc:" + doc); System.out.println("response: " + updateResponse.getResponse()); client.close(); // CloudSolrClient 示例 client = SolrJClientDemo.getCloudSolrClient(); doc.clear(); doc.addField("id", UUID.randomUUID().toString()); doc.addField("name", "CloudSolrClient"); updateResponse = client.add("mycore", doc); // 记得要提交 client.commit("mycore"); System.out.println("------------ CloudSolrClient ------------"); System.out.println("add doc:" + doc); System.out.println("response: " + updateResponse.getResponse()); client.close(); }}
Solr还提供了java bean和对象映射的功能,类似mybatis中的ORM。
定义一个java bean:package com.dalomao.framework.solr.entity;import org.apache.solr.client.solrj.beans.Field;public class SolrProductEntity { @Field private String id; @Field private String name; @Field private String type; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; }}
定义一个测试类:
package com.dalomao.framework.solr;import com.dalomao.framework.solr.entity.SolrProductEntity;import org.apache.solr.client.solrj.SolrClient;import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.SolrServerException;import org.apache.solr.client.solrj.response.QueryResponse;import org.apache.solr.client.solrj.response.UpdateResponse;import java.io.IOException;import java.util.List;import java.util.Random;/** * 通过java bean的方式索引和查询 * 实际开发的时候,client客户端设为单例 */public class SolrClientByJavaBeanDemo { public static void main(String[] args) throws IOException, SolrServerException { //先索引数据 SolrClient client = SolrJClientDemo.getHttpSolrClient("http://localhost:7001/solr"); SolrProductEntity entity = new SolrProductEntity(); entity.setId(new Random().toString()); entity.setName("笔记本电脑"); entity.setType("计算机"); UpdateResponse response = client.addBean("mycore", entity); System.out.println(response.toString()); client.commit("mycore"); //查询 SolrQuery query = new SolrQuery("*:*"); query.addField("id"); query.addField("name"); query.setSort("id", SolrQuery.ORDER.asc); QueryResponse queryResponse = client.query("mycore", query); final Listproducts = queryResponse.getBeans(SolrProductEntity.class); System.out.println(products.toString()); }}
Solr支持结构化的数据导入,通过使用DIH。支持全量、增量数据导入。
Solr支持从关系数据库、基于http的数据源(如RSS和ATOM提要)、电子邮件存储库和结构化XML 中索引内容。 这一部分内容将会通过实际例子进行说明,请跳转转载地址:http://vgsxi.baihongyu.com/